QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#139981#4891. 树上的孤独zhouhuanyi0 1960ms252936kbC++145.0kb2023-08-14 20:55:252023-08-14 20:55:28

Judging History

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

  • [2023-08-14 20:55:28]
  • 评测
  • 测评结果:0
  • 用时:1960ms
  • 内存:252936kb
  • [2023-08-14 20:55:25]
  • 提交

answer

#include<iostream>
#include<cstdio>
#include<vector>
#include<set>
#include<algorithm>
#define N 300000
using namespace std;
int read()
{
	char c=0;
	int sum=0;
	while (c<'0'||c>'9') c=getchar();
	while ('0'<=c&&c<='9') sum=sum*10+c-'0',c=getchar();
	return sum;
}
const int inf=(int)(1e9);
struct reads
{
	int num,data;
	bool operator < (const reads &t)const
	{
		return data<t.data;
	}
};
reads tong[N+1];
struct rds
{
	int num,data,data2;
	bool operator < (const rds &t)const
	{
		return data!=t.data?data<t.data:data2<t.data2;
	}
};
rds tongs[N+1];
int n,m,q,ans,length,lg[N+1],rt[N+1],rt2[N+1],st[N+1],lengs,delta[N+1],dque[N+1],top,dfn[N+1],sz[N+1],len,v1[N+1],v2[N+1],fa[N+1],fa2[N+1][21],depth[N+1],depth2[N+1],ST[N+1][21],L[N+1],R[N+1];
bool used[N+1],used2[N+1];
vector<int>E[N+1];
vector<int>E2[N+1];
set<reads>s[N+1];
void add(int x,int y)
{
	E[x].push_back(y),E[y].push_back(x);
	return;
}
void add2(int x,int y)
{
	E2[x].push_back(y),E2[y].push_back(x);
	return;
}
void dfs(int x)
{
	used[x]=1;
	for (int i=0;i<E[x].size();++i)
		if (!used[E[x][i]])
			fa[E[x][i]]=x,depth[E[x][i]]=depth[x]+1,dfs(E[x][i]);
	return;
}
void dfs2(int x)
{
	dfn[x]=++len,used2[x]=sz[x]=1;
	for (int i=0;i<E2[x].size();++i)
		if (!used2[E2[x][i]])
			fa2[E2[x][i]][0]=x,depth2[E2[x][i]]=depth2[x]+1,dfs2(E2[x][i]),sz[x]+=sz[E2[x][i]];
	return;
}
bool cmp(int x,int y)
{
	return depth[x]<depth[y];
}
int lca(int x,int y)
{
	if (depth2[x]<depth2[y]) swap(x,y);
	for (int i=lg[m];i>=0;--i)
		if (depth2[fa2[x][i]]>=depth2[y])
			x=fa2[x][i];
	if (x==y) return x;
	for (int i=lg[m];i>=0;--i)
		if (fa2[x][i]!=fa2[y][i])
			x=fa2[x][i],y=fa2[y][i];
	return fa2[x][0];
}
void dfs3(int x,int d)
{
	if (depth[x]<=d) dque[++top]=v1[x];
	for (int i=0;i<E[x].size();++i)
		if (fa[E[x][i]]==x)
			dfs3(E[x][i],d);
	return;
}
struct seg
{
	struct node
	{
		int ls,rs,data;
	};
	node tree[60*N+1];
	void push_up(int k)
	{
		tree[k].data=tree[tree[k].ls].data+tree[tree[k].rs].data;
		return;
	}
	int add(int k,int L,int R,int x,int d)
	{
		int nw=++length;
		tree[nw]=tree[k];
		if (L==R)
		{
			tree[nw].data+=d;
			return nw;
		}
		int mid=(L+R)>>1;
		if (x<=mid) tree[nw].ls=add(tree[nw].ls,L,mid,x,d);
		else tree[nw].rs=add(tree[nw].rs,mid+1,R,x,d);
		push_up(nw);
		return nw;
	}
	int query(int k,int L,int R,int l,int r)
	{
		if (L==l&&R==r) return tree[k].data;
		int mid=(L+R)>>1;
		if (r<=mid) return query(tree[k].ls,L,mid,l,r);
		else if (l>=mid+1) return query(tree[k].rs,mid+1,R,l,r);
		else return query(tree[k].ls,L,mid,l,mid)+query(tree[k].rs,mid+1,R,mid+1,r);
	}
};
seg T;
int get_query(int l,int r)
{
	if (l>r) return inf;
	int lw=lg[r-l+1];
	return min(ST[l][lw],ST[r-(1<<lw)+1][lw]);
}
int main()
{
	int op,x,y,d,d1,d2,ps,l,r,pv,nt;
	for (int i=2;i<=N;++i) lg[i]=lg[i>>1]+1;
	n=read(),m=read(),q=read();
	for (int i=1;i<=n-1;++i) x=read(),y=read(),add(x,y);
	for (int i=1;i<=m-1;++i) x=read(),y=read(),add2(x,y);
	for (int i=1;i<=n;++i) v1[i]=read();
	for (int i=1;i<=m;++i) v2[i]=read(),st[++lengs]=v2[i];
	sort(st+1,st+lengs+1),lengs=unique(st+1,st+lengs+1)-st-1,depth[1]=depth2[1]=1,dfs(1),dfs2(1);
	for (int i=1;i<=m;++i) tong[i]=(reads){i,depth2[i]};
	sort(tong+1,tong+m+1);
	for (int i=1;i<=lg[m];++i)
		for (int j=1;j<=m;++j)
			fa2[j][i]=fa2[fa2[j][i-1]][i-1];
	for (int i=1;i<=m;++i)
	{
		int d=lower_bound(st+1,st+lengs+1,v2[tong[i].num])-st;
		auto it=s[d].lower_bound((reads){tong[i].num,dfn[tong[i].num]});
		rt[i]=T.add(rt[i-1],1,m,dfn[tong[i].num],1);
		if (it!=s[d].end()) nt=(*it).num;
		else nt=-1;
		if (it!=s[d].begin()) it--,pv=(*it).num;
		else pv=-1;
		if (pv!=-1) rt[i]=T.add(rt[i],1,m,dfn[lca(pv,tong[i].num)],-1);
		if (nt!=-1) rt[i]=T.add(rt[i],1,m,dfn[lca(nt,tong[i].num)],-1);
		if (pv!=-1&&nt!=-1) rt[i]=T.add(rt[i],1,m,dfn[lca(pv,nt)],1);
		s[d].insert((reads){tong[i].num,dfn[tong[i].num]});
	}
	for (int i=1;i<=m;++i) tongs[i]=(rds){i,lower_bound(st+1,st+lengs+1,v2[i])-st,dfn[i]};
	sort(tongs+1,tongs+m+1);
	for (int i=1;i<=lengs;++i) L[i]=inf,R[i]=0;
	for (int i=1;i<=m;++i) L[tongs[i].data]=min(L[tongs[i].data],i),R[tongs[i].data]=max(R[tongs[i].data],i);
	for (int i=1;i<=m;++i) ST[i][0]=depth2[tongs[i].num],delta[i]=tongs[i].data2;
	for (int i=1;i<=lg[m];++i)
		for (int j=1;j<=m;++j)
			ST[j][i]=min(ST[j][i-1],ST[j+(1<<(i-1))][i-1]);
	while (q--)
	{
		op=read();
		if (op==1)
		{
			x=read(),y=read(),d1=read()^ans,d2=read()^ans,ps=lower_bound(tong+1,tong+m+1,(reads){0,depth2[y]+d2+1})-tong-1,ans=T.query(rt[ps],1,m,dfn[y],dfn[y]+sz[y]-1),top=0,dfs3(x,depth[x]+d1),sort(dque+1,dque+top+1),top=unique(dque+1,dque+top+1)-dque-1;
			for (int i=1;i<=top;++i)
			{
				d=lower_bound(st+1,st+lengs+1,dque[i])-st;
				if (st[d]==dque[i])
				{
					if (depth2[y]+d2<=tong[m].data) l=lower_bound(delta+L[d],delta+R[d]+1,dfn[y])-delta,r=lower_bound(delta+L[d],delta+R[d]+1,dfn[y]+sz[y])-delta-1,ans+=(get_query(l,r)>depth2[y]+d2);
				}
				else ans++;
			}
			printf("%d\n",ans);
		}
		else x=read(),d=read(),v1[x]=d;
	}
	return 0;
}


Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 3ms
memory: 60584kb

input:

20 2000 2000
8 15
8 13
14 8
14 7
12 14
12 1
9 13
9 4
5 9
5 10
2 5
2 19
6 19
6 16
11 7
11 20
18 2
18 17
3 6
1395 1783
1395 1735
1735 457
457 739
739 438
438 101
101 441
441 1879
1879 1238
1238 501
501 1732
1732 1910
1910 2000
2000 834
834 917
917 111
111 780
780 1966
1966 1604
1604 623
623 1748
1748 ...

output:

105
93
2
40
19
54
192
6
69
21
21
200
78
75
137
33
68
68
54
35
24
6
13
72
53
100
26
200
24
119
94
20
75
36
197
76
15
48
10
19
58
44
23
2
108
157
5
3
15
102
36
98
26
78
171
82
32
141
163
9
136
15
97
132
119
55
22
52
1
16
40
33
54
13
34
153
101
133
140
200
21
80
84
37
73
9
28
22
174
37
61
51
95
4
53
68...

result:

wrong answer 4th numbers differ - expected: '44', found: '40'

Subtask #2:

score: 0
Wrong Answer

Test #3:

score: 0
Wrong Answer
time: 1102ms
memory: 234136kb

input:

20 200000 500000
8 18
8 4
2 4
2 14
13 4
13 16
6 4
6 3
1 4
1 17
15 6
15 19
7 17
7 11
5 14
5 10
20 7
12 15
9 8
165302 77239
165302 198189
165302 180850
165302 192738
165302 173589
165302 194087
165302 191990
165302 167370
165302 101092
165302 92553
165302 163654
165302 122381
165302 152105
165302 1919...

