QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#245213#7767. 数据结构Crysfly5 4609ms206912kbC++177.4kb2023-11-09 19:47:352023-11-09 19:47:35

Judging History

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

  • [2023-11-09 19:47:35]
  • 评测
  • 测评结果:5
  • 用时:4609ms
  • 内存:206912kb
  • [2023-11-09 19:47:35]
  • 提交

answer

// what is matter? never mind. 
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
//#pragma GCC target("sse,sse2,sse3,sse4,popcnt,abm,mmx,avx,avx2") 
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
#define ll long long
//#define int long long
#define ull unsigned long long
using namespace std;
inline ll read()
{
    char c=getchar();ll x=0;bool f=0;
    for(;!isdigit(c);c=getchar())f^=!(c^45);
    for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
    if(f)x=-x;return x;
}

#define fi first
#define se second
#define pb push_back
#define mkp make_pair
typedef pair<int,int>pii;
typedef vector<int>vi;
 
#define maxn 400005
#define inf 0x3f3f3f3f

mt19937_64 rng(114);

int n;

struct dat{
	ull c,s;
	dat(ull x=0,ull y=0){c=x,s=y;}
	void add(ull x){
		s+=c*x;
	}
};
dat operator +(dat a,dat b){
	return dat(a.c+b.c,a.s+b.s);
}
dat operator -(dat a,dat b){
	return dat(a.c-b.c,a.s-b.s);
}

struct node{
	dat s0,s[4];
	node(){
		s0=0;
		For(i,0,3)s[i]=0;
	}
};
node operator +(node a,node b){
	node c;
	c.s0=a.s0+b.s0;
	For(i,0,3)c.s[i]=a.s[i]+b.s[i];
	return c;
}
//void operator +=(node&a,node b){
//	a=a+b;
//}

struct oper{
	ull t0,t[4];
	oper(){
		t0=0;
		For(i,0,3)t[i]=0;
	}
	bool emp(){
		For(i,0,3)if(t[i])return 0;
		if(t0)return 0;
		return 1;
	}
};
oper operator +(oper a,oper b){
	oper c;
	c.t0=a.t0+b.t0;
	For(i,0,3)c.t[i]=a.t[i]+b.t[i];
	return c;
}
node operator +(node a,oper b){
	a.s0.add(b.t0);
	For(i,0,3){
		a.s[i].add(b.t0);
		a.s0.s+=a.s[i].c*b.t[i];
		a.s[i].add(b.t[i]);
	}
	return a;
}

oper mov(oper a){
	For(i,0,2)a.t[i]=a.t[i+1];
	a.t[3]=0;
	return a;
}
node movup(node a){
	Rep(i,3,1)a.s[i]=a.s[i-1]; a.s[0]=0;
	return a;
}

namespace T{
	int rt[maxn],ls[maxn],rs[maxn];
	node v[maxn],s[maxn];
	oper tag[maxn],tag2[maxn];
	unsigned rnd[maxn];
	void up(int x){
		s[x]=s[ls[x]]+v[x]+s[rs[x]];
	}
	void pt(int x,oper y){
		if(!x)return;
		tag[x]=tag[x]+y;
		tag2[x]=tag2[x]+y;
		v[x]=v[x]+y;
		s[x]=s[x]+y;
	}
	void down(int x){
		if(!x || tag[x].emp())return;
		pt(ls[x],tag[x]),pt(rs[x],tag[x]),tag[x]=oper();
	}
	void split(int p,int k,int&x,int&y){
		if(!p)return x=y=0,void();
		down(p);
		if(p<=k)x=p,split(rs[p],k,rs[p],y);
		else y=p,split(ls[p],k,x,ls[p]); up(p); 
	}
	void split(int p,int k,int&x,int&y,int&z){
		int t;
		split(p,k-1,x,t);
		split(t,k,y,z);
	}
	int merge(int x,int y){
		if(!x||!y)return x|y;
		down(x),down(y);
		if(rnd[x]<rnd[y])return rs[x]=merge(rs[x],y),up(x),x;
		return ls[y]=merge(x,ls[y]),up(y),y;
	}
	void ins(int&p,int x){
		if(!p||rnd[x]<rnd[p]){
			split(p,x,ls[x],rs[x]);
			p=x,up(p);return;
		}
		down(p);
		if(x<=p)ins(ls[p],x);
		else ins(rs[p],x);
		up(p);
	}
	void del(int&p,int x){
		if(p==x){
			p=merge(ls[p],rs[p]);
			return;
		}
		down(p);
		if(x<p)del(ls[p],x);
		else del(rs[p],x);
		up(p);
	}
};

