QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#588423#8809. Telephone Planschenxinyang2006#0 2ms12120kbC++205.4kb2024-09-25 10:52:442024-09-25 11:42:33

Judging History

你现在查看的是最新测评结果

  • [2024-09-25 11:42:33]
  • 评测
  • 测评结果:0
  • 用时:2ms
  • 内存:12120kb
  • [2024-09-25 10:52:44]
  • 提交

answer

#include <bits/stdc++.h>
#define rep(i,j,k) for(int i=(j);i<=(k);i++)
#define per(i,j,k) for(int i=(j);i>=(k);i--)
#define uint unsigned int
#define ll long long
#define ull unsigned long long
#define db double
#define ldb long double
#define pii pair<int,int>
#define pll pair<ll,ll>
#define mkp make_pair
#define eb emplace_back
#define SZ(S) (int)S.size()
//#define mod 998244353
//#define mod 1000000007
#define inf 0x3f3f3f3f
#define linf 0x3f3f3f3f3f3f3f3f
using namespace std;

template <class T>
void chkmax(T &x,T y){
	if(x < y) x = y;
}

template <class T>
void chkmin(T &x,T y){
	if(x > y) x = y;
}

inline int popcnt(int x){
	return __builtin_popcount(x);
}

inline int ctz(int x){
	return __builtin_ctz(x);
}


/*ll power(ll p,int k = mod - 2){
	ll ans = 1;
	while(k){
		if(k % 2 == 1) ans = ans * p % mod;
		p = p * p % mod;
		k /= 2;	
	}
	return ans;
}*/
int online;
int n,m,q;
mt19937 rnd(0);

