QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#843364 | #9963. Express Rotations | ucup-team3586# | WA | 3ms | 14156kb | C++23 | 2.2kb | 2025-01-04 18:18:00 | 2025-01-04 18:18:01 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
#define ll long long
ll F[N],G[N],f[N],g[N],t[N];
vector<int>h[N<<1];
const int P=1e6+1;
const ll I=1e18;
void ad(ll &x,ll y){if(x>y)x=y;}
ll s[N],S;
void doi(int n,ll w){
if(n==1){G[1]=F[1];return;}
t[0]=0;
for(int i=1;i<=n;i++)s[i]=s[i-1]+t[i-1],G[i]=I;
t[0]=t[n],S=s[n]+t[n];
ll p1=I,p2=I;
for(int i=1;i<=n;i++){
ad(G[i],p1+s[i]-t[i-1]*2+S+w*(n-i));
ad(G[i],p2-s[i]+S*2-t[i]*2+w*(n-i-1));
ad(p1,F[i]-s[i]+w*i),ad(p2,F[i]+s[i]+w*i);
}
p1=p2=I;
for(int i=n;i;i--){
ad(G[i],p1+S*2+s[i]-t[i-1]*2-w*i);
ad(G[i],p2-s[i]-t[i]*2+S+w*(i-1));
ad(p1,F[i]-s[i]+w*i);
ad(p2,F[i]+s[i]+w*i);
}
/*for(int i=1;i<n;i++)for(int j=i+1;j<=n;j++)
ad(G[j],F[i]+s[j]-s[i]-t[j-1]*2+w*(n-j+i)+S),
ad(G[j],F[i]+S-s[j]+s[i]-t[j]*2+w*(n-j+i-1)+S),
ad(G[i],F[j]+S-s[j]+s[i]-t[i-1]*2+w*(j-i)+S),
ad(G[i],F[j]+s[j]-s[i]-t[i]*2+w*(j-i-1)+S);*/
}
#define pb push_back
ll tr[N];int n;
void ADD(int x,ll z){
for(;x<=n;x+=(x&-x))tr[x]+=z;
}
ll ask(int x){
ll s=0;
for(;x;x-=(x&-x))s+=tr[x];
return s;
}
ll ab(int l,int r){
if(l<r)return ask(r)-ask(l);
return ask(n)-(ask(l)-ask(r));
}
int a[N];
int main(){
scanf("%d",&n);n++;
a[1]=P;
for(int i=2;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)ADD(i,a[i]),h[a[i]].pb(i);
int w=0;
for(int i=1;i<=n;i++)f[i]=g[i]=I;
for(int i=P;i;i--)if(!h[i].empty()){
for(int x:h[i])ADD(x,-i);
if(!w){w=i,f[1]=g[1]=0;continue;}
int sz=h[i].size();
for(int x:h[w]){
int o=lower_bound(h[i].begin(),h[i].end(),x)-h[i].begin();
int q=(o<sz)?h[i][o]:h[i][0];
ad(f[q],g[x]+ab(x,q));
o--;
q=(o>=0)?h[i][o]:h[i][sz-1];
ad(f[q],g[x]+ab(q,x)+i);
}
for(int j=0;j<sz;j++)t[j+1]=ab(h[i][j],h[i][(j+1)%sz]),F[j+1]=f[h[i][j]];
doi(sz,i);
for(int j=0;j<sz;j++)g[h[i][j]]=G[j+1];
w=i;
}
ll ans=I;
for(int x:h[w])ad(ans,g[x]);
printf("%lld",ans);
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 14064kb
input:
6 6 10 6 5 4 5
output:
16
result:
ok 1 number(s): "16"
Test #2:
score: 0
Accepted
time: 3ms
memory: 14156kb
input:
1 525434
output:
0
result:
ok 1 number(s): "0"
Test #3:
score: -100
Wrong Answer
time: 0ms
memory: 14044kb
input:
20 724315 660084 703741 660084 33388 703741 724315 608476 703741 33388 660084 33388 703741 703741 724315 33388 660084 703741 703741 33388
output:
12728345
result:
wrong answer 1st numbers differ - expected: '10450373', found: '12728345'