AtCoder Grand Contest 020 D - Min Max Repetition
2024-09-04 03:44:14
q<=1000个询问,每次问a,b,c,d:f(a,b)表示含a个A,b个B的字符串中,连续A或连续B最小的串中,字典序最小的一个串,输出这个串的c到d位。a,b<=5e8,d-c+1<=100。
首先可以确定这个“连续A或连续B的最小值”是:$\left \lceil \frac{p}{q+1} \right \rceil$
然后就尽可能在前面放A,如果放A导致后面不满足这个“连续A或连续B的最小值”,就放B,这样是O(n)的。
打几个表发现:串实际上是前面:AA……ABAA……ABAA……ABAA……这样的,后面是BABB……BABB……BABB,这样的,那二分一下这个分界的位置,判断按前缀那样放A,B之后后缀能否满足“连续A或连续B的最小值”。然后根据c,d在这个位置前后分下类输出答案即可。
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
//#include<assert.h>
#include<algorithm>
//#include<iostream>
//#include<bitset>
using namespace std; int q,a,b,c,d,len; int calc(int a,int b)
{
if (!a || !b) return a^b;
if (a<b) a^=b,b^=a,a^=b;
return (a-)/(b+)+;
} bool check(int x)
{
int cnta=x/(len+)*len+x%(len+),cntb=x/(len+)-(x%(len+)==);
if (cnta>a) return ;
return calc(a-cnta,b-cntb)<=len;
} void workleft(int left,int right)
{
for (int i=left;i<=right;i++)
{
if (i%(len+)==) putchar('B');
else putchar('A');
}
}
void workright(int left,int right)
{
for (int i=left;i<=right;i++)
{
if ((a+b-i+)%(len+)==) putchar('A');
else putchar('B');
}
} int main()
{
scanf("%d",&q);
while (q--)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
len=calc(a,b);
int L=,R=a+b;
while (L<R)
{
int mid=(L+R+)>>;
if (check(mid)) L=mid;
else R=mid-;
}
int pos=L;
if (d<=pos) workleft(c,d);
else if (c>pos) workright(c,d);
else workleft(c,pos),workright(pos+,d);
puts("");
}
return ;
}
最新文章
- 《连载 | 物联网框架ServerSuperIO教程》- 10.持续传输大块数据流的两种方式(如:文件)
- links and softwares
- GPS定位为什么要转换处理?高德地图和百度地图坐标处理有什么不一样?
- [CentOS]yum安装postgres和ntfs-3g
- *[codility]Country network
- 学习块格式化上下文(BlockFormattingContext)
- Oracle删除多张表
- Spring AspectJ的Execution表达式-备忘笔记
- 每天一个linux命令(33)--df命令
- java环境配置,试用和基本数据结构
- Jquery EasyUI datagrid 的一些问题
- linux常用的内核镜像格式
- 使用 ZipArchive 生成Zip文件备注
- Java框架spring 学习笔记(十三):log4j介绍
- [EXP]ThinkPHP 5.0.23/5.1.31 - Remote Code Execution
- jQuery同步Ajax带来的UI线程阻塞问题
- C# 进制转换(二进制、十六进制、十进制互转)
- 弹幕和回到顶部前端web
- WPF EventAggregator(基于EventAggregator的事件发布及订阅)
- 【转】nodeJs学习之项目结构