Codeforces Round #724 (Div. 2) C. Diluc and Kaeya(map暴力)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #724 (Div. 2) C. Diluc and Kaeya(map暴力)相关的知识,希望对你有一定的参考价值。
把串 s s s分为 x x x段,设每一段的 D : K = L \\rm D:K=L D:K=L,那么串 s s s的 D : K \\rm D:K D:K必然也为 L L L
所以对于每个前缀,只需要检验一下在比率 L \\rm L L下至多能分成几段即可
进一步的,如果 s [ 1.. i ] s[1..i] s[1..i]的比率为 L L L, s [ 1... j ] s[1...j] s[1...j]的比率为 L L L,那么 s [ i + 1... j ] s[i+1...j] s[i+1...j]的比率也必然为 L L L
所以可以贪心,一旦比率为 L L L就马上截断
暴力判断的话单次复杂度 O ( n ) O(n) O(n),显然无法通过
没办法,发现最多只有 n n n个本质不同的比例,用 m a p map map存一下
然后对每个比例暴力做一遍更新答案,这样就是调和级数的复杂度.
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5+10;
int t,n,d[maxn],k[maxn],res[maxn];
char a[maxn];
typedef pair<int,int>p;
map<p,int>mp;
int gcd(int a,int b){ return b==0?a:gcd(b,a%b); }
int main()
{
cin >> t;
while( t-- )
{
mp.clear();
scanf("%d%s",&n,a+1 );
for(int i=1;i<=n;i++)
{
d[i] = d[i-1], k[i] = k[i-1]; res[i] = 1;
if( a[i]=='D' ) d[i]++;
if( a[i]=='K' ) k[i]++;
int yin = gcd( d[i],k[i] );
if( mp.count( p(d[i]/yin,k[i]/yin) ) ) continue;
mp[ p(d[i]/yin,k[i]/yin) ] = 1;
}
for(auto vv:mp )
{
p v = vv.first;
int D = v.first, K = v.second, ans = 0, now = 1;
while( true )
{
int flag = 0;
for(int i=1,j=now+D+K-1;j<=n;i++,j=j+D+K)
{
int td = d[j]-d[now-1], tk = k[j]-k[now-1];
int yin = gcd( td,tk );
if( td/yin!=D || tk/yin!=K ) continue;
flag = 1, ans++, now = j+1;
res[now-1] = max( res[now-1],ans );
}
if( !flag ) break;
}
}
for(int i=1;i<=n;i++) printf("%d%c",res[i],i==n?'\\n':' ');
}
}
以上是关于Codeforces Round #724 (Div. 2) C. Diluc and Kaeya(map暴力)的主要内容,如果未能解决你的问题,请参考以下文章
E. Omkar and Forest——Codeforces Round #724 (Div. 2)
E. Omkar and Forest——Codeforces Round #724 (Div. 2)
F. Omkar and Akmar游戏,组合,逆元—— Codeforces Round #724 (Div. 2)
Codeforces Round #724 (Div. 2)(CD)