#define ls(x) ch[x][0]
#define rs(x) ch[x][1]
int fa[maxn],ch[maxn][2];
oper tag[maxn];
node v[maxn],s[maxn];
bool rev[maxn];

bool chk(int x){return rs(fa[x])==x;}
bool nrt(int x){return ls(fa[x])==x||rs(fa[x])==x;}
void up(int x){
	s[x]=s[ls(x)]+v[x]+s[rs(x)]+movup(T::s[T::rt[x]]);
}
void pr(int x){
	rev[x]^=1;
	swap(ls(x),rs(x));
}
void update(int u,ull x){
//	if(x)cerr<<"update "<<u<<" "<<x<<"\n";
	oper t;
	t.t[0]=x;
	v[u]=v[u]+t;
}

void pt(int x,oper y){
	if(!x || y.emp())return;
	assert(x);
	tag[x]=tag[x]+y;
	
//	cout<<"pushtag "<<x<<"\n";
//	For(i,0,3)cout<<y.t[i]<<" "; cout<<"\n";
	update(x,y.t0+y.t[0]);
	
	s[x]=s[x]+y;
	T::pt(T::rt[x],mov(y));
}

void down(int x){
	if(rev[x]){
		if(ls(x))pr(ls(x));
		if(rs(x))pr(rs(x));
		rev[x]=0;
	}
	if(!tag[x].emp()){
		if(ls(x))pt(ls(x),tag[x]);
		if(rs(x))pt(rs(x),tag[x]);
		tag[x]=oper();
	}
}

void downall(int p){
	if(nrt(p))downall(fa[p]);
	down(p);
}
void rot(int x){
	int y=fa[x],z=fa[y],k=chk(x),s=ch[x][!k];
	fa[x]=z; if(nrt(y)) ch[z][chk(y)]=x;
	fa[y]=x; ch[x][!k]=y;
	if(s)fa[s]=y; ch[y][k]=s; up(y),up(x);
}
void splay(int x){
	if(!x)return;
	downall(x);
	while(nrt(x)){
		int y=fa[x];
		if(nrt(y))rot(chk(x)==chk(y)?y:x);
		rot(x);
	}
}
int findL(int x){
	down(x);
	while(ls(x))down(x=ls(x));
	return splay(x),x;
}

int st[maxn],tp;

void ins(int x,int y){
//	cout<<"ins "<<x<<" "<<y<<"\n";
	
	y=findL(y);
	int a,b;
//	T::split(T::rt[x],y,a,b);
//	T::v[y]=T::s[y]=[y]; // wrong.

	node tmp;
	tmp.s0=s[y].s0;
	int z=y;
	For(i,0,3){
		tmp.s[i]=tmp.s[i]+v[z].s[0];
		For(j,0,2-i) tmp.s[i+j+1]=tmp.s[i+j+1]+T::s[T::rt[z]].s[j];
		if(i==3 || !rs(z))break;
		z=findL(rs(z)),splay(z);
	}
	
//	cout<<"tmp:\n";
//	For(i,0,3)cout<<tmp.s[i].s<<" ";puts("");
	
	splay(y);
	T::v[y]=T::s[y]=tmp;
	T::tag[y]=T::tag2[y]=oper();
	
	T::ins(T::rt[x],y);
//	T::rt[x]=T::merge(T::merge(a,y),b);
}
void del(int x,int y){
//	cout<<"del "<<x<<" "<<y<<"\n";
	y=findL(y),splay(y);
	
	T::del(T::rt[x],y);
	oper tmp=T::tag2[y];
//	For(i,0,3) cout<<tmp.t[i]<<" "; cout<<"val_y\n";
	
	oper tt; tt.t0=tmp.t0;
	pt(y,tt); tt.t0=0;
	
	int z=y;
	For(i,0,3){
		For(j,0,3-i) tt.t[j]=tmp.t[i+j];
		T::pt(T::rt[z],mov(tt));
		//v[z]
		
	//	oper tt0; tt0.t[0]=tmp.t[i];
		update(z,tmp.t[i]);
		
		up(z);
		if(i==3 || !rs(z))break;
		z=findL(rs(z)),splay(z);
	}
	
	splay(y);
}
void make(int x,int y){
//	cout<<"mak "<<x<<" "<<y<<"\n";
    if(rs(x)){
    	int tmp=rs(x); rs(x)=0;
    	ins(x,tmp);
    }
    splay(y);
  //  cout<<"mk "<<x<<" "<<y<<"\n";
    if(y){
    	del(x,y);
    	splay(y);
    }
    rs(x)=y;
    up(x);
}
void acc(int x){
//	cout<<"acc "<<x<<"\n";
    tp=0;
    for(int y=0;x;x=fa[y=x]) splay(x),st[++tp]=x;
 //   For(i,1,tp) cout<<st[i]<<" "; cout<<"\n";
    Rep(i,tp,1){
        splay(st[i]);
        make(st[i],st[i-1]);
    }
 //   cout<<"done\n";
}
void mkrt(int x){acc(x),splay(x),pr(x);}
void split(int x,int y){
	mkrt(x),acc(y),splay(y);
}