output:

2
17595
3898
3423
16
517
5136
11355
21
7340
21
18327
15797
6628
513
1179
6110
1869
6227
662
16736
13223
1597
5445
6059
2385
6265
1
1
277
3497
1806
1235
1036
17804
4656
5519
4632
4545
21
244
2684
2
4610
8571
4037
1
13497
5636
2054
3486
4880
5828
782
2052
1510
13232
2593
918
16806
1
17623
334
1
1
719
...

result:

wrong answer 6th numbers differ - expected: '518', found: '517'

Subtask #3:

score: 0
Wrong Answer

Test #7:

score: 0
Wrong Answer
time: 350ms
memory: 148564kb

input:

20 100000 100000
16 12
16 20
6 12
6 18
2 16
2 8
5 20
5 13
3 6
3 11
19 11
19 17
9 12
9 15
4 15
4 7
10 5
14 15
14 1
85812 94626
85812 91172
91172 93788
93788 96567
96567 75524
75524 23275
23275 98340
98340 81608
81608 91480
91480 75108
75108 56605
56605 93317
93317 41617
41617 77160
77160 727
727 7559...

output:

2565
605
8287
8983
3561
9180
651
281
2464
7308
2682
1175
1383
1268
8228
4407
89
2679
621
4822
3151
9182
1
8987
2091
9950
8009
9944
1
5037
87
2021
1881
1
1275
2179
335
1088
9386
3460
7723
1958
2741
1256
2331
697
1
544
1
428
699
2332
447
3
23
1422
2321
673
2449
1
2318
696
9999
1
176
1366
8932
6497
766...

result:

wrong answer 1st numbers differ - expected: '2568', found: '2565'

Subtask #4:

score: 0
Wrong Answer

Test #13:

score: 0
Wrong Answer
time: 996ms
memory: 248888kb

input:

1 200000 500000
189127 137023
189127 199761
199761 160701
160701 130639
130639 190908
190908 176819
176819 193363
193363 188021
188021 182446
182446 186028
186028 198828
198828 190792
190792 155378
155378 189428
189428 177276
177276 146159
146159 175923
175923 188073
188073 182206
182206 131072
1310...

output:

3781
1773
771
7328
18160
19394
1952
2
5498
1
2862
3368
7393
5130
5706
1
5996
19866
2
5123
2
12549
1496
4837
7770
16333
18175
5926
17983
19707
3820
17709
17094
4225
3824
575
5637
3660
4987
15686
2
18774
29
5068
16606
2275
16601
4544
598
845
19976
7054
882
163
2743
1683
6747
5090
1631
5109
2930
2777
1...

result:

wrong answer 1st numbers differ - expected: '3782', found: '3781'

Subtask #5:

score: 0
Wrong Answer

Test #15:

score: 0
Wrong Answer
time: 1960ms
memory: 252936kb

input:

20 200000 1000000
13 10
13 5
19 5
19 20
15 10
15 6
12 6
12 3
8 10
8 2
1 20
1 11
14 10
14 16
18 3
18 7
4 3
9 10
9 17
194055 154514
194055 148156
148156 115271
115271 198116
198116 179433
179433 171975
171975 196600
196600 167194
167194 185078
185078 191409
191409 163496
163496 178243
178243 154093
15...

output:

459
5817
10120
7654
4894
19469
3577
16028
2835
7536
1131
9925
18495
478
11867
2081
9841
7574
7285
91
1834
7391
3344
6097
19488
16462
6206
1725
5911
5596
3803
1918
698
3319
2715
19890
5606
634
751
1299
15990
2973
1654
14621
5218
2639
118
1896
3266
1935
14603
4574
7219
5890
11028
4391
7458
9754
19632
...

result:

wrong answer 10th numbers differ - expected: '7538', found: '7536'