struct solver{
	ll answer;
	int fa[500005],siz[500005];
	struct node{
		int rev,sum,val,siz,l,r,w,fa;
	}tree[500005];
	#define ls(rt) tree[rt].l
	#define rs(rt) tree[rt].r
	void pushup(int rt){
		tree[rt].sum = tree[rt].val + tree[ls(rt)].sum + tree[rs(rt)].sum;
		tree[rt].siz = 1 + tree[ls(rt)].siz + tree[rs(rt)].siz;
	}
	void upd(int rt,int C){
		if(!C) return;
		tree[rt].rev ^= 1;
		swap(ls(rt),rs(rt));
	}
	void pushdown(int rt){
		if(!tree[rt].rev) return;
		upd(ls(rt),1);upd(rs(rt),1);
		tree[rt].rev = 0;
	}
	void ssplit(int rt,int k,int &x,int &y){
		if(!rt){
			x = y = 0;
			return;
		}
		pushdown(rt);
		if(k >= tree[ls(rt)].siz + 1){
			x = rt;
			ssplit(rs(rt),k - tree[ls(rt)].siz - 1,rs(rt),y);
			if(rs(rt)) tree[rs(rt)].fa = rt;
		}else{
			y = rt;
			ssplit(ls(rt),k,x,ls(rt));
			if(ls(rt)) tree[ls(rt)].fa = rt;
		}
		pushup(rt);
	}
	void split(int rt,int k,int &x,int &y){
		x = y = 0;
		ssplit(rt,k,x,y);
		tree[x].fa = tree[y].fa = 0;
	}
	int Merge(int x,int y){
		if(!x || !y) return x + y;
		if(tree[x].w < tree[y].w){
			pushdown(x);
			rs(x) = Merge(rs(x),y);
			tree[rs(x)].fa = x;
			pushup(x);
			return x;
		}else{
			pushdown(y);
			ls(y) = Merge(x,ls(y));
			tree[ls(y)].fa = y;
			pushup(y);
			return y;
		}
	}
	int top;
	int stk[50];
	void fix(int u){
		while(u){
			stk[++top] = u;
			u = tree[u].fa;
		}
		while(top) pushdown(stk[top--]);
	}
	void refix(int u){
		tree[u].val = siz[u];
		while(u){
			pushup(u);
			u = tree[u].fa;
		}
	}
	int getrank(int u){
		fix(u);
		int sum = 1 + tree[ls(u)].siz,v;
		while(u){
			v = tree[u].fa;
			if(u == rs(v)) sum += tree[ls(v)].siz;
			u = v;
		}
		return sum;
	}
	int getrt(int u){
		while(tree[u].fa) u = tree[u].fa;
		return u;
	}
	int gettop(int u){
		u = getrt(u);
		while(1){
			pushdown(u);
			if(ls(u)) u = ls(u);
			else return u;
		}
	}
	void prt(int u){
		printf("node %d ls %d rs %d fa %d rev %d val %d sum %d siz %d\n",u,ls(u),rs(u),tree[u].fa,tree[u].rev,tree[u].val,tree[u].sum,tree[u].siz);
	}
	void travel(int u){
		if(ls(u)) travel(ls(u));
		prt(u);
		if(rs(u)) travel(rs(u));
 	}
	void access(int u){
//		printf("access %d\n",u);
		int temp = getrank(u),rt = getrt(u),a,b;
//		printf("temp=%d\n",temp);
		if(tree[rt].siz != temp){
			split(rt,temp,a,b);
/*			printf("travela\n");
			travel(a);
			printf("travelb\n");
			travel(b);
			printf("fin\n");*/
			siz[u] += tree[b].sum;
			fa[gettop(b)] = u;
			refix(u);
		}
//		printf("part\n");
//		dbg();
		while(1){
			int v = gettop(u);
			if(!fa[v]){
//				printf("fin\n");
//				dbg();
				return;
			}
			rt = getrt(fa[v]);
			temp = getrank(fa[v]);
			if(tree[rt].siz != temp){
				split(rt,temp,a,b);
				siz[fa[v]] += tree[b].sum;
				fa[gettop(b)] = fa[v];
				rt = a;
			}
			siz[fa[v]] -= tree[getrt(u)].sum;
			refix(fa[v]);
			fa[v] = 0;
			Merge(rt,getrt(u));
		}
	}
	void makeroot(int u){
		access(u);
		upd(getrt(u),1);
	}
	void dbg(){
		rep(u,1,n) prt(u);
		printf("extra structor\n");
		rep(u,1,n) printf("%d ",fa[u]);
		printf("\n");
		rep(u,1,n) printf("%d ",siz[u]);
		printf("\n");
	}
	void link(int u,int v){
//		printf("link %d %d\n",u,v);
		makeroot(u);
		makeroot(v);
		answer += 1ll * tree[getrt(u)].sum * tree[getrt(v)].sum;
		fa[v] = u;siz[u] += tree[getrt(v)].sum;
		refix(u);
//		printf("[fin answer=%lld]\n",answer);
//		dbg();
	}
	void cut(int u,int v){
//		printf("[[[[[[[[[[[cut %d %d]]]]]]]]]]\n",u,v);
		makeroot(u);
		access(v);access(u);
		answer -= 1ll * (tree[getrt(u)].sum - tree[getrt(v)].sum) * tree[getrt(v)].sum;
		fa[v] = 0;siz[u] -= tree[getrt(v)].sum;
		refix(u);
//		printf("[fin answer=%lld]\n",answer);
//		dbg();
	}
	void init(){
		rep(u,1,n){
			siz[u] = tree[u].sum = tree[u].val = 1;
			tree[u].siz = 1;
			tree[u].w = rnd();
		}
	}
}P,Q;
ll a[6005],b[6005];
ll calc(int l,int r){
	ll sum = 0;
	rep(i,l,r) sum += a[i];
	rep(i,l + 1,r) sum -= b[i];
	return sum;
}