void dfs(int u){
	if(!u)return;
	down(u);
	if(ls(u))dfs(ls(u));
	cout<<u<<" ";
	if(rs(u))dfs(rs(u));
}

vi e[maxn];
void dfs(int u,int pa){
	for(int v:e[u])
		if(v!=pa){
			fa[v]=u;
			dfs(v,u),ins(u,v);
		}
	up(u);
}
int m;
signed main()
{
//	freopen("3.in","r",stdin);
//	freopen("my.out","w",stdout);
	n=read(),m=read();
	For(i,2,n){
		int u=read(),v=read();
		e[u].pb(v),e[v].pb(u);
	}
	For(i,1,n)T::rnd[i]=rng(),v[i].s0.c=v[i].s[0].c=1;
	dfs(1,0);
	
//	For(i,1,n)cout<<fa[i]<<" ";cout<<" fa\n";
	For(_,1,m){
		int op=read(),u,v,k,x;
		if(op==1){
			u=read(),v=read(),k=read(),x=read();
			oper t;
			For(i,0,k) t.t[i]=x;
			split(u,v);
	//		dfs(v);cout<<" ---\n";
		//	cout<<"pushtag "<<(t.emp())<<"\n";
			pt(v,t);
		}
		if(op==2){
			u=read(),x=read();
			mkrt(1);
			acc(u),splay(u);
			oper t; t.t0=x;
			update(u,x);
			T::pt(T::rt[u],t);
			up(u);
		}
		if(op==3){
			u=read(),v=read(),k=read();
			split(u,v);
			ull res=0;
			For(i,0,k)res+=s[v].s[i].s;
			cout<<res<<"\n";
		}
		if(op==4){
			u=read();
			mkrt(1);
			acc(u),splay(u);
			ull res=0;
			res+=::v[u].s[0].s;
			res+=T::s[T::rt[u]].s0.s;
			cout<<res<<"\n";
		}
		
//		For(i,1,n){
//			cout<<"ASK "<<i<<"\n";
//			split(i,i);
//			cout<<"i: "<<i<<" "<<::v[i].s0.s<<" "<<::v[i].s0.c<<" "<<s[i].s0.s<<" "<<s[i].s0.c<<"\n";
//		}
//		cout<<"\n";
	}
	return 0;
}
/*
8 6
1 2
1 3
2 4
2 5
2 8
4 6
4 7

1 6 8 0 1
1 6 8 1 1
*/

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 81ms
memory: 194108kb

input:

5000 5000
1 2
2 3
3 4
4 5
5 6
5 7
6 8
7 9
9 10
8 11
11 12
12 13
12 14
14 15
15 16
16 17
16 18
18 19
18 20
20 21
20 22
22 23
23 24
23 25
23 26
26 27
27 28
28 29
27 30
30 31
29 32
32 33
33 34
32 35
35 36
36 37
35 38
36 39
38 40
38 41
41 42
42 43
43 44
42 45
44 46
45 47
47 48
48 49
48 50
49 51
51 52
52...

output:

37227703492
2136305359188
2794367845468
1309925069860
1698169768858
2678958746332
6688353830259
2086447878235
5784954064446
2186592622
3983445146011
1674542130
6524658548
7062132275751
10064479061786
11555551363815
492570862
3353986958511
2834694279
4198036633070
4395772262
4221137767
9630829210
991...

