← 回到所有文章

AT_agc020_d [AGC020D] Min Max Repetition 题解

记 S^k 表示把字符串 S 重复 k 次。 首先通过贪心填找一下限制,设 X 为出现次数最多的元素,那么一定是按照 (X^{k-1}Y)^?(X^kY)^?X^k 这样填,那么 k 就是答案,容易发…

题解文章的简约插画封面

记 SkS^k 表示把字符串 SS 重复 kk 次。

首先通过贪心填找一下限制,设 XX 为出现次数最多的元素,那么一定是按照 (Xk−1Y)?(XkY)?Xk(X^{k-1}Y)^?(X^kY)^?X^k 这样填,那么 kk 就是答案,容易发现 k=⌈xy+1⌉k=\lceil\frac{x}{y+1}\rceil。

但是为了让字符串更小,我们可以先按照 (AkB)?A?(A^kB)^?A^? 填,后面为了弥补多填的 AA,会填成 B?(ABk)?B^?(AB^k)^?,直接二分分界点即可,不用任何分类讨论。

#include<bits/stdc++.h>

void solve(){
    int i,k,l,r,mid,a,b,A,B,C,D;
    char now;
    scanf("%d%d%d%d",&A,&B,&C,&D);
    k=std::ceil(std::max(1.0*A/(B+1),1.0*B/(A+1)));
    l=0,r=A+B;
    while(l<r){
        mid=(l+r)>>1;
        b=mid/(k+1);
        a=A-mid+b;
        b=B-b;
        if(1ll*a*k>=b) l=mid+1;
        else r=mid;
    }
    for(i=C;i<=D;++i){
        if(i<=l) now=!(i%(k+1));
        else now=!!((A+B+1-i)%(k+1));
        putchar(now+'A');
    }
    putchar('\n');
}

int main(){

    int T;
    scanf("%d",&T);
    while(T--) solve();

    return 0;
}

谢谢你,读到这里。

本文同步自洛谷专栏,保留原始正文与发布时间。在洛谷查看原文 ↗

搜索文章

输入关键词,发现一些值得阅读的文字。

探索文字里的小小世界esc 关闭