「AGC020D」 Min Max Repetition

传送门

首先这个东西的连续字符个数你可以二分。但事实上没有必要,这是可以直接算出来的。

即 \(k=\max\{\lceil\frac{A}{B+1}\rceil,\lceil\frac{B}{A+1}\rceil\}\)。

证明你就考虑把每一个 B 或者 A 分成一段过后另一种最少每段放几个。

然后接下来就非常神奇,由于要求字典序最小,这个字符串一定形如 \(\texttt{AAA...BAAA...BAAA...BBB...ABBB...A}\)

然后可以二分两种类型分割的边界,然后暴力check能不能填的上就完事了。

当然这里存在方法可以通过分类讨论来做到不需二分。

/*---Author:HenryHuang---*/
/*---Never Settle---*/
#include<bits/stdc++.h>
using namespace std;
int a,b,c,d,k;
bool check(int mid){
int u=a-mid/(k+1)*k-mid%(k+1);
int v=b-mid/(k+1);
return 1ll*v<=1ll*u*k;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int T;cin>>T;
while(T--){
cin>>a>>b>>c>>d;
k=max(ceil(1.0*a/(b+1)),ceil(1.0*b/(a+1)));
int l=0,r=a+b+1;
while(l<r){
int mid=(l+r)>>1;
if(check(mid)) l=mid+1;
else r=mid;
}
int u=a-l/(k+1)*k-l%(k+1);
int v=b-l/(k+1);
r=l+v-u*k+1;
for(int i=c;i<=min(d,l);++i){
if(i%(k+1)) cout<<"A";
else cout<<"B";
}
for(int i=max(c,l+1);i<=d;++i){
if((i-r)%(k+1)) cout<<"B";
else cout<<"A";
}
cout<<'\n';
}
return 0;
}

最新文章

  1. python不同模式打开文件的完全列表
  2. Practical Java (一)关于reference
  3. LCIS(m*n) 最长公共上升子序列
  4. POJ 2105
  5. Unity之屏幕画线
  6. 【转】Picasso – Android系统的图片下载和缓存类库
  7. oracle decode函数使用方法
  8. word页面不对齐,如何解决?
  9. js计时器。
  10. 四、spark常用函数说明学习
  11. Intent的概念及应用(二)
  12. 6.1 MSI/MSI-X Capability结构
  13. oracle 11g rac R2 for linux change(public,vip)IP ,hostname (oracle 11g rac R2 修改公有,虚拟,私有IP,网卡)
  14. odoo中各视图写法
  15. Servlet 起航 文件上传 中文文件名下载
  16. hive中的子查询改join操作(转)
  17. 15.python操作mysql
  18. HTTPClient 超时链接设置
  19. np.repeat函数
  20. February 2 2017 Week 5 Thursday

热门文章

  1. Tengine Framework基础
  2. GPU端到端目标检测YOLOV3全过程(中)
  3. Spring Cloud系列(七):消息总线
  4. Linux学习笔记:Linux命令之文件处理命令
  5. pytest xfail的使用
  6. 七、AIDE入侵检测
  7. C#开发之基于NPOI的操作Excel开发体验
  8. 新增秒杀功能、优惠券、支付宝、Docker,newbee-mall升级版开源啦!
  9. vue3.0搭建项目
  10. Android Gradle插件