AtCoder Grand Contest 020 D - Min Max Repetition
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 ;
}
AtCoder Grand Contest 020 D - Min Max Repetition的更多相关文章
- 【Atcoder】AGC 020 D - Min Max Repetition 二分+构造
[题意]定义f(A,B)为一个字符串,满足: 1.长度为A+B,含有A个‘A',B个'B'. 2.最长的相同字符子串最短. 3.在满足以上2条的情况下,字典序最小. 例如, f(2,3) = BABA ...
- Atcoder Grand Contest 020 F - Arcs on a Circle(DP+小技巧)
Atcoder 题面传送门 & 洛谷题面传送门 一道难度 unavailable 的 AGC F 哦 首先此题最棘手的地方显然在于此题的坐标可以为任意实数,无法放入 DP 的状态,也无法直接计 ...
- AtCoder Grand Contest 020 题解
传送门 怎么又是\(tourist\)神仙的题-- \(A\) 咕咕 int n,a,b; int main(){ scanf("%d%d%d",&n,&a,&am ...
- Atcoder Grand Contest 020 E - Encoding Subsets(记忆化搜索+复杂度分析)
Atcoder 题面传送门 & 洛谷题面传送门 首先先考虑如果没有什么子集的限制怎样计算方案数.明显就是一个区间 \(dp\),这个恰好一年前就做过类似的题目了.我们设 \(f_{l,r}\) ...
- AtCoder Grand Contest 020
A - Move and Win Time limit : 1sec / Memory limit : 512MB Score : 300 points Problem Statement A gam ...
- AtCoder Grand Contest 020 (AGC020) E - Encoding Subsets 动态规划
原文链接www.cnblogs.com/zhouzhendong/p/AGC020E.html 前言 真 \(\cdot\) 信仰型动态规划 题解 我们可以采用信仰型动态规划解决此题. 设 \(dp[ ...
- AtCoder Grand Contest 012
AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...
- AtCoder Grand Contest 011
AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...
- AtCoder Grand Contest 031 简要题解
AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...
随机推荐
- 转 oracle apex 使用
https://wenku.baidu.com/view/e5a4226955270722182ef725.html
- Android 实现对多个EditText的监听
create_account=(EditText)findViewById(R.id.create_account); create_password=(EditText)findViewById(R ...
- javscript 导出html中的table到excel
<script language="JavaScript" type="text/javascript"> /* * 默认转换实现函数,如果需要其他 ...
- SELECT TOP 100 PERCENT * 的含义
--返回符合条件的100%的记录,即所有符合条件的记录SELECT TOP 100 PERCENT * --返回符合条件的100条记录,即只返回符合条件的100条记录SELECT TOP 100 * ...
- Node.js——express
res.send(),比原生的 res.end() 强大,原生只支持字符串和Buffer对象,而且需要自己加响应报文头,send支持字符串.Buffer.Json对象.数组,而且自动加响应报文头 ap ...
- Windows之shortcut
System key combinations CTRL+ESC: Open Start menu ALT+TAB: Switch between open programs ALT+F4: Quit ...
- 解剖嵌入式设备开发时以SD卡启动时SD卡的存储结构(以三星exynos4412为例)
目前面对高性能产品的嵌入式开发中,用SD卡来代替以往的JLINK显得备受大家喜欢,而且MCU厂家也对以SD卡启动的支持度越来越大,反而对JLINK不在那么重视(不过依旧保留着).一些以开发开发板的公司 ...
- 【C++】朝花夕拾——STL vector
STL之vector篇 N久之前是拿C的数组实现过vector中的一些简单功能,什么深拷贝.增删查找之类的,以为vector的实现也就是这样了,现在想想真是...too young too naive ...
- CAD参数绘制文字(网页版)
在CAD设计时,需要绘制文字,用户可以设置设置绘制文字的高度等属性. 主要用到函数说明: _DMxDrawX::DrawText 绘制一个单行文字.详细说明如下: 参数 说明 DOUBLE dPosX ...
- ubuntu12.04 配置apache+modwsgi+django1.5
1.首先下载modwsgi 链接如下: http://files.cnblogs.com/baoyiluo/mod_wsgi-3.4.zip 2.解压并安装mod_wsgi: ./configure ...