玄关求解
查看原帖
玄关求解
1062532
MinLand楼主2024/11/11 14:27
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

namespace awa {
	const int N=1e5+114;
	const int T=N,U=0,F=-N;
	int c,t;
	int n,m,ans;
	int fa[N+10];
	bool book[2*N+10];

	int fnd(int x) {
		int re=0;
		if(x==T||x==F) return x;
		if(book[n-x]||x==U) return U;
		if(book[x+n]) return T;
		if(x>0) {
			if(x==fa[x]) return x;
			book[n+x]=1;
			re=fnd(fa[x]);
			book[n+x]=0;
		}
		if(x<0) {
			if(x==-fa[-x]) return x;
			book[n+x]=1;
			re=fnd(-fa[-x]);
			book[n+x]=0;
		}
		return re;
	}

	void solve() {
		cin>>c>>t;
		while(t--) {
			ans=0;
			cin>>n>>m;
			for(int i=1; i<=n; i++)
				fa[i]=i;
			for(int i=1; i<=m; i++) {
				char op;
				int x;
				cin>>op>>x;
				if(op=='T')
					fa[x]=T;
				if(op=='U')
					fa[x]=U;
				if(op=='F')
					fa[x]=F;
				if(op=='+') {
					int y;
					cin>>y;
					fa[x]=y;
				}
				if(op=='-') {
					int y;
					cin>>y;
					fa[x]=-y;
				}
			}
			for(int i=1; i<=n; i++) {
				if(fnd(i)==U) ans++;
			}
			cout<<ans<<endl;
		}
	}
}

int main() {
	awa::solve();
	return 0;
}

上面这个得分40

还有一个得分0的record

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
using namespace std;

namespace awa {
	const int N=1e5+114;
	const int T=N,U=0,F=-N;
	int c,t;
//	set s1,s2;
	int n,m,ans;
	int fa[N];
	bool book[2*N];

	int fnd(int x) {
		int re=0;
		if(book[x+n]) return T;
		if(book[n-x]||x==U) return U;
		if(x==T||x==F) return x;
		if(x>0) {
			if(x==fa[x]) return x;
			book[n+x]=1;
			fa[x]=re=fnd(fa[x]);
			book[n+x]=0;
		}
		if(x<0) {
			if(x==-fa[-x]) return x;
			book[n+x]=1;
			fa[-x]=re=fnd(-fa[-x]);
			book[n+x]=0;
		}
		return re;
	}

	void init() {
		ans=0;
		scanf("%d%d",&n,&m);
		for(int i=1; i<=n; i++)
			fa[i]=i;
	}

	void solve() {
		cin>>c>>t;
		while(t--) {
			init();
			for(int i=1; i<=m; i++) {
				char op;
				int x;
				cin>>op>>x;
				if(op=='T')
					fa[x]=T;
				if(op=='U')
					fa[x]=U;
				if(op=='F')
					fa[x]=F;
				if(op=='+') {
					int y;
					cin>>y;
					fa[x]=y;
				}
				if(op=='-') {
					int y;
					cin>>y;
					fa[x]=-y;
				}
			}
			for(int i=1; i<=n; i++) {
				if(fnd(i)==U) ans++;
			}
			cout<<ans<<endl;
		}
	}
}

int main() {
	awa::solve();
	return 0;
}

跟第一篇题解到底差在哪里了QAQ。 还有为什么第一个就高点,问题出在哪里求解

2024/11/11 14:27
加载中...