QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#139973#4891. 树上的孤独zhouhuanyi0 1848ms253084kbC++145.0kb2023-08-14 20:49:532023-08-14 20:49:53

Judging History

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

  • [2023-08-14 20:49:53]
  • 评测
  • 测评结果:0
  • 用时:1848ms
  • 内存:253084kb
  • [2023-08-14 20:49:53]
  • 提交

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]&&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;
}


详细

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 8ms
memory: 58288kb

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
44
19
54
192
25
69
21
21
200
78
94
137
33
68
68
54
35
24
10
24
78
64
101
27
200
42
76
97
21
93
36
197
76
29
50
11
20
55
62
24
5
109
158
23
21
15
102
36
116
26
78
171
82
32
148
134
9
137
33
114
150
119
72
35
69
18
40
57
50
54
14
35
154
118
138
157
200
21
80
84
37
73
26
28
40
150
55
63
51
95
...

result:

wrong answer 14th numbers differ - expected: '88', found: '94'

Subtask #2:

score: 0
Wrong Answer

Test #3:

score: 0
Wrong Answer
time: 1032ms
memory: 232360kb

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
17598
3898
3423
16
518
5138
11356
21
7340
21
18347
15760
6643
514
1184
6110
1889
6247
662
16738
13243
1597
5446
6079
2388
6266
2
21
282
3517
1807
1236
1038
17804
4658
5539
4633
4547
21
244
2704
2
4610
8571
4037
21
13498
5651
2054
3490
4868
5829
802
2072
1482
13232
2593
938
16769
2
17624
354
5
21
7...

result:

wrong answer 2nd numbers differ - expected: '17595', found: '17598'

Subtask #3:

score: 0
Wrong Answer

Test #7:

score: 0
Wrong Answer
time: 309ms
memory: 146784kb

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:

2568
612
8337
9003
3561
9200
670
301
2479
7307
2682
1175
1403
1268
8228
4407
109
2699
641
4476
3171
9202
21
8980
2092
9950
8009
9945
21
5043
87
2041
1881
19
1295
2185
336
1101
9386
3480
7726
1957
2741
1256
2331
717
21
545
21
448
699
2332
447
18
38
1424
2321
693
2459
21
2320
716
9999
8
196
1366
8952
...

result:

wrong answer 4th numbers differ - expected: '8985', found: '9003'

Subtask #4:

score: 0
Wrong Answer

Test #13:

score: 0
Wrong Answer
time: 896ms
memory: 247828kb

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:

3782
1773
771
7329
18161
19394
1952
2
5498
2
2859
3369
7393
5131
5707
2
6001
19866
2
5123
2
12549
1497
4837
7770
16334
18176
5926
17984
19712
3821
17710
17093
4226
3822
576
5637
3660
4987
15686
2
18774
29
5068
16606
2276
16602
4544
598
845
19976
7054
882
164
2744
1683
6747
5091
1632
5137
2931
2778
1...

result:

wrong answer 4th numbers differ - expected: '7328', found: '7329'

Subtask #5:

score: 0
Wrong Answer

Test #15:

score: 0
Wrong Answer
time: 1848ms
memory: 253084kb

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
7656
4881
19469
3577
16028
2835
7538
1131
9925
18495
498
11877
2133
9859
7579
7279
111
1854
7391
3350
6100
19488
16462
6208
1725
5926
5596
3823
1918
718
3319
2715
19897
5601
632
753
1301
16010
2973
1674
14671
5218
2639
118
1896
3266
1935
14603
4578
7219
5910
11036
4392
7462
9754
19632...

result:

wrong answer 4th numbers differ - expected: '7654', found: '7656'