QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#422441#964. Excluded MinJohnAlfnovML 43ms267192kbC++143.9kb2024-05-27 14:38:252024-05-27 14:38:27

Judging History

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

  • [2024-05-27 14:38:27]
  • 评测
  • 测评结果:ML
  • 用时:43ms
  • 内存:267192kb
  • [2024-05-27 14:38:25]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
int n,q,a[500005];
struct apple{
	int l,r,wz;
	bool operator<(const apple &other)const{
		if(l==other.l)return r>other.r;
		return l<other.l;
	}
}e[500005];
int id[500005];
int ls[10000005],rs[10000005],tot=0;
int xz;
vector<int>gg[10500005];
int deg[10500005];
void addedge(int x,int y){
	gg[x].emplace_back(y);++deg[y];
}
void add(int x,int y,int l,int r,int z){
	if(l==r){
		if(x)addedge(y+q,x+q);
		addedge(y+q,xz);
		return;
	}
	int mid=(l+r)>>1;
	ls[y]=ls[x],rs[y]=rs[x];
	if(z<=mid)add(ls[x],ls[y]=++tot,l,mid,z);
	else add(rs[x],rs[y]=++tot,mid+1,r,z);
}
void query(int x,int l,int r,int ll,int rr){
	if(l>=ll&&r<=rr){
		addedge(xz,x+q);
		return;
	}
	int mid=(l+r)>>1;
	if(mid>=ll&&ls[x])query(ls[x],l,mid,ll,rr);
	if(mid<rr&&rs[x])query(rs[x],mid+1,r,ll,rr);
}
#define M 500000
vector<int>g[500005];
int ans[500005];
int c[500005];
void addf(int x,int s){
	while(x<=n){
		c[x]+=s;
		x+=x&-x;
	}
}
int queryf(int x){
	int ans=0;
	while(x){
		ans+=c[x];
		x-=x&-x;
	}
	return ans;
}
int sm[1200005],s2[1200005],lz[1200005];
void pushdown(int o){
	if(!lz[o])return;
	sm[o<<1]+=lz[o],lz[o<<1]+=lz[o];
	sm[o<<1|1]+=lz[o],lz[o<<1|1]+=lz[o];
	lz[o]=0;
}
void build(int l,int r,int o){
	if(l==r){
		sm[o]=-1e9,s2[o]=l;
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,o<<1);
	build(mid+1,r,o<<1|1);
	if(sm[o<<1]>sm[o<<1|1])sm[o]=sm[o<<1],s2[o]=s2[o<<1];
	else sm[o]=sm[o<<1|1],s2[o]=s2[o<<1|1];
}
void modify(int l,int r,int o,int x,int z){
	if(l==r){
		sm[o]=z;
		return;
	}
	pushdown(o);
	int mid=(l+r)>>1;
	if(x<=mid)modify(l,mid,o<<1,x,z);
	else modify(mid+1,r,o<<1|1,x,z);
	if(sm[o<<1]>sm[o<<1|1])sm[o]=sm[o<<1],s2[o]=s2[o<<1];
	else sm[o]=sm[o<<1|1],s2[o]=s2[o<<1|1];
}
void addd(int l,int r,int o,int ll,int rr,int s){
	if(l>=ll&&r<=rr){
		sm[o]+=s;lz[o]+=s;
		return;
	}
	pushdown(o);
	int mid=(l+r)>>1;
	if(mid>=ll)addd(l,mid,o<<1,ll,rr,s);
	if(mid<rr)addd(mid+1,r,o<<1|1,ll,rr,s);
	if(sm[o<<1]>sm[o<<1|1])sm[o]=sm[o<<1],s2[o]=s2[o<<1];
	else sm[o]=sm[o<<1|1],s2[o]=s2[o<<1|1];
}
set<pair<int,int>>se1,se2;
void jia(int z){
	int zz=queryf(e[z].r)-queryf(e[z].l-1);
	modify(1,q,1,z,zz);
	se1.emplace(e[z].l,z);
	se2.emplace(e[z].r,z);
}
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;++i){
		scanf("%d",&a[i]);
		g[a[i]].emplace_back(i);
	}
	for(int i=1;i<=q;++i){
		scanf("%d%d",&e[i].l,&e[i].r);
		e[i].wz=i;
	}
	sort(e+1,e+q+1);
	for(int i=q;i>=1;--i){
		xz=i;
		add(id[i+1],id[i]=++tot,1,n,e[i].r);
		if(id[i+1])query(id[i+1],1,n,1,e[i].r);
	}
	for(int i=1;i<=tot;++i){
		if(ls[i])addedge(i+q,ls[i]+q);
		if(rs[i])addedge(i+q,rs[i]+q);
	}
	for(int i=1;i<=n;++i){
		addf(i,1);
	}
	build(1,q,1);
	queue<int>qu;
	for(int i=1;i<=tot+q;++i)if(!deg[i]){
		if(i<=q){
			jia(i);
		}else{
			qu.emplace(i);
		}
	}
	while(qu.size()){
		int y=qu.front();qu.pop();
		for(auto cu:gg[y]){
			--deg[cu];
			if(!deg[cu]){
				if(cu<=q){
					jia(cu);
				}else{
					qu.emplace(cu);
				}
			}
		}
	}
	for(int an=M;an>=0;--an){
		while(sm[1]>=an+1){
			int t=s2[1];
			se1.erase(make_pair(e[t].l,t));
			se2.erase(make_pair(e[t].r,t));
			ans[e[t].wz]=an+1;
			modify(1,q,1,t,-1e9);
			for(auto cu:gg[t]){
				--deg[cu];
				if(!deg[cu]){
					if(cu<=q){
						jia(cu);
					}else{
						qu.emplace(cu);
					}
				}
			}
			while(qu.size()){
				int y=qu.front();qu.pop();
				for(auto cu:gg[y]){
					--deg[cu];
					if(!deg[cu]){
						if(cu<=q){
							jia(cu);
						}else{
							qu.emplace(cu);
						}
					}
				}
			}
		}
		for(auto x:g[an]){
			addf(x,-1);
			auto t1=se2.lower_bound(make_pair(x,0));
			auto t2=se1.lower_bound(make_pair(x+1,0));
			if(t1!=se2.end()){
				int L=(*t1).second;
				int R=n;
				if(t2!=se1.end())R=(*t2).second-1;
				if(L<=R)addd(1,q,1,L,R,-1);
			}
		}
	}
	for(int i=1;i<=q;++i)printf("%d\n",ans[i]);
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 40ms
memory: 262936kb

