QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#843406 | #9963. Express Rotations | ucup-team3510# | WA | 6ms | 22264kb | C++20 | 2.1kb | 2025-01-04 18:45:59 | 2025-01-04 18:46:05 |
Judging History
answer
#include <bits/stdc++.h>
#define N 1000011
#define ll long long
using namespace std;
int n,a[N];
vector<int> va[N],vv;
const int A=1e6;
ll dp[N],ndp[N],f[N],suml[N],sumle[N];
int prv[N],nxt[N],nxtle[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d",a+i),a[n+i]=a[i],va[a[i]].push_back(i);
int lst=A+1;
memset(dp,0x3f,sizeof(dp));
for(int x=A;x;--x)if(!va[x].empty())
{//printf("===============================x:%d\n",x);
for(int i=1;i<=2*n;++i)suml[i]=suml[i-1]+(a[i]<x)*a[i],sumle[i]=sumle[i-1]+(a[i]<=x)*a[i];
for(int i=1;i<=2*n;++i)f[i]=1e18;
nxtle[2*n+1]=2*n+1;
for(int i=2*n+1;i;--i)if(a[i]<=x)nxtle[i]=i;else nxtle[i]=nxtle[i+1];
if(lst<=A)
{
for(int i:va[lst])
{
int u=nxtle[i];
if(u>n)u-=n;
f[u]=f[u+n]=min(f[u],dp[i]);
}
}
else f[1]=f[n+1]=0;
// printf("f:");for(int i=1;i<=2*n;++i)printf("%lld ",f[i]);putchar(10);
for(int i=1;i<=2*n;++i)if(a[i]==x)prv[i]=i;else prv[i]=prv[i-1];
for(int i=2*n;i;--i)if(a[i]==x)nxt[i]=i;else nxt[i]=nxt[i+1];
for(int i=n+1;i<=2*n;++i)if(a[i]==x)
{
int u=i,v=prv[i-1];
if(v+n==u)continue;
// printf("typ1 u:%d v:%d\n",u,v);
for(int S=v;S<=u;++S)dp[u-n]=min(dp[u-n],suml[u]-suml[v-1]+sumle[S-1]-sumle[v-1]+f[S]);
// printf("new dp[%lld]:%lld\n",u-n,dp[u-n]);
}
// printf("dp:");for(int i=1;i<=n;++i)printf("%lld ",dp[i]);putchar(10);
for(int i=1;i<=n;++i)if(a[i]==x)
{
int u=i,v=nxt[i+1];
if(v-n==u)continue;
for(int S=u;S<=v;++S)dp[u]=min(dp[u],sumle[S-1]-sumle[u-1]+2*(suml[v]-suml[S-1])+f[S]);
}
for(int u=n+1;u<=2*n;++u)if(a[u]==x)
{
int v=nxt[u-n+1];//printf("typ3 u:%d v:%d\n",u,v);
for(int S=u-n+1;S<=v;++S)dp[u-n]=min(dp[u-n],suml[u]-suml[S-1]+f[S]);
// printf("new dp[%lld]:%lld\n",u-n,dp[u-n]);
}
for(int u=1;u<=n;++u)if(a[u]==x)
{
int v=prv[u+n-1];
for(int S=v;S<u+n;++S)dp[u]=min(dp[u],sumle[S-1]-sumle[u-1]+f[S]);
}
lst=x;
// printf("dp:");for(int i=1;i<=n;++i)printf("%lld ",dp[i]);putchar(10);
}
ll ans=1e18;
for(int i:va[lst])ans=min(ans,dp[i]);
printf("%lld\n",ans);
fclose(stdin);fclose(stdout);return 0;
}
详细
Test #1:
score: 100
Accepted
time: 3ms
memory: 15756kb
input:
6 6 10 6 5 4 5
output:
16
result:
ok 1 number(s): "16"
Test #2:
score: 0
Accepted
time: 6ms
memory: 22264kb
input:
1 525434
output:
0
result:
ok 1 number(s): "0"
Test #3:
score: -100
Wrong Answer
time: 5ms
memory: 18132kb
input:
20 724315 660084 703741 660084 33388 703741 724315 608476 703741 33388 660084 33388 703741 703741 724315 33388 660084 703741 703741 33388
output:
4240195
result:
wrong answer 1st numbers differ - expected: '10450373', found: '4240195'