QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#647197 | #7434. 冷たい部屋、一人 | Ihave4oranges | WA | 20ms | 156568kb | C++14 | 5.5kb | 2024-10-17 12:37:05 | 2024-10-17 12:37:06 |
Judging History
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);
}
int cnt=0;
while(l>q[qi].l){
--l;
for(auto p:oc[l]) ls.insert(p),++cnt;
}
ans[q[qi].id]=ls.ask();
ls.undo(cnt);
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;
}
详细
Test #1:
score: 100
Accepted
time: 20ms
memory: 110428kb
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: 8ms
memory: 112332kb
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: 14ms
memory: 112520kb
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: 112544kb
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: 8ms
memory: 110280kb
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: 12ms
memory: 137076kb
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: 137588kb
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: 20ms
memory: 156568kb
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'