input:

3 3
0 0 2
1 3
2 3
3 3

output:

3
1
0

result:

ok 3 number(s): "3 1 0"

Test #2:

score: 0
Accepted
time: 35ms
memory: 263164kb

input:

3 2
1 2 2
1 2
1 3

output:

0
3

result:

ok 2 number(s): "0 3"

Test #3:

score: 0
Accepted
time: 38ms
memory: 263704kb

input:

10 10
3 0 3 3 9 7 9 6 0 7
3 3
9 9
4 6
1 9
3 4
2 4
7 10
3 7
5 7
2 7

output:

0
1
0
5
0
1
1
0
0
1

result:

ok 10 numbers

Test #4:

score: 0
Accepted
time: 39ms
memory: 267192kb

input:

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

output:

1
0
2
7
1
4
0
2
8
3

result:

ok 10 numbers

Test #5:

score: 0
Accepted
time: 37ms
memory: 264428kb

input:

100 100
15 82 7 39 63 55 64 99 71 63 32 99 67 94 3 43 15 75 45 55 53 4 35 36 15 40 82 20 62 43 6 83 27 95 27 45 98 44 35 98 39 7 17 32 76 7 40 16 40 63 13 8 22 27 11 12 61 14 19 45 100 97 90 88 22 59 25 63 4 25 65 16 22 92 84 44 99 66 89 26 93 97 35 97 92 1 32 40 97 97 78 43 7 12 23 53 61 74 33 90
1...

output:

68
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
48
0
0
0
0
0
0
0
0
0
0
0
0
0
28
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 100 numbers

Test #6:

score: 0
Accepted
time: 42ms
memory: 262576kb

input:

100 100
17 86 33 8 11 27 8 11 13 9 3 43 11 23 26 42 44 12 44 12 15 0 75 51 72 5 49 2 40 57 24 47 39 42 4 5 6 52 3 2 42 19 62 33 24 22 16 69 4 33 44 70 29 11 2 2 58 9 6 10 25 10 33 26 17 3 14 0 48 7 48 51 0 39 54 37 14 9 3 85 18 4 25 9 2 0 39 8 17 13 25 45 10 39 12 18 9 5 66 6
13 89
10 90
42 67
43 52...

