为什么要开long long
查看原帖
为什么要开long long
469496
享受Codingg楼主2024/7/17 10:47

为什么这个代码不开longlong会错,开了就AC了?


#include <bits/stdc++.h>
#define int long long
using namespace std;
int logn[100005];
void init(){
	logn[1]=0;
	logn[2]=1;
	for (int i=3;i<=100000;i++){
		logn[i]=logn[i/2]+1;
	}
}
int t;
int n,m,q,num;
int a[200005];
struct edge{
	int u,v,w;
	bool operator <(edge &other){
		return w<other.w;
	}
}e[200005];
int head[200005],to[400005],nxt[400005],cnt;
void addedge(int u,int v){
	to[++cnt]=v;
	nxt[cnt]=head[u];
	head[u]=cnt;
}
int fa[200005];
int find (int x){
	if (fa[x]==x){
		return x;
	}else{
		return fa[x]=find(fa[x]);
	}
}
int f[200005][22];
int dep[200005];
void dfs(int u,int fa){
	f[u][0]=fa;
	dep[u]=dep[fa]+1;
	for (int i=1;i<=20;i++){
		f[u][i]=f[f[u][i-1]][i-1];
	}
	for (int i=head[u];~i;i=nxt[i]){
		int v=to[i];
		if (v==fa){
			continue;
		}
		dfs(v,u);
	}
}
int lca(int x,int y){
	if (dep[x]<dep[y]){
		swap(x,y);
	}
	for (int i=dep[x]-dep[y],k=0;i;i>>=1,k++){
		if (i&1){
			x=f[x][k];
		}
	}
	if (x==y){
		return x;
	}
	for (int i=20;i>=0;i--){
		if (f[x][i]!=f[y][i]){
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
int st[100005][22];
signed main(){
	init();
	scanf ("%lld",&t);
	while (t--){
		memset(head,-1,sizeof(head));
		cnt=0;
		scanf ("%lld%lld%lld",&n,&m,&q);
		num=n;
		for (int i=1;i<=2*n-1;i++){
			fa[i]=i;
		}
		for (int i=1;i<=m;i++){
			scanf ("%lld%lld",&e[i].u,&e[i].v);
			e[i].w=i;
		}
		sort(e+1,e+1+m);
		for (int i=1;i<=m;i++){
			int fu=find(e[i].u);
			int fv=find(e[i].v);
			if (fu!=fv){
				fa[fu]=++num;
				fa[fv]=num;
				a[num]=e[i].w;
				addedge(fu,num);
				addedge(num,fu);
				addedge(fv,num);
				addedge(num,fv);
			}
			if (num==2*n-1){
				break;
			}
		}
		dfs(num,0);
		for (int i=1;i<=n-1;i++){
			st[i][0]=a[lca(i,i+1)];
		}
		for (int j=1;j<=20;j++){
			for (int i=1;i+(1<<j)-1<=n-1;i++){
				st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
			}
		}
		while (q--){
			int l,r;
			scanf ("%lld%lld",&l,&r);
			if (l==r){
				printf ("0 ");
				continue;
			}
			r--;
			int s=logn[r-l+1];
			printf ("%lld ",max(st[l][s],st[r-(1<<s)+1][s]));
		}
		printf ("\n");
	}
}

2024/7/17 10:47
加载中...