我的 T2是怎么死的?
  • 板块学术版
  • 楼主Obviathy
  • 当前回复3
  • 已保存回复4
  • 发布时间2023/11/18 18:43
  • 上次更新2023/11/18 20:02:04
查看原帖
我的 T2是怎么死的?
343342
Obviathy楼主2023/11/18 18:43

RT,赛时一直不过第四个大样例

#include<bits/stdc++.h>
#define ll long long
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define file(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
#define inf 0x3f3f3f3f
#define endl '\n'
using namespace std;
const int N = 2e5+10;
int n,m;
int fa[N],val[N],siz[N],ans;
bool vis[N],use[N];
int t,f,u;
inline int Find(int x){
	if(x == fa[x])return x;
	return fa[x] = Find(fa[x]);
}
inline void add(int x,int y){
	int a = Find(x),b = Find(y);
	if(a == b)return ;
	fa[b] = a,siz[a] += siz[b];
}
inline void work(){
	cin >> n >> m;t = 2*n+1,f = 2*n+2,u = 2*n+3,ans = 0;
	for(int i = 1;i <= (n<<1)+3;i ++)val[i] = i,fa[i] = i,vis[i] = 0;
	for(int i = 1;i <= n;i ++)siz[i] = 1;
	for(int i = n+1;i <= 2*n+3;i ++)siz[i] = 0;
	for(int i = 1;i <= m;i ++){
		char op;cin >> op;
		if(op == '+'){
			int x,y;cin >> x >> y;
			val[x] = val[y],val[x+n] = val[y+n];
		}else if(op == '-'){
			int x,y;cin >> x >> y;
			val[x] = val[y+n],val[x+n] = val[y];
		}else {
			int x;cin >> x;
			if(op == 'T')val[x] = t,val[x+n] = f;
			if(op == 'F')val[x] = f,val[x+n] = t;
			if(op == 'U')val[x] = u,val[x+n] = u;
		}
	}
	for(int i = 1;i <= n;i ++){
		if(val[i] > (n<<1))continue;
		add(i,val[i]);
		if(val[i] > n)add(i+n,val[i]-n);
		else add(i+n,val[i]+n);
	}
	for(int i = 1;i <= n;i ++){
		int p = Find(i),q = Find(i+n);
		if(vis[p])continue;
		if(p == q){
			ans += siz[p];
			vis[p] = 1;
		}else{
			if(val[i] == u){
				ans += siz[p];
				vis[p] = 1;
			}
			if(val[i+n] == u){
				ans += siz[q];
				vis[q] = 1;
			}
		}
	}
	cout << ans << endl;
}
int main(){
	file("tribool");
	IOS;int c,T;cin >> c >> T;
	while(T --)work();
	return 0;
}

顺便吐槽一下,这个代码在云斗 60,在洛谷 90

2023/11/18 18:43
加载中...