output:

76
80
0
0
18
1
18
1
5
5
1
1
22
11
0
15
0
59
5
56
1
80
0
1
1
21
0
61
22
11
0
3
8
15
40
1
8
81
71
20
2
0
60
0
60
31
0
59
0
0
0
28
0
21
1
7
5
0
31
0
76
28
0
0
27
1
23
0
1
27
1
0
0
1
0
5
63
52
2
43
73
1
86
0
61
0
27
2
30
5
31
1
0
14
59
27
1
1
67
63

result:

ok 100 numbers

Test #7:

score: 0
Accepted
time: 35ms
memory: 263064kb

input:

100 100
6 1 1 5 13 11 35 5 3 2 0 4 0 9 1 2 3 3 19 1 7 9 7 11 7 8 10 18 28 17 31 2 4 8 2 3 3 2 22 4 9 4 7 2 9 15 8 2 3 19 5 24 3 10 11 5 9 20 8 4 11 10 18 9 13 34 5 34 2 9 24 6 21 16 6 12 26 2 2 2 6 11 2 14 3 8 2 12 2 19 8 3 18 23 5 21 23 8 4 0
44 67
25 74
24 79
59 73
4 81
42 66
48 55
15 38
35 63
16 ...

output:

22
50
56
0
78
23
0
22
29
24
38
37
17
57
0
6
0
58
52
4
64
44
0
37
75
75
34
89
0
4
0
12
39
0
0
69
53
14
38
13
36
30
0
7
46
83
28
6
44
22
40
50
24
26
36
49
0
0
6
49
27
78
0
37
11
49
16
50
25
30
37
58
64
28
62
36
0
52
0
95
34
4
50
17
0
27
44
0
0
21
44
66
69
0
39
25
0
2
63
0

result:

ok 100 numbers

Test #8:

score: 0
Accepted
time: 43ms
memory: 263976kb

input:

100 100
0 1 0 1 0 1 1 1 0 2 1 1 2 0 1 1 0 3 0 0 0 0 0 0 0 0 1 2 2 0 0 0 0 1 0 0 1 2 0 0 1 0 0 3 0 1 0 0 3 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 2 0 0 0 4 0 1 1 0 1 0 2 2 0 0 1
41 53
31 36
78 99
60 86
1 67
3 92
89 92
60 70
42 56
42 46
39 84
40 66
9 27
75 78
33 94
17 53...

output:

13
6
22
27
67
90
3
11
15
5
46
27
19
4
62
37
84
35
53
4
47
95
55
63
24
39
22
51
67
21
55
36
24
16
33
74
4
16
63
81
41
14
3
54
6
40
36
33
29
32
14
60
13
17
73
44
34
2
14
79
59
13
75
72
31
10
22
57
23
37
74
2
6
6
38
5
4
62
66
22
33
0
23
21
12
54
75
6
8
16
37
36
3
53
63
18
67
60
31
19

result:

ok 100 numbers

Test #9:

score: -100
Memory Limit Exceeded

input:

300000 300000
216504 101790 177261 84423 215788 67188 170620 125383 222808 149722 190483 152974 27524 172557 109218 201761 138030 177265 270417 244027 29296 13565 108388 270622 75102 137755 134081 21988 249714 268911 178911 39288 197287 232628 152784 226739 40134 213404 230781 181323 235763 55745 44...

output:

1
3
0
0
1
1
0
11
0
0
3
1
0
0
1
1
0
0
0
0
3
0
1
1
1
1
1
1
0
0
0
0
0
1
1
13
0
0
0
11
0
1
1
1
3
0
1
1
0
0
0
0
0
0
1
0
0
0
3
0
13
1
1
14
3
0
0
1
0
0
1
1
1
1
0
0
3
0
1
0
0
3
1
1
0
0
0
3
0
0
1
1
0
1
1
0
1
0
0
1
1
0
0
1
1
1
0
1
0
1
1
1
1
0
0
0
0
11
1
0
0
0
13
0
0
3
0
1
0
1
0
0
1
0
3
0
3
1
0
0
0
1
1
13
1
1
...

result: