社区讨论

校内OJ直接过了,但洛谷WA,不知道数据哪儿下,求hack

P7353[2020-2021 集训队作业] Tom & Jerry参与者 3已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@mhj2pkq8
此快照首次捕获于
2025/11/03 19:45
4 个月前
此快照最后确认于
2025/11/03 19:45
4 个月前
查看原帖
WA on 14 22 23 24,都是 No 判为 Yes。 自己对排 n=30,q 拉满都一直没拍出来/yun
代码有点屎CPP
#include<bits/stdc++.h>
using namespace std;
#pragma GCC diagnostic ignored "-Wsign-compare"
namespace estidi{
	const int mn=100003;
	unordered_set<int>son[mn];
	vector<int>sons[mn],te[mn],bcc[mn],rsons[mn];
	vector<bool>rcango[mn],can[mn];
	stack<int>s;
	int n,f[23][mn],d[mn],dcnt,dfn[mn],low[mn],b[mn],bccnt,hd[mn],bccfa[mn],evdf[mn],evdg[mn],evdrg[mn];
	bool ish[mn],cap[mn],wk[mn],vis[mn],bccevd[mn],rcf[mn],rcg[mn],rcrg[mn];
	void get(int x,int fa){
		f[0][x]=fa;
		d[x]=d[fa]+1;
		s.push(x);
		dcnt++;
		dfn[x]=dcnt;
		low[x]=dcnt;
		cap[x]=0;
		for(int i=0;i<sons[x].size();i++){
			if(dfn[sons[x][i]])
				low[x]=min(low[x],dfn[sons[x][i]]);
			else{
				te[x].push_back(sons[x][i]);
				get(sons[x][i],x);
				low[x]=min(low[x],low[sons[x][i]]);
				if(dfn[x]==low[sons[x][i]]){
					bccnt++;
					while(s.top()!=sons[x][i]){
						bcc[bccnt].push_back(s.top());
						b[s.top()]=bccnt;
						s.pop();
					}
					bcc[bccnt].push_back(s.top());
					b[s.top()]=bccnt;
					s.pop();
					bcc[bccnt].push_back(x);
					hd[bccnt]=x;
					ish[x]=1;
				}
			}
		}
	}
	void getbccst(int i){
		if(bcc[i].size()<=sqrt(n)){
			for(int j=0;j<bcc[i].size();j++){
				cap[bcc[i][j]]=1;
				for(int k=0;k<bcc[i].size();k++)
					cap[bcc[i][j]]&=(bcc[i][j]==bcc[i][k]||son[bcc[i][j]].find(bcc[i][k])!=son[bcc[i][j]].end());
//				cerr<<bcc[i][j]<<":"<<cap[bcc[i][j]]<<endl;
			}
			bccevd[i]=1;
			for(int j=0;j<bcc[i].size();j++)
				bccevd[i]&=(!cap[bcc[i][j]]);
			return;
		}
		for(int j=0;j<bcc[i].size();j++)
			wk[bcc[i][j]]=1;
		for(int j=0;j<bcc[i].size();j++){
			int now=bcc[i].size()-1;
			for(int k=0;k<sons[bcc[i][j]].size();k++)
				if(wk[sons[bcc[i][j]][k]]&&vis[sons[bcc[i][j]][k]]==0){
					vis[sons[bcc[i][j]][k]]=1;
					now--;
				}
			if(!now)
				cap[bcc[i][j]]=1;
			else
				cap[bcc[i][j]]=0;
			for(int k=0;k<sons[bcc[i][j]].size();k++)
				vis[sons[bcc[i][j]][k]]=0;
		}
		bccevd[i]=1;
		for(int j=0;j<bcc[i].size();j++){
			wk[bcc[i][j]]=0;
			bccevd[i]&=(!cap[bcc[i][j]]);
		}
	}
	void build(int x){
		bool fst=(!cap[x]);
		for(int i=0;i<te[x].size();i++){
			if(b[x]!=b[te[x][i]]){
				bccfa[b[te[x][i]]]=b[x];
				rsons[b[x]].push_back(b[te[x][i]]);
				rsons[b[te[x][i]]].push_back(b[x]);
				getbccst(b[te[x][i]]);
				rcango[b[x]].push_back(!cap[x]);
				rcango[b[te[x][i]]].push_back(fst);
				can[b[x]].push_back(fst);
				can[b[te[x][i]]].push_back(!cap[x]);
			}
			build(te[x][i]);
		}
	}
	void getans(int x,int fa){
		rcf[x]=false;
		evdf[x]=bccevd[x]*2;
		for(int i=0;i<rsons[x].size();i++){
			if(rsons[x][i]==fa){
				if(can[x][i]){
					rcf[x]=true;
					if(evdf[x]==0)
						evdf[x]=1;
				}
				continue;
			}
			getans(rsons[x][i],x);
			rcf[x]|=(rcf[rsons[x][i]]||rcango[x][i]);
			if(evdf[x]==2)
				continue;
			if(evdf[rsons[x][i]]==2)
				evdf[x]=2;
			if(evdf[x]==1&&(evdf[rsons[x][i]]==1||rcango[x][i]))
				evdf[x]=2;
			if((evdf[rsons[x][i]]==1||rcango[x][i])&&can[x][i])
				evdf[x]=2;
			if(evdf[x]==2)
				continue;
			if(evdf[rsons[x][i]]==1||rcango[x][i])
				evdf[x]=1;
		}
	}
	void getdans(int x,int fa){
		int now=0,pre=0,nowst=0;
		vector<int>sufevdfm;
		for(int i=0;i<=rsons[x].size();i++)
			sufevdfm.push_back(0);
		for(int i=rsons[x].size()-1;i>=0;i--){
			if(rsons[x][i]==fa){
				sufevdfm[i]=nowst;
				continue;
			}
			now+=rcf[rsons[x][i]];
			if(evdf[rsons[x][i]]==2)
				nowst=2;
			if(nowst==1&&(evdf[rsons[x][i]]==1||rcango[x][i]))
				nowst=2;
			if((evdf[rsons[x][i]]==1||rcango[x][i])&&can[x][i])
				nowst=2;
			if(nowst!=2&&(evdf[rsons[x][i]]==1||rcango[x][i]))
				nowst=1;
			sufevdfm[i]=nowst;
		}
		nowst=0;
		for(int i=0;i<rsons[x].size();i++){
			if(rsons[x][i]==fa)
				continue;
			now-=rcf[rsons[x][i]];
//			cerr<<x<<" "<<rcg[x]<<" "<<now<<" "<<pre<<" "<<can[x][i]<<endl;
			rcrg[rsons[x][i]]=rcg[x]||now||pre;
			rcg[rsons[x][i]]=rcrg[rsons[x][i]]||can[x][i];
			evdrg[rsons[x][i]]=min(2,sufevdfm[i+1]+nowst+evdg[x]);
			evdg[rsons[x][i]]=evdrg[rsons[x][i]];
			if(bccevd[rsons[x][i]]||(evdrg[rsons[x][i]]==1&&rcango[x][i]))
				evdg[rsons[x][i]]=2;
			getdans(rsons[x][i],x);
			pre+=rcf[rsons[x][i]];
			if(evdf[rsons[x][i]]==2)
				nowst=2;
			if(nowst==1&&nowst==1)
				nowst=2;
			if((evdf[rsons[x][i]]==1||rcango[x][i])&&can[x][i])
				nowst=2;
			if(nowst!=2&&(evdf[rsons[x][i]]==1||rcango[x][i]))
				nowst=1;
		}
	}
	bool tryloop(int x,int fa,int bl){
		for(int i=0;i<rsons[x].size();i++){
			int tg=hd[rsons[x][i]];
			if(rsons[x][i]==bccfa[x])
				tg=hd[x];
			if(rsons[x][i]==fa||tg==bl)
				continue;
			if(rcango[x][i]||tryloop(rsons[x][i],x,bl))
				return true;
		}
		return false;
	}
	int getevd(int x,int fa,int bl){
		if(bccevd[x])
			return 2;
		int nowst=0;
		for(int i=0;i<rsons[x].size();i++){
			int tg=hd[rsons[x][i]];
			if(rsons[x][i]==bccfa[x])
				tg=hd[x];
			if(rsons[x][i]==fa||tg==bl)
				continue;
			int st=getevd(rsons[x][i],x,bl);
//			cerr<<x<<" "<<fa<<" "<<rcango[x][i]<<" "<<can[x][i]<<endl;
			if(st==2)
				return 2;
			if((st==1||rcango[x][i])&&nowst==1)
				return 2;
			if((st==1||rcango[x][i])&&can[x][i])
				return 2;
			if(st==1||rcango[x][i])
				nowst=1;
		}
		return nowst;
	}
	int kfa(int x,int k){
		for(int i=17;i>=0;i--)
			if(k&(1<<i))
				x=f[i][x];
		return x;
	}
	int lca(int x,int y){
		if(d[x]>d[y])
			swap(x,y);
		y=kfa(y,d[y]-d[x]);
		if(x==y)
			return x;
		for(int i=17;i>=0;i--)
			if(f[i][x]!=f[i][y]){
				x=f[i][x];
				y=f[i][y];
			}
		return f[0][x];
	}
	int main(){
		int m,q,x,y;
		scanf("%d%d%d",&n,&m,&q);
		for(int i=1;i<=m;i++){
			scanf("%d%d",&x,&y);
			son[x].insert(y);
			son[y].insert(x);
			sons[x].push_back(y);
			sons[y].push_back(x);
		}
		get(1,0);
		assert(s.size()==1);
//		cerr<<"asd";
		for(int i=1;i<=17;i++)
			for(int j=1;j<=n;j++)
				f[i][j]=f[i-1][f[i-1][j]];
//		cerr<<"asd";
		cap[1]=1;
//		for(int i=1;i<=n;i++)
//			cerr<<i<<" "<<b[i]<<" "<<ish[i]<<endl;
//		cerr<<"asd";
		build(1);
//		for(int i=0;i<=bccnt;i++)
//			cerr<<i<<" "<<bccevd[i]<<endl;
//		cerr<<"asd";
		getans(0,-1);
//		cerr<<"asd";
		getdans(0,-1);
//		cerr<<"asd";
		int gans=getevd(0,-1,-1);
//		cerr<<"asd";
//		for(int i=0;i<=bccnt;i++)
//			for(int j=0;j<rsons[i].size();j++)
//				cerr<<i<<" "<<rsons[i][j]<<" "<<can[i][j]<<" "<<rcango[i][j]<<endl;
//		for(int i=1;i<=bccnt;i++)
//			cerr<<i<<" "<<rsons[i].size()<<"|"<<tryloop(1,-1,hd[i])<<" "<<getevd(1,-1,hd[i])<<" "<<rcrg[i]<<" "<<evdrg[i]<<endl;
		while(q--){
			scanf("%d%d",&x,&y);
			swap(x,y);
			int nowans=0;
			if(ish[y]){
//				cerr<<x<<" "<<y<<" "<<lca(x,y)<<" "<<b[y]<<"\t\t "<<tryloop(b[x],-1,y)<<" "<<getevd(b[x],-1,y)<<" "<<(lca(x,y)==y&&b[x]!=b[y]?rcf[b[kfa(x,d[x]-d[y]-1)]]:rcg[b[y]])<<" "<<(lca(x,y)==y&&b[x]!=b[y]?evdf[b[kfa(x,d[x]-d[y]-1)]]:evdg[b[y]])<<endl;
				if(lca(x,y)==y&&b[x]!=b[y])
					if(rcf[b[kfa(x,d[x]-d[y]-1)]])
						nowans=gans;
					else
						nowans=evdf[b[kfa(x,d[x]-d[y]-1)]];
				else
					if(rcg[b[y]])
						nowans=gans;
					else
						nowans=evdg[b[y]];
			}
			else
				nowans=gans;
			if(nowans==2)
				printf("No\n");
			else
				printf("Yes\n");
		}
		return 0;
	}
}
int main(){
//	freopen("soldier.in","r",stdin);
//	freopen("soldier.out","w",stdout);
	estidi::main();
	return 0;
}

回复

10 条回复,欢迎继续交流。

正在加载回复...