为什么这个程序会全TLE
查看原帖
为什么这个程序会全TLE
1710362
Jomo1203楼主2025/7/30 21:23

天生不爱用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能告诉我到底哪里出了问题吗?

2025/7/30 21:23
加载中...