QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#456393#8547. Whose Land?kkkgjyismine4RE 279ms35360kbC++236.0kb2024-06-27 20:44:532024-06-27 20:44:53

Judging History

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

  • [2024-06-27 20:44:53]
  • 评测
  • 测评结果:RE
  • 用时:279ms
  • 内存:35360kb
  • [2024-06-27 20:44:53]
  • 提交

answer

#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r>>1)
#define vi vector<int>
#define mp make_pair
using namespace std;
const ll mod=998244353;
ll val[100050];int N,K,Q,mark[100050];
vector<int>Vis[100050];
vector<pii>d[100050][21],Vec[100050];
vector<int>road[100050];
int sz[100500],hson[100050],dfn[100050],low[100050],tot,Top[100050],dep[100050],fa[100050];
void dfs(int u,int f){
	sz[u]=1,hson[u]=-1;
	for(int v:road[u]){
		if(v==f)continue;
		dep[v]=dep[u]+1,dfs(v,u),fa[v]=u,sz[u]+=sz[v];
		if(hson[u]==-1||sz[v]>sz[hson[u]])hson[u]=v;
	}
}
void dfs1(int u,int g){
	Top[u]=g;if(hson[u]!=-1)dfs1(hson[u],g);
	for(int v:road[u])if(dep[v]>dep[u]&&v!=hson[u])dfs1(v,v);
}
int tt2,bl[100050];
void getid(int u){
	if(!mark[u])dfn[u]=++tot;
	else{
		bl[u]=++tt2;
		if(dep[u]<=K+1)Vis[1].pb(u);
		else{
			int p=u,ct=K;while(ct--)p=fa[p];
			Vis[p].pb(u);
		}
	}
	if(hson[u]!=-1)getid(hson[u]);
	for(int v:road[u])if(dep[v]>dep[u]&&v!=hson[u])getid(v);
}
bool cmp(int a,int b){
	if(dep[a]==dep[b])return bl[a]<bl[b];
	return dep[a]<dep[b];
}
pii c[100500];int tt;
void merge(vector<pii> &a,vector<pii> &b){
    int n1=0,n2=0;tt=0;
    while(n1<a.size()&&n2<b.size()){
    	if(a[n1].fi<b[n2].fi)c[++tt]=a[n1++];
    	else c[++tt]=b[n2++];
	}
	while(n1<a.size())c[++tt]=a[n1++];
	while(n2<b.size())c[++tt]=b[n2++];a.clear();
	for(int i=1;i<=tt;){
		int R=i;while(R<tt&&c[R+1].fi==c[R].se+1)++R;
		a.pb(make_pair(c[i].fi,c[R].se));i=R+1;
	}
}
int Mx=0,Tot;
void init(int u){
    Vec[u].pb(mp(dfn[u],dfn[u]));d[u][0].pb(mp(dfn[u],dfn[u]));
    for(int v:road[u]){
    	if(dep[v]<dep[u])continue;
		init(v);merge(Vec[u],Vec[v]);
    	for(int i=0;i<K;++i)if(d[v][i].size())merge(d[u][i+1],d[v][i]);
	}
	for(int i=0;i<=K;++i){
		int Ct=0;
		for(auto v:d[u][i])if(v.fi<=Tot)++Ct;
		Mx=max(Mx,Ct);
	}
}
queue<int>q;
struct BIT{
	int ct[100005];
	void init(){
		for(int i=0;i<=N;++i)ct[i]=0;
	}
	void add(int p,int o){
		if(!p){ct[p]+=o;return;}
		for(int i=p;i<=N;i+=(i&-i))ct[i]+=o;
	}
	int qry(int p){
		int ans=0;
		for(int i=p;i;i&=(i-1))ans+=ct[i];
		return ans;
	}
}fwk;
typedef unsigned long long ull;
ull *A[4];
void Init(){
	A[0]=new ull[1<<18];
	A[1]=new ull[1<<12];
	A[2]=new ull[1<<6];
	A[3]=new ull [1];
}
void ins(int x){
	for(int i=0;i<4;i++,x>>=6){
		if(A[i][x>>6]&(1ull<<(x&63)))return;
		A[i][x>>6]|=1ull<<(x&63);
	}
}
void del(int x){
	if(A[0][x>>6]&(1ull<<(x&63))==0)return;
	for(int i=0;i<4;i++,x>>=6){
		A[i][x>>6]^=1ull<<(x&63);
		if(A[i][x>>6]!=0)return;
	}
}
int pre(int x){
	++x;
	int i,pre;
	for(i=0;;i++,x>>=6){
		if(i==4)return -1;
		ull s=A[i][x>>6]&((1ull<<(x&63))-1);
		if(!s)continue;
		pre=63-__builtin_clzll(s);
		pre=x&(~63)|pre;
		break;
	}
	for(;i;i--)pre=pre<<6|63-__builtin_clzll(A[i-1][pre]);
	return pre;
}
int nxt(int x){
	--x;
	int i,nxt;
	for(i=0;;i++,x>>=6){
		if(i==4)return -1;
		if((x&63)==63)continue;
		ull s=A[i][x>>6]>>((x&63)+1);
		if(!s)continue;
		nxt=x+1+__builtin_ctzll(s);
		nxt=x&(~63)|nxt;
		break;
	}
	for(;i;i--)nxt=nxt<<6|__builtin_ctzll(A[i-1][nxt]);
	return nxt;
}
int col[100005],stk[100005],tail,st[100005],tl;
//set<int>pos;
void cv(int l,int r,int c){
	tl=0;
	for(int p=nxt(l);p<=r;p=nxt(p+1))st[++tl]=p;
	int Rg=nxt(r+1),lf,rg;
	if(l>1){
	//	set<int>::iterator it=pos.lower_bound(l);
	//	assert(it!=pos.begin()&&it!=pos.end());
		rg=nxt(l),lf=pre(l-1);
		fwk.add(col[lf],-(min(rg,r+1)-l));
	}
	ins(r+1);
	if(Rg==r+1);
	else if(tl&&Rg>r+1)col[r+1]=col[st[tl]];
	else if(l>1)col[r+1]=col[lf];
	else col[r+1]=0;
	int lst=r;
	while(tl)fwk.add(col[st[tl]],-(lst-st[tl]+1)),del(st[tl]),lst=st[tl]-1,--tl;
	col[l]=c,ins(l),fwk.add(c,r-l+1);
}
void Add(int p){
	int c=p;
	tail=0;stk[0]=p;int nk=K;
	while(p!=1&&nk){p=fa[p];stk[++tail]=p;--nk;}
	for(int i=0;i<=tail;++i){
	    for(auto v:d[stk[i]][K-i])cv(v.fi,v.se,c);
		if(K-i-1>=0)for(auto v:d[stk[i]][K-i-1])cv(v.fi,v.se,c);
		if(i==tail)
		  for(int j=K-i-2;j>=0;--j)
		    for(auto v:d[stk[i]][j])cv(v.fi,v.se,c);
	}
}
int ql[500005],Ans[500050];
#define pb push_back
vector<int>que[100005];
#define getchar() p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin), p1 == p2) ? EOF : *p1++
#define putchar(x) (p3 - obuf < 1000000) ? (*p3++ = x) : (fwrite(obuf, p3 - obuf, 1, stdout), p3 = obuf, *p3++ = x)
static char buf[2999999], *p1 = buf, *p2 = buf, obuf[2999999], *p3 = obuf;
template <typename item>
inline void read (register item &x) {
    x = 0;
	register char c = getchar();
    while (c < '0' || c > '9') c = getchar();
    while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
}
static char cc[15];
template <typename item>
inline void print (register item x) {
	register int len = 0;
	do cc[len++] = x % 10 + '0', x /= 10; while (x);
	while (len--) putchar(cc[len]);
}
void solve(){
	Init(); 
	read(N),read(K),read(Q),fwk.init();
	for(int i=1;i<=N;++i){
		que[i].clear(),road[i].clear(),Vis[i].clear(),fa[i]=0,Vec[i].clear(),col[i]=0,dfn[i]=dep[i]=mark[i]=0,hson[i]=-1;
		for(int j=0;j<=K;++j)d[i][j].clear();
	}
	tot=Tot=0;
    for(int i=1;i<N;++i){int u,v;read(u),read(v);road[u].pb(v),road[v].pb(u);}
    dep[1]=1;dfs(1,-1),dfs1(1,1);
    for(int i=1;i<=N;++i)if(dep[i]-dep[Top[i]]<=K)mark[i]=1;
	getid(1);Tot=tot;
	q.push(1);
	while(!q.empty()){
		int u=q.front();q.pop();
		if(u==1)sort(Vis[u].begin(),Vis[u].end(),cmp);
		for(auto v:Vis[u])dfn[v]=++tot;
		if(hson[u]!=-1)q.push(hson[u]);
		for(int v:road[u])if(dep[v]>dep[u]&&v!=hson[u])q.push(v);
	}
	init(1),ins(1),ins(N+1),fwk.ct[0]=N;
	for(int i=1,r;i<=Q;++i)read(ql[i]),read(r),que[r].pb(i);
	for(int i=1;i<=N;++i){
		Add(i);
		for(auto v:que[i])Ans[v]=N-fwk.qry(ql[v]-1)-fwk.ct[0];
	}
	for(int i=1;i<=Q;++i)print(Ans[i]),putchar('\n');
}
int main(){
    int T;read(T);
    while(T--)solve();
    fwrite(obuf,p3-obuf,1,stdout);
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 5ms
memory: 18232kb

input:

2
5 1 2
1 2
1 3
2 4
2 5
2 2
2 3
8 2 3
1 2
1 3
2 4
2 5
4 6
5 7
7 8
2 2
2 5
3 4

output:

4
5
7
8
6

result:

ok 5 number(s): "4 5 7 8 6"

Test #2:

score: 0
Accepted
time: 157ms
memory: 31156kb

input:

1000
500 1 500
291 2
406 9
207 13
71 15
351 17
442 18
496 19
104 20
208 23
448 34
80 42
187 44
352 45
290 46
116 47
318 50
226 52
129 55
83 59
100 60
54 61
73 65
63 66
454 67
43 71
26 74
68 26
320 75
388 76
425 79
170 81
350 83
48 85
153 86
221 90
290 95
130 96
82 98
124 82
36 99
213 100
121 101
132...

output:

255
386
356
124
315
330
437
8
335
423
398
338
180
242
352
500
145
44
342
261
92
326
38
291
259
71
137
456
171
24
162
453
283
325
250
319
478
460
77
354
56
393
372
217
395
265
188
256
134
68
205
429
436
346
300
462
324
170
291
406
207
480
198
182
489
61
476
127
289
204
282
374
114
406
488
366
121
190...

result:

ok 500000 numbers

Test #3:

score: 0
Accepted
time: 200ms
memory: 35320kb

input:

1000
500 2 500
260 2
93 3
399 4
227 5
238 6
382 7
35 12
194 24
141 26
463 27
497 30
102 31
410 32
308 34
357 42
271 43
208 44
446 46
262 50
457 51
467 52
294 53
424 54
267 56
210 58
48 59
339 48
407 65
320 66
33 68
78 33
79 71
315 72
390 74
128 76
83 81
244 87
375 91
79 93
225 94
1 97
433 1
172 100
...

output:

496
471
423
489
270
388
451
329
495
104
453
321
500
357
24
429
409
496
491
454
469
119
495
460
432
450
496
494
459
435
211
298
426
260
371
490
498
259
490
494
492
477
336
412
425
431
235
445
482
422
296
495
361
407
465
492
497
500
394
222
500
500
500
498
470
470
152
414
337
412
325
387
89
492
313
45...

result:

ok 500000 numbers

Test #4:

score: 0
Accepted
time: 242ms
memory: 31248kb

input:

1000
500 3 500
333 1
268 2
183 3
394 5
420 7
322 12
87 14
285 21
178 23
82 36
106 38
28 49
364 28
30 56
110 57
211 58
486 62
456 66
337 67
222 68
175 76
15 81
489 82
79 91
376 79
274 93
417 94
302 96
457 98
142 102
486 103
13 104
186 111
128 114
35 115
184 117
167 118
156 119
429 120
414 122
84 126
...

output:

478
489
465
360
439
28
488
133
75
497
373
470
496
499
487
141
476
500
381
489
495
171
414
372
449
236
489
422
432
373
488
298
480
473
98
500
474
496
449
446
500
487
110
213
499
446
152
283
322
497
304
245
371
218
323
500
416
485
499
439
480
430
489
496
488
405
483
500
339
476
483
497
494
309
258
358...

result:

ok 500000 numbers

Test #5:

score: 0
Accepted
time: 279ms
memory: 35360kb

input:

1000
500 4 500
109 1
252 5
375 6
50 7
398 11
465 13
127 14
79 15
112 18
301 20
23 22
442 27
219 31
48 35
351 36
460 37
368 40
465 43
16 45
79 48
383 50
32 53
42 32
496 42
54 56
193 54
187 61
93 62
389 63
147 65
86 66
231 67
261 70
365 71
249 88
181 90
77 94
437 98
384 101
411 102
64 103
364 104
456 ...

output:

500
497
379
500
248
492
499
500
325
384
492
365
395
491
130
435
496
340
500
500
478
470
500
346
499
495
164
496
499
498
500
500
326
432
444
500
500
480
500
328
486
500
500
90
463
499
48
387
500
495
478
446
488
81
487
426
500
490
488
351
499
500
497
500
362
431
249
495
491
495
500
494
367
500
420
496...

result:

ok 500000 numbers

Test #6:

score: -100
Runtime Error

input:

100
5000 1 5000
4598 1
104 3
1813 7
3677 9
4212 10
739 14
4927 16
3896 17
2012 23
4512 25
1751 26
1487 29
2610 30
3912 31
733 33
4844 39
1179 40
5 43
174 45
4787 47
2500 48
3783 50
2905 54
1943 55
1296 56
4178 59
1021 63
4614 70
4221 71
4782 74
1802 75
4912 76
1839 80
4494 81
3403 82
2355 84
756 91
...

output:


result: