QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#647135#7434. 冷たい部屋、一人Ihave4orangesWA 16ms154520kbC++145.5kb2024-10-17 11:57:362024-10-17 11:57:37

Judging History

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

  • [2024-10-17 11:57:37]
  • 评测
  • 测评结果:WA
  • 用时:16ms
  • 内存:154520kb
  • [2024-10-17 11:57:36]
  • 提交

answer

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int B=500;
const int B2=500;
struct NTT{
	int a[500005],s[500005];
	NTT(){memset(a,0,sizeof(a));memset(s,0,sizeof(s));}
	void add(int x){
		++a[x];
		++s[(x-1)/B2+1];
	}
	int ask(int l,int r){
		int bl=(l-1)/B2+1,br=(r-1)/B2+1;
		int res=0;
		if(bl==br){
			for(int i=l;i<=r;++i) res+=a[i];
		}else{
			for(int i=l;i<=bl*B2;++i) res+=a[i];
			for(int i=bl+1;i<br;++i) res+=s[i];
			for(int i=br*B2-B2+1;i<=r;++i) res+=a[i];
		}
		return res;
	}
};
struct Query{
	int l,r,id;
	Query(){}
	Query(int a,int b,int c){l=a;r=b;id=c;}
};
int F(int x){return x*(x-1)/2;}
struct List{
	int a[500005];
	int s[500005];
	bool b[500005];
	int to[500005];
	int top,tim;
	array<int,4> stk[2500005];
	int ans[2500005];
	void clear(){memset(b,0,sizeof(b));memset(to,0,sizeof(to));top=tim=0;}
	void geta(int* aa,int n){for(int i=1;i<=n;++i)a[i]=aa[i],s[i]=s[i-1]+a[i];}
	void insert(int x){
//		cerr<<"insert "<<x<<endl;
		++tim;
		ans[tim]=ans[tim-1];
		stk[++top]={tim,1,x,0};b[x]=1;
		if(!b[x-1]&&!b[x+1]){
			stk[++top]={tim,2,x,0};to[x]=x;
			return;
		}
		if(!b[x-1]){
			ans[tim]-=F(s[to[x+1]]-s[x]);
			stk[++top]={tim,2,x,to[x]};to[x]=to[x+1];
			stk[++top]={tim,2,x+1,to[x+1]};to[x+1]=0;
			stk[++top]={tim,2,to[x],x+1};to[to[x]]=x;
			ans[tim]+=F(s[to[x]]-s[x-1]);
		}else if(!b[x+1]){
			ans[tim]-=F(s[x-1]-s[to[x-1]-1]);
			stk[++top]={tim,2,x,to[x]};to[x]=to[x-1];
			stk[++top]={tim,2,x-1,to[x-1]};to[x-1]=0;
			stk[++top]={tim,2,to[x],x-1};to[to[x]]=x;
			ans[tim]+=F(s[x]-s[to[x]-1]);
		}else{
			ans[tim]-=F(s[x-1]-s[to[x-1]-1]);
			ans[tim]-=F(s[to[x+1]]-s[x]);
			ans[tim]+=F(s[to[x+1]]-s[to[x-1]-1]);
			int l=to[x-1],r=to[x+1];
			stk[++top]={tim,2,x-1,to[x-1]};
			stk[++top]={tim,2,x+1,to[x+1]};
			stk[++top]={tim,2,to[x-1],x-1};
			stk[++top]={tim,2,to[x+1],x+1};
			to[x-1]=0;to[x+1]=0;to[l]=r;to[r]=l;
		}
//		cerr<<ans[tim]<<endl;
	}
	void undo(int cnt){
//		cerr<<"undo "<<cnt<<endl;
		tim=max(0ll,tim-cnt);
		while(top&&stk[top][0]>tim){
			if(stk[top][1]==1) b[stk[top][2]]=stk[top][3];
			else to[stk[top][2]]=stk[top][3];
			--top;
		}
	}
	void reset(){undo(tim);}
	int ask(){return ans[tim];}
};
struct FFT{
	int n,Q,BB;
	int a[500005];
	Query q[500005];
	int ans[500005];
	vector<int> oc[500005];
	set<int> se;
	map<int,int> mp;
	vector<int> qr[500005];
	int imp[500005];
	List ls;
	void clear(){n=Q=0;se.clear();mp.clear();memset(ans,0,sizeof(ans));for(int i=1;i<=500000;++i)oc[i].clear(),qr[i].clear();ls.clear();}
	void push_back(int x,int y){a[++n]=y;se.insert(x);oc[x].push_back(n);}
	void add_query(Query qq){q[++Q]=qq;}
	void run(){
//		cerr<<"run\n";
		ls.geta(a,n);
		BB=n/sqrt(Q);
		if(BB==0) BB=1;
		int m=0;
		for(auto x:se){
			mp[x]=++m;
			imp[m]=x;
		}
		for(int i=1;i<=m;++i)
			if(imp[i]!=i) oc[i].swap(oc[imp[i]]);
		se.insert(500001);
		mp[500001]=m+1;
		for(int i=1;i<=Q;++i){
			q[i].l=mp[*se.lower_bound(q[i].l)];
			q[i].r=mp[*se.upper_bound(q[i].r)]-1;
			if(q[i].l<=q[i].r){
				if((q[i].l-1)/BB==(q[i].r-1)/BB){
					ls.reset();
					for(int j=q[i].l;j<=q[i].r;++j)
						for(auto p:oc[j]) ls.insert(p);
					ans[q[i].id]=ls.ask();
//					cerr<<"ans="<<ans[i]<<endl;
				}else qr[(q[i].l-1)/BB+1].push_back(i);
			}
		}
//		cerr<<"--------\n";
		for(int i=1;i*BB-BB+1<=n;++i){
			if(qr[i].empty()) continue;
			ls.reset();
			int ll=i*BB,l=i*BB,r=i*BB;
			ls.insert(l);
			for(auto qi:qr[i]){
				while(r<q[qi].r){
					++r;
					for(auto p:oc[r]) ls.insert(p);
				}
				while(l>q[qi].l){
					--l;
					for(auto p:oc[l]) ls.insert(p);
				}
				ans[q[qi].id]=ls.ask();
				ls.undo(ll-l);
				l=ll;
			}
		}
	}
};
int n,Q;
int a[500005],p[500005];
int cnt[500005];
vector<int> oc[500005];
vector<int> vc[500005];
vector<int> qr[500005];
int mn[20][500005],mx[20][500005];
Query q[500005];
int ans[500005];
NTT ntt1;
FFT fft1;
int askMn(int l,int r){
	int len=__lg(r-l+1);
	return min(mn[len][l],mn[len][r-(1<<len)+1]);
}
int askMx(int l,int r){
	int len=__lg(r-l+1);
	return max(mx[len][l],mx[len][r-(1<<len)+1]);
}
signed main(){
	scanf("%lld%lld",&n,&Q);
	for(int i=1;i<=n;++i) scanf("%lld",&a[i]),++cnt[a[i]],oc[a[i]].push_back(i);
	for(int i=1;i<=n;++i) scanf("%lld",&p[i]),mn[0][i]=mx[0][i]=p[i];
	for(int i=1;i<=Q;++i) q[i].id=i,scanf("%lld%lld",&q[i].l,&q[i].r);
	sort(q+1,q+Q+1,[&](Query x,Query y){return x.r<y.r;});
	for(int i=1;i<=Q;++i) qr[q[i].r].push_back(i);
	for(int i=1;i<20;++i)
		for(int j=1;j+(1<<i)-1<=n;++j){
			mn[i][j]=min(mn[i-1][j],mn[i-1][j+(1<<(i-1))]);
			mx[i][j]=max(mx[i-1][j],mx[i-1][j+(1<<(i-1))]);
		}
	for(int i=1;i<=n;++i){
//		cerr<<"i="<<i<<endl;
		sort(oc[i].begin(),oc[i].end());
		if(cnt[i]<=B){
			for(int j=0;j+1<cnt[i];++j){
				for(int k=j+1;k<cnt[i];++k){
					int l=askMn(oc[i][j],oc[i][k]);
					int r=askMx(oc[i][j],oc[i][k]);
					vc[r].push_back(l);
				}
			}
		}else{
			fft1.clear();
			for(int j=0;j<cnt[i];++j){
				fft1.push_back(p[oc[i][j]],1);
				if(j+1!=cnt[i]){
					if(oc[i][j]+1!=oc[i][j+1]){
						int l=askMn(oc[i][j]+1,oc[i][j+1]-1);
						int r=askMx(oc[i][j]+1,oc[i][j+1]-1);
						fft1.push_back(l,0);
						if(r!=l) fft1.push_back(r,0);
					}
				}
			}
			for(int j=1;j<=Q;++j) fft1.add_query(q[j]);
			fft1.run();
			for(int j=1;j<=Q;++j) ans[j]+=fft1.ans[j];
		}
	}
	for(int i=1;i<=n;++i){
		for(int x:vc[i]) ntt1.add(x);
		for(int qi:qr[i]) ans[q[qi].id]+=ntt1.ask(q[qi].l,i);
	}
	for(int i=1;i<=Q;++i) printf("%lld\n",ans[i]);
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 4ms
memory: 110344kb

input:

100 100
4 1 5 1 2 1 7 5 3 7 2 3 6 6 5 3 2 2 4 1 6 5 6 2 2 2 7 6 1 3 6 3 5 6 7 6 1 2 3 3 4 2 1 1 5 4 4 3 6 7 1 1 6 1 5 6 2 3 7 4 2 4 6 7 7 3 5 3 7 2 3 3 5 1 4 7 1 2 2 5 2 2 4 3 4 7 2 7 7 3 7 3 6 6 5 4 5 4 7 6
93 52 12 70 25 36 18 37 27 99 68 40 84 3 76 57 60 19 33 41 92 87 58 13 15 43 28 63 64 59 31 ...

output:

1
0
13
71
1
1
3
7
0
0
2
1
3
20
12
6
61
24
1
0
0
2
3
19
0
0
6
2
0
0
4
1
135
0
19
1
1
29
14
39
1
0
1
7
7
0
12
3
0
1
0
1
1
5
0
28
14
19
2
1
0
0
6
5
0
0
2
7
5
1
2
2
0
1
11
1
0
1
0
10
0
0
5
1
33
1
17
2
1
22
20
1
2
0
0
16
0
1
1
15

result:

ok 100 numbers

Test #2:

score: 0
Accepted
time: 16ms
memory: 110336kb

input:

100 100
8 8 2 8 8 12 11 8 5 5 5 1 7 6 6 11 3 13 1 12 2 2 4 1 11 13 10 7 1 2 4 3 1 12 1 5 13 8 1 5 12 5 12 4 6 3 5 4 8 3 4 1 4 3 9 2 11 9 4 8 12 3 5 13 13 1 9 12 2 13 8 13 4 13 12 5 12 13 2 6 4 4 1 6 6 9 12 7 4 3 10 7 1 7 7 10 4 12 3 9
96 87 12 73 74 78 99 76 7 77 54 88 90 86 95 94 31 83 27 11 66 91 ...

output:

0
6
2
0
0
1
16
1
1
10
7
9
2
8
2
1
3
5
0
7
2
0
2
0
1
0
7
0
0
1
108
0
0
0
6
4
1
0
2
13
0
3
0
10
0
0
1
21
0
18
0
11
0
8
13
9
0
0
0
11
12
2
1
0
2
16
1
7
0
16
0
2
3
7
0
2
10
1
4
2
6
0
0
6
3
0
0
0
5
7
0
0
6
0
7
0
4
0
3
0

result:

ok 100 numbers

Test #3:

score: 0
Accepted
time: 12ms
memory: 110468kb

input:

100 100
13 4 2 1 1 2 1 39 20 1 1 1 33 1 1 1 9 37 21 7 14 58 1 3 19 29 40 56 2 1 3 1 42 1 1 13 1 3 5 4 49 1 1 8 8 3 1 14 1 1 2 6 17 3 2 2 2 9 3 1 17 90 1 1 1 1 8 14 17 16 1 33 15 20 46 22 2 20 11 1 28 3 1 4 1 17 3 9 10 2 1 2 2 6 1 1 3 17 27 2
86 82 24 49 50 32 63 20 53 11 60 1 16 27 15 14 12 88 52 17...

output:

1
84
13
0
7
4
26
1
9
1
7
3
10
0
7
3
6
4
4
0
13
1
0
4
4
0
40
22
36
0
5
6
0
37
28
213
1
6
10
4
0
3
5
0
3
5
25
2
0
1
3
12
1
39
0
8
4
2
6
0
6
4
23
17
0
0
4
13
6
6
0
0
6
10
11
30
0
7
10
10
101
0
1
0
62
0
10
100
26
4
5
1
24
0
1
4
15
3
0
6

result:

ok 100 numbers

Test #4:

score: 0
Accepted
time: 12ms
memory: 110476kb

input:

100 100
1 1 1 1 1 36 58 18 15 1 1 2 1 1 1 1 4 10 9 2 2 4 28 1 2 1 2 2 28 27 12 6 3 10 1 1 2 1 1 2 7 40 1 4 8 17 16 3 5 1 2 2 16 5 6 1 5 3 4 11 1 1 11 51 11 4 3 7 14 16 1 11 1 2 8 3 4 1 1 3 2 5 21 7 3 10 2 2 1 20 23 1 3 6 1 1 15 3 34 1
8 1 2 3 92 48 11 43 9 71 69 5 6 7 12 26 31 45 80 83 14 16 17 25 2...

output:

29
1
9
19
6
1
3
2
0
16
15
2
11
14
24
191
25
21
33
34
19
2
0
0
11
32
1
9
2
16
24
28
9
0
123
4
6
0
13
69
271
15
47
6
0
121
0
1
15
1
9
61
0
63
10
2
2
13
55
25
12
2
40
4
3
39
14
15
0
15
2
48
6
0
0
6
0
5
0
11
3
1
78
9
12
0
0
14
15
38
7
3
0
12
10
0
1
6
0
22

result:

ok 100 numbers

Test #5:

score: 0
Accepted
time: 4ms
memory: 112380kb

input:

100 100
1 15 6 12 6 13 8 8 3 5 14 5 7 13 8 1 1 3 8 5 4 7 9 1 1 7 4 14 7 5 4 6 7 5 11 6 4 14 8 11 12 9 12 14 10 12 9 14 14 11 12 12 11 8 5 11 10 6 13 5 6 4 6 15 10 2 13 12 7 15 9 14 15 1 9 9 8 4 5 2 2 5 13 14 12 5 9 13 7 12 1 1 1 7 10 5 11 4 4 6
17 65 39 50 77 97 44 15 72 11 8 59 74 14 1 3 5 68 21 4 ...

output:

24
5
0
4
0
1
0
0
2
0
2
11
0
13
12
3
19
0
0
0
5
1
0
0
14
0
9
0
1
22
7
25
44
0
7
0
0
3
27
1
0
0
8
3
0
0
2
2
18
26
63
15
2
28
0
1
8
10
18
19
4
0
0
5
0
0
3
15
5
63
5
8
29
0
14
8
7
2
3
1
1
1
2
1
6
8
0
0
19
0
20
0
3
11
0
4
6
5
55
0

result:

ok 100 numbers

Test #6:

score: 0
Accepted
time: 13ms
memory: 138976kb

input:

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

output:

21908
618
65611
229
7839
55433
12508
4205
5
12239
31375
1958
20
2290
29810
13020
12234
5752
14318
13451
122
0
109
3852
26843
12709
11522
14307
45468
886
5020
6667
21808
3367
637
593
37
5078
2698
61
364
20500
88231
2311
39
2487
18627
3425
194
4845
54212
84095
14695
8
67509
4364
312
23989
3876
86722
1...

result:

ok 5000 numbers

Test #7:

score: 0
Accepted
time: 12ms
memory: 137740kb

input:

5000 5000
15 86 121 63 26 26 74 43 35 32 48 131 61 120 103 48 101 1 70 97 130 105 30 38 68 141 85 141 108 17 143 106 47 90 4 68 63 8 79 26 10 66 48 61 18 75 62 84 80 113 20 27 109 102 32 13 20 63 12 53 112 146 33 27 49 110 55 132 121 67 75 18 38 80 140 62 7 20 104 4 42 91 67 20 127 77 13 141 64 3 28...

output:

0
132
8
26
0
32
1
61
40
0
0
0
0
18
49
15
0
14
2
63
24
9
10
94
10
21
1
2
1
6
17
21
1
83
19
9
0
21
67
8
13
0
0
0
13
1
0
21
0
13
1
123
0
0
8
0
0
10
14
2
32
2
8
53
29
0
23
6
6
0
0
13
0
1
0
3
0
0
1
0
5
15
15
0
4
4
1
0
1
0
0
2
1
0
0
0
0
1
2
1
11
23
45
1
0
9
14
104
60
8
3
1
2
38
34
32
1
0
0
38
27
18
62
0
5...

result:

ok 5000 numbers

Test #8:

score: -100
Wrong Answer
time: 16ms
memory: 154520kb

input:

5000 5000
342 3 498 1667 87 63 8 215 1 25 67 5 7 600 1 1 51 14 6 1990 7 2707 105 637 5 805 328 74 1 57 316 236 6 1 1 700 965 2 493 21 12 2 1 1626 1 1352 11 109 1 2253 70 4 788 55 140 1 2 1 57 21 1 530 3060 62 266 86 32 1861 1 173 2 2 234 1 402 1392 101 9 7 1 8 3 8 137 46 4 17 212 1 4 10 6 1389 200 4...

output:

31001
313
213
102
965
1000
240
4493
59
10355
1879
35
1756
161454
1195
1314
387
227
1144
30655
414
108476
122174
534
29919
24
67
123016
1285
28309
2403
4832
360
4067
16
136
11028
1
56797
0
1799
300
151202
8
253
26566
121966
126161
119276
4078
21
122331
475
103019
4
295
179
31917
121230
186811
53
1218...

result:

wrong answer 1st numbers differ - expected: '31295', found: '31001'