QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#384206 | #3701. Necklace | wanyurukong | WA | 1ms | 5680kb | C++17 | 1.4kb | 2024-04-09 20:56:40 | 2024-04-09 20:56:40 |
Judging History
answer
#include<cstdio>
#include<cstdio>
#include<cmath>
#include<queue>
#include<stack>
#include<string>
#include<cstring>
#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
#include<set>
#include<cmath>
using namespace std;
const int nn = 110000;
const int inf = 0x3fffffff;
const int N=2e5+10;
int tr[N*4],n,a[N],f1[N],f2[N],v[15];
int lowbit(int x)
{
return x&-x;
}
void add(int x,int mx)
{
if(x==0)return;
for(int i=x;i<=10000;i+=lowbit(i))
{
tr[i]=max(tr[i],mx);
}
}
int mx(int x)
{
int ans=0;
for(int i=x;i;i-=lowbit(i))
{
ans=max(tr[i],ans);
}
return ans;
}
int solve(int id)
{
for(int i=1;i<=10000;++i)tr[i]=0;
f1[0]=0;
for(int i=id+1;i<id+n;++i)
{
if(a[i]==10000)
{
f1[i-id]=f1[i-id-1];
continue;
}
int m=mx(10000-a[i]+1)+a[i];
f1[i-id]=max(f1[i-id-1],m);
add(10000-a[i]+1,m);
}
for(int i=1;i<=10000;++i)tr[i]=0;
f2[n]=0;
for(int i=id+n-1;i>id;--i)
{
if(a[i]==10000)
{
f2[i-id]=f2[i-id-1];
continue;
}
int m=mx(10000-a[i]+1)+a[i];
f2[i-id]=max(f2[i-id-1],m);
add(10000-a[i]+1,m);
}
int ans=0;
for(int i=1;i<n;++i)
ans=max(ans,f1[i]+f2[i+1]+10000);
return ans;
}
int main()
{
while(cin>>n)
{
int lv=0;
for(int i=1;i<=n;++i)
{
cin>>a[i];
a[i+n]=a[i];
if(a[i]==10000)v[++lv]=i;
}
int ans=0;
for(int i=1;i<=lv;++i)
{
ans=max(ans,solve(i));
}
cout<<ans<<'\n';
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 5588kb
input:
6 10000 3 2 4 2 3
output:
10010
result:
ok 1 number(s): "10010"
Test #2:
score: 0
Accepted
time: 1ms
memory: 5680kb
input:
2 10000 10000
output:
10000
result:
ok 1 number(s): "10000"
Test #3:
score: -100
Wrong Answer
time: 1ms
memory: 5656kb
input:
1 10000
output:
0
result:
wrong answer 1st numbers differ - expected: '10000', found: '0'