int main(){	
//	freopen("test.in","r",stdin);
	scanf("%d%d%d",&online,&n,&q);
	P.init();
	Q.init();
	int op;
	ll x,y,lastans = 0;
	rep(i,1,q){
		scanf("%d%lld",&op,&x);
		if(op < 3) scanf("%lld",&y);
		if(online){
			x ^= lastans;
			y ^= lastans;
		}
		if(op == 1){
			P.link(x,y);
		}else if(op == 2){
			P.cut(x,y);
			Q.cut(x,y);
		}
		a[i] = P.answer;
		b[i] = Q.answer;
		if(op == 1) Q.link(x,y);
		if(op == 3){
			lastans = calc(i - x,i);
			printf("%lld\n",lastans);
		}
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Time Limit Exceeded

Test #1:

score: 3
Accepted
time: 0ms
memory: 12120kb

input:

0
1 147
3 0
3 0
3 1
3 1
3 0
3 5
3 5
3 1
3 1
3 4
3 8
3 2
3 10
3 13
3 10
3 8
3 8
3 0
3 16
3 3
3 1
3 20
3 2
3 10
3 16
3 13
3 17
3 12
3 22
3 7
3 8
3 2
3 12
3 32
3 12
3 31
3 2
3 0
3 21
3 24
3 28
3 32
3 9
3 18
3 26
3 11
3 45
3 35
3 14
3 34
3 49
3 31
3 43
3 11
3 21
3 50
3 4
3 11
3 31
3 51
3 28
3 26
3 18
3 ...

output:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

result:

ok 147 lines

Test #2:

score: 3
Accepted
time: 1ms
memory: 9936kb

input:

0
2 10
1 1 2
3 1
3 1
3 2
3 3
3 3
3 3
2 1 2
3 2
3 3

output:

1
1
1
1
1
1
1
1

result:

ok 8 lines

Test #3:

score: 0
Time Limit Exceeded

input:

0
30 150
1 14 10
3 1
1 14 6
1 3 6
3 4
3 4
1 2 3
3 0
3 5
1 2 9
1 11 9
3 8
1 19 11
3 6
1 8 19
3 14
3 10
1 27 8
3 15
1 27 28
1 28 20
3 0
3 3
1 20 7
1 7 23
3 13
3 5
1 24 23
3 0
3 28
1 24 13
3 5
3 32
3 1
3 13
1 30 13
3 25
1 30 16
1 15 16
3 22
1 29 15
3 13
1 29 25
1 25 1
1 1 18
3 17
3 8
3 10
1 26 18
3 46
...

output:


result:


Subtask #2:

score: 0
Time Limit Exceeded

Test #29:

score: 2
Accepted
time: 2ms
memory: 12116kb

input:

1
1 147
3 0
3 0
3 1
3 1
3 3
3 0
3 6
3 6
3 0
3 2
3 0
3 5
3 12
3 1
3 2
3 10
3 13
3 15
3 3
3 12
3 20
3 18
3 10
3 12
3 2
3 12
3 14
3 26
3 12
3 24
3 7
3 7
3 6
3 29
3 32
3 16
3 23
3 14
3 25
3 13
3 13
3 31
3 20
3 26
3 0
3 40
3 23
3 28
3 35
3 1
3 31
3 2
3 34
3 37
3 3
3 39
3 17
3 4
3 41
3 11
3 16
3 48
3 10
3...

output:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

result:

ok 147 lines

Test #30:

score: 2
Accepted
time: 2ms
memory: 12120kb

input:

1
2 10
1 1 2
3 1
3 1
3 1
3 1
3 1
3 2
3 6
2 0 3
3 2

output:

1
1
1
1
1
1
1
1

result:

ok 8 lines

Test #31:

score: 0
Time Limit Exceeded

input:

1
30 150
1 21 13
3 1
1 9 20
3 2
3 2
1 18 11
1 18 0
3 6
3 9
3 8
1 12 9
3 8
3 7
1 10 9
3 5
3 24
3 26
3 28
1 6 16
3 6
3 14
1 15 23
3 21
3 48
1 60 47
3 53
3 37
1 35 53
3 56
1 57 59
1 59 37
3 63
3 95
3 94
1 92 79
3 65
1 90 81
1 95 81
3 75
3 111
3 118
3 100
1 124 98
1 101 98
3 121
3 132
3 137
3 153
1 141 ...

output:


result:


Subtask #3:

score: 0
Skipped

Dependency #1:

0%

Subtask #4:

score: 0
Skipped

Dependency #2:

0%

Subtask #5:

score: 0
Skipped

Dependency #3:

0%

Subtask #6:

score: 0
Skipped

Dependency #4:

0%

Subtask #7:

score: 0
Skipped

Dependency #6:

0%