RE,且洛谷IDE上RE,本机和其他评测网站均AC
查看原帖
RE,且洛谷IDE上RE,本机和其他评测网站均AC
436102
nod1212楼主2024/5/9 21:03
#include <bits/stdc++.h>
using namespace std;
int n=0,m=0;
vector<int> gra[300038];
vector<int> w[300038];
vector<int> tre[300038];
vector<int> tw[300038];
int lca[300038][17];
int lw[300038][17];
int root[300038]={0};
int dep[300038];
struct nod{
	int number;
	int distance;
	int father;
};
bool operator < (nod a,nod b){return a.distance==b.distance ? a.number<b.number : a.distance>b.distance;}
map<int,nod> ma;
set<nod> se;
nod x;
char c;
map<int,nod>::iterator xx;
int inf=1e9;
int main(){
	c=getchar();
	while(c>47&&c<58){n=(n<<1)+(n<<3)+(c^48);c=getchar();}
	c=getchar();
	while(c>47&&c<58){m=(m<<1)+(m<<3)+(c^48);c=getchar();}
	for(int i=1;i<=m;i++){
		int x=0,y=0,z=0;
		c=getchar();
		while(c>47&&c<58){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
		c=getchar();
		while(c>47&&c<58){y=(y<<1)+(y<<3)+(c^48);c=getchar();}
		c=getchar();
		while(c>47&&c<58){z=(z<<1)+(z<<3)+(c^48);c=getchar();}
		gra[x].push_back(y);
		gra[y].push_back(x);
		w[x].push_back(-z);
		w[y].push_back(-z);
	}
	for(int kkk=1;kkk<=n;kkk++){
		if(root[kkk]==0){
			x.number=kkk;
			x.distance=0;
			x.father=0;
			ma.insert(make_pair(kkk,x));
			se.insert(x);
			dep[kkk]=1;
			root[kkk]=kkk;
			while(!se.empty()){
				nod pcur=*se.begin();
				int pc=pcur.number;
				root[pc]=kkk;
				se.erase(se.begin());
				ma.erase(ma.find(pc));
				if(pcur.father!=0){
					int fa=pcur.father;
					lca[pc][0]=fa;
					lw[pc][0]=pcur.distance;
					tre[fa].push_back(pc);
					tw[fa].push_back(pcur.distance);
					dep[pc]=dep[fa]+1;
				}
				else{
					lca[pc][0]=pc;
					lw[pc][0]=inf;
				}
				for(int i=0;i<gra[pc].size();i++){
					int ch=gra[pc][i];
					if(root[ch]==0){
						xx=ma.find(ch);
						if(xx!=ma.end()){
							x=xx->second;
							if(x.distance<w[pc][i]){
								se.erase(se.find(x));
								ma.erase(ma.find(x.number));
								x.distance=w[pc][i];
								x.father=pc;
								ma.insert(make_pair(x.number,x));
								se.insert(x);
							}
						}
						else{
							x.number=ch;
							x.distance=w[pc][i];
							x.father=pc;
							ma.insert(make_pair(ch,x));
							se.insert(x);
						}
					}
				}
			}		
		}
	}
	for(int j=1;j<=16;j++){
		for(int i=1;i<=n;i++){
			lca[i][j]=lca[lca[i][j-1]][j-1];
			lw[i][j]=min(lw[i][j-1],lw[lca[i][j-1]][j-1]);
		} 
	} 
	int q=0;
	c=getchar();
	while(c>47&&c<58){q=(q<<1)+(q<<3)+(c^48);c=getchar();}
    for(int kkk=1;kkk<=q;kkk++){
    	int s=0,t=0;
    	c=getchar();
		while(c>47&&c<58){s=(s<<1)+(s<<3)+(c^48);c=getchar();}
		c=getchar();
		while(c>47&&c<58){t=(t<<1)+(t<<3)+(c^48);c=getchar();}
    	if(root[s]!=root[t]){
    		printf("impossible\n");
    		continue;
		}
		else{
			int a=s,b=t;
			int pans=inf;
			if(dep[a]<dep[b]){swap(a,b);}
			if(dep[a]>dep[b]){
				for(int i=16;i>=0;i--){
					if(dep[lca[a][i]]>dep[b]){
						pans=min(pans,lw[a][i]);
						a=lca[a][i];
					}
				}
				pans=min(pans,lw[a][0]);
				a=lca[a][0];
			}
			if(a!=b){
				for(int i=16;i>=0;i--){
					if(lca[a][i]!=lca[b][i]){
						pans=min(pans,lw[a][i]);
						pans=min(pans,lw[b][i]);
						a=lca[a][i];
						b=lca[b][i];
					}
				}
				pans=min(pans,lw[a][0]);
				pans=min(pans,lw[b][0]);
			}
			printf("%d\n",-pans);
		}
	} 
    return 0;
}

数组大小在1e6,2e6,3e6,1e7时均RE

2024/5/9 21:03
加载中...