result:

wrong answer 7th numbers differ - expected: '6690595071246', found: '6688353830259'

Subtask #2:

score: 0
Wrong Answer

Test #3:

score: 0
Wrong Answer
time: 4609ms
memory: 202676kb

input:

200000 200000
1 2
1 3
1 4
3 5
1 6
1 7
7 8
8 9
2 10
1 11
5 12
1 13
7 14
10 15
2 16
7 17
11 18
5 19
5 20
1 21
16 22
1 23
3 24
20 25
14 26
2 27
6 28
15 29
10 30
15 31
5 32
13 33
12 34
31 35
31 36
36 37
36 38
1 39
28 40
5 41
12 42
41 43
20 44
30 45
22 46
11 47
47 48
45 49
14 50
41 51
3 52
30 53
29 54
6 ...

output:

0
0
0
0
0
0
0
0
7615073807
4176911055
0
4745654848
6222845818
0
0
9739142819
0
1424960716
5224818790
9459319003
13717923473
8673060864
0
11610197664
0
0
9587792729
0
0
0
2747489046
12425650803
0
0
11191496476
0
37597503993
0
0
15164651949
14868775382
15559673116
0
16391028892
0
15726757336
0
2421390...

result:

wrong answer 543rd numbers differ - expected: '91846733121', found: '90920431782'

Subtask #3:

score: 5
Accepted

Test #5:

score: 5
Accepted
time: 4100ms
memory: 206616kb

input:

200000 200000
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 11
11 12
12 13
13 14
14 15
15 16
16 17
17 18
18 19
19 20
20 21
21 22
22 23
23 24
24 25
25 26
26 27
27 28
28 29
29 30
30 31
31 32
32 33
33 34
34 35
35 36
36 37
37 38
38 39
39 40
40 41
41 42
42 43
43 44
44 45
45 46
46 47
47 48
48 49
49 50
50 51
51 ...

output:

0
134315201201061
38210069287857
75889674481730
25202765567748
179527420359031
75824479907233
156951577189979
246509811214535
251383387317167
181645886595511
285463150681348
213797241401335
244909583142805
53376921005282
451665818220
379334117147250
720759810155057
768646965102274
224741692238593
18...

result:

ok 100065 numbers

Test #6:

score: 0
Accepted
time: 4122ms
memory: 206912kb

input:

200000 200000
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 11
11 12
12 13
13 14
14 15
15 16
16 17
17 18
18 19
19 20
20 21
21 22
22 23
23 24
24 25
25 26
26 27
27 28
28 29
29 30
30 31
31 32
32 33
33 34
34 35
35 36
36 37
37 38
38 39
39 40
40 41
41 42
42 43
43 44
44 45
45 46
46 47
47 48
48 49
49 50
50 51
51 ...

output:

0
1950387013442
2906443199266
2144858813468
3137341049831
1081425884175
20924388962208
73530126133368
136609133052209
125022026678010
22502893517249
99022896674514
84010333777754
13909990392191
43442491331837
190816082733002
92810414504491
244006706308139
42843404030538
126151201042579
7249812065288...

result:

ok 99740 numbers

Subtask #4:

score: 0
Wrong Answer

Test #7:

score: 0
Wrong Answer
time: 4004ms
memory: 202188kb

input:

200000 200000
1 2
2 3
3 4
1 5
3 6
5 7
5 8
7 9
2 10
7 11
11 12
10 13
6 14
3 15
14 16
4 17
11 18
3 19
14 20
4 21
4 22
12 23
18 24
5 25
5 26
14 27
13 28
24 29
11 30
26 31
29 32
28 33
31 34
23 35
33 36
6 37
11 38
22 39
13 40
35 41
37 42
21 43
12 44
4 45
16 46
12 47
21 48
1 49
26 50
45 51
41 52
46 53
7 5...

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
0
0
0
...

result:

wrong answer 848th numbers differ - expected: '916502377', found: '0'

Subtask #5:

score: 0
Skipped

Dependency #4:

0%

Subtask #6:

score: 0
Skipped

Dependency #4:

0%

Subtask #7:

score: 0
Skipped

Dependency #2:

0%

Subtask #8:

score: 0
Skipped

Dependency #1:

0%