天生不爱用vector
为什么这个程序提交上去会全部TLE啊?没见过这么离谱的情况,我将数据下载回来自己试过了,绝对不会超时啊。
TLE记录
#include<iostream>
using namespace std;
const int maxn=5e5+1;
int n,m,s;
int fa[maxn];
int find(int u){
if(u==fa[u]) return u;
return fa[u]=find(fa[u]);
}
void merge(int u,int v){
u=find(u);
v=find(v);
fa[v]=u;
}
struct Edge{
int to,nxt;
}e[maxn<<1];
int hd[maxn],cnt=0;
void adde(int u,int v){
cnt++;
e[cnt].to=v;
e[cnt].nxt=hd[u];
hd[u]=cnt;
}
struct Query{
int to,id,nxt;
}q[maxn<<1];
int h2[maxn],c2=0;
void addq(int u,int v,int id){
c2++;
q[c2].to=v;
q[c2].id=id;
q[c2].nxt=h2[u];
h2[u]=c2;
}
bool vis[maxn];
int ans[maxn];
int dfs(int u){
vis[u]=1;
for(int i=hd[u];i;i=e[i].nxt){
int v=e[i].to;
if(vis[v]) continue;
dfs(v);
merge(u,v);
}
for(int i=h2[u];i;i=q[i].nxt){
int v=q[i].to;
if(vis[v]){
int id=q[i].id;
ans[id]=find(v);
}
}
}
int main(){
scanf("%d %d %d",&n,&m,&s);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1,u,v;i<n;i++){
scanf("%d %d",&u,&v);
adde(u,v);
adde(v,u);
}
for(int i=1,u,v;i<=m;i++){
scanf("%d %d",&u,&v);
addq(u,v,i);
addq(v,u,i);
}
dfs(s);
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}
妥协之后改了用vector的版本,结果呢,满屏RE
RE记录
#include<iostream>
#include<vector>
using namespace std;
const int maxn=5e5+1;
typedef pair<int,int> pii;
int n,m,s;
int fa[maxn];
int find(int x){
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
void merge(int u,int v){
u=find(u);
v=find(v);
fa[v]=u;
}
vector<int> adj[maxn];
vector<pii> query[maxn];
bool vis[maxn];
int ans[maxn];
int dfs(int u){
vis[u]=1;
for(int v:adj[u])
if(!vis[v]){
dfs(v);
merge(u,v);
}
for(const auto&q:query[u]){
int v=q.first;
if(vis[v]){
int id=q.second;
ans[id]=find(v);
}
}
}
int main(){
scanf("%d %d %d",&n,&m,&s);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1,u,v;i<n;i++){
scanf("%d %d",&u,&v);
adj[u].push_back(v);
adj[v].push_back(u);
}
for(int i=1,u,v;i<=m;i++){
scanf("%d %d",&u,&v);
if(u==v) ans[i]=u;
else{
query[u].push_back({v,i});
query[v].push_back({u,i});
}
}
dfs(s);
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}
有dalao能告诉我到底哪里出了问题吗?