QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#132582 | #6338. Chorus | zhouhuanyi | 0 | 1ms | 18936kb | C++23 | 2.3kb | 2023-07-30 17:23:31 | 2023-07-30 17:23:33 |
Judging History
answer
#include<iostream>
#include<cstdio>
#include<cmath>
#define N 2000000
#define inf 1e12
#define INF 2e18
using namespace std;
int read()
{
char c=0;
int sum=0;
while (c<'0'||c>'9') c=getchar();
while ('0'<=c&&c<='9') sum=sum*10+c-'0',c=getchar();
return sum;
}
struct reads
{
int l,r,ps;
};
reads dque[N+1];
int n,k,top,lg[N+1],s[N+1],cnt[N+1],pst[N+1],pst2[N+1];
long long sx,S[N+1],S2[N+1],ds[N+1],dp[N+1];
char c[N+1];
long long F(int l,int r)
{
if (l>r) return INF;
int sl=(l-1)<<1,sr=r<<1,mid=(sl+sr)>>1;
long long res=0;
if (pst[sl]==-1||pst[sl]<sl||pst[sl]>mid)
{
if (s[sl]<=0) res+=S2[mid-sl]-(ds[mid]-ds[sl]);
}
else res+=(S2[mid-sl]-S2[pst[sl]-sl])-(ds[mid]-ds[pst[sl]]);
if (pst2[sr]==-1||pst2[sr]<mid||pst2[sr]>sr)
{
if (s[sr]<=0) res+=S[sr-mid]-(ds[sr]-ds[mid]);
}
else res+=(S[sr-mid]-S[sr-pst2[sr]])-(ds[pst2[sr]]-ds[mid]);
return (res>>1)+sx;
}
long long calc(long long x)
{
int d;
for (int i=1;i<=n;++i) dp[i]=INF;
sx=x,dque[top=1]=(reads){1,n,0};
for (int i=1;i<=n;++i)
{
d=0;
for (int j=lg[top];j>=0;--j)
if (d+(1<<j)<=top&&dque[d+(1<<j)].l<=i)
d+=(1<<j);
cnt[i]=cnt[dque[d].ps]+1,dp[i]=dp[dque[d].ps]+F(dque[d].ps+1,i);
while (top&&dp[i]+F(i+1,dque[top].l)<dp[dque[top].ps]+F(dque[top].ps+1,dque[top].l)) top--;
if (top&&dp[i]+F(i+1,dque[top].r)<dp[dque[top].ps]+F(dque[top].ps+1,dque[top].r))
{
d=dque[top].r;
for (int j=lg[dque[top].r-dque[top].l];j>=0;--j)
if (d-(1<<j)>=dque[top].l&&dp[i]+F(i+1,d-(1<<j))<dp[dque[top].ps]+F(dque[top].ps+1,d-(1<<j)))
d-=(1<<j);
dque[top].r=d-1;
}
d=dque[top].r+1;
if (d<=n) dque[++top]=(reads){d,n,i};
}
return cnt[n];
}
int main()
{
long long x=0;
for (int i=2;i<=N;++i) lg[i]=lg[i>>1]+1;
n=read(),k=read();
for (int i=1;i<=(n<<1);++i)
{
cin>>c[i],S[i]=S[i-1]+i-1,S2[i]=S2[i-1]+i;
if (c[i]=='A') s[i]=s[i-1]+1;
else s[i]=s[i-1]-1;
ds[i]=ds[i-1]+s[i];
}
for (int i=0;i<=(n<<1);++i) pst[i]=pst2[i]=-1;
for (int i=0;i<=(n<<1);++i)
{
if (i-s[i]<=(n<<1)&&pst[i-s[i]]==-1) pst[i-s[i]]=i;
if (i+s[i]<=(n<<1)&&pst2[i+s[i]]==-1) pst2[i+s[i]]=i;
}
for (int i=log(inf)/log(2);i>=0;--i)
if (x+(1ll<<i)<=inf&&calc(x+(1ll<<i))>=k)
x+=(1ll<<i);
calc(x),printf("%lld\n",dp[n]-k*x);
return 0;
}
详细
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 16
Accepted
time: 0ms
memory: 18936kb
input:
1 1 BA
output:
1
result:
ok 1 number(s): "1"
Test #2:
score: -16
Wrong Answer
time: 1ms
memory: 18488kb
input:
7 5 ABBAAABBABABBA
output:
2
result:
wrong answer 1st numbers differ - expected: '3', found: '2'
Subtask #2:
score: 0
Skipped
Dependency #1:
0%
Subtask #3:
score: 0
Skipped
Dependency #1:
0%
Subtask #4:
score: 0
Skipped
Dependency #1:
0%
Subtask #5:
score: 0
Skipped
Dependency #1:
0%