「codeforces - 1394C」Boboniu and String
注意到 BN-string 长成什么样根本不重要,我们把它表述为 BN-pair \((x, y)\) 即可,两个 BN-strings 相似的充要条件即两者分别映射得到的 BN-pairs 相等。将 BN-pairs 放到平面上来研究,题目中给出的变换就对应 \((x,y)\rightarrow(x\pm1,y),(x,y\pm1),(x\pm1,y\pm1)\),注意到在斜线方向上的移动只能同时加或减。我们可以用这样移动方式的所派生的 \(\text{dist}(a, b)\) 函数导出在平面上的「圆」(是一般意义下的 hexagon),如下图

二分「半径」\(r\) 我们现在的问题就转化为了,判定原图上所有点以 \(r\) 导出「圆」的是否有交。由于这是个凸图形,我们考虑用六条直线围成的图形来描述,于是两个「圆」有交的充要条件即为「在横轴上有交,且在竖轴上有交,且在 \(y=x\) 轴上有交」。前两个的判断都不怎么迷惑,在斜轴(即 \(y=x\) 轴)上的判断需要小小的考虑一下。不妨用一条 \(y=-x+b\) 的直线来切斜线,如下图

这样把 \(y=-x+b\) 看作数轴,我们就把问题转化成了前两个判断,但是实际上我们不需要这个算这个六边形斜线与轴交点的坐标再转化(这样算出来还会带根号,很麻烦),等价地,直接看六边形斜线与已有数轴(即横轴和竖轴)的交点即可。
#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
int n, xx[300100], yy[300100];
char s[500100];
int lx, rx, ly, ry, lz, rz;
bool check(int r) {
lx = -inf, rx = inf, ly = -inf, ry = inf, lz = -inf, rz = inf;
for (int i = 1; i <= n; ++i) {
lx = max(lx, xx[i]-r), rx = min(rx, xx[i]+r);
ly = max(ly, yy[i]-r), ry = min(ry, yy[i]+r);
lz = max(lz, xx[i]-yy[i]-r), rz = min(rz, xx[i]-yy[i]+r);
}
lx = max(lx, 0), ly = max(ly, 0);
if (lx > rx || ly > ry || lz > rz) return 0;
return lx-ry <= rz && rx-ly >= lz;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> s;
for (int j = 0, r = strlen(s); j < r; ++j) {
if (s[j] == 'B') xx[i]++;
else yy[i]++;
}
}
int l = 0, r = 1e9, mid, ans = l;
while (l <= r) {
if (check(mid = (l+r)/2)) {
r = mid-1;
ans = mid;
}
else {
l = mid+1;
}
}
check(ans);
cout << ans << "\n";
for (int i=0;i<min(rx, ry+rz);++i) {
cout << "B";
}
for (int i=0;i<min(min(rx, ry+rz)-lz,ry);++i) {
cout << "N";
}
}
「codeforces - 1394C」Boboniu and String的更多相关文章
- 「CodeForces - 598B」Queries on a String
BUPT 2017 summer training (for 16) #1I 题意 字符串s(1 ≤ |s| ≤ 10 000),有m(1 ≤ m ≤ 300)次操作,每次给l,r,k,代表将r位置插 ...
- 「CodeForces 581D」Three Logos
BUPT 2017 Summer Training (for 16) #3A 题意 给你三个矩形,需要不重叠不留空地组成一个正方形.不存在输出-1,否则输出边长和这个正方形(A,B,C表示三个不同矩形 ...
- 「CodeForces - 50C 」Happy Farm 5 (几何)
BUPT 2017 summer training (16) #2B 题意 有一些二维直角坐标系上的整数坐标的点,找出严格包含这些点的只能八个方向走出来步数最少的路径,输出最少步数. 题解 这题要求严 ...
- 「CodeForces - 717E」Paint it really, really dark gray (dfs)
BUPT 2017 summer training (for 16) #1H 题意 每个节点是黑色or白色,经过一个节点就会改变它的颜色,一开始在1节点.求一条路径使得所有点变成黑色. 题解 dfs时 ...
- 「 HDU P3336 」 Count the string
题目大意 给出一个长度为 $n$ 的字符串 $s$ 要求你求出 $s$ 的每一个前缀在 $s$ 中出现的次数之和.$n\le 200000$. 解题思路 暴力的对每一个前缀进行一次匹配,求出出现次数后 ...
- 「CodeForces 476A」Dreamoon and Stairs
Dreamoon and Stairs 题意翻译 题面 DM小朋友想要上一个有 \(n\) 级台阶的楼梯.他每一步可以上 \(1\) 或 \(2\) 级台阶.假设他走上这个台阶一共用了 \(x\) 步 ...
- 「CodeForces 546B」Soldier and Badges 解题报告
CF546B Soldier and Badges 题意翻译 给 n 个数,每次操作可以将一个数 +1,要使这 n 个数都不相同, 求最少要加多少? \(1 \le n \le 3000\) 感谢@凉 ...
- 「Codeforces 79D」Password
Description 有一个 01 序列 \(a_1,a_2,\cdots,a_n\),初始时全为 \(0\). 给定 \(m\) 个长度,分别为 \(l_1\sim l_m\). 每次可以选择一个 ...
- 「Codeforces 468C」Hack it!
Description 定义 \(f(x)\) 表示 \(x\) 的各个数位之和.现在要求 \(\sum_{i=l}^rf(i)\bmod a\). 显然 ans=solve(l,r)%a; if(a ...
- 「Codeforces 724F」Uniformly Branched Trees
题目大意 如果两棵树可以通过重标号后变为完全相同,那么它们就是同构的. 将中间节点定义为度数大于 \(1\) 的节点.计算由 \(n\) 个节点,其中所有的中间节点度数都为 \(d\) 的互不同构的树 ...
随机推荐
- Docker-Compose快速搭建LNMP
Docker-Compose 1.安装Docker sudo apt -y install docker.io docker version 查看版本号 docker help 查看帮助文档 2.更换 ...
- 曲线艺术编程 coding curves 第四章 利萨茹曲线(Lissajous Curves)
第四章 利萨茹曲线(Lissajous Curves) 原作:Keith Peters https://www.bit-101.com/blog/2022/11/coding-curves/ 译者:池 ...
- wireshark基本使用
Wireshark 是一种开源.跨平台的网络数据包分析工具,能够嗅探和调查实时流量并检查数据包捕获 (PCAP).它通常 被用作最好的数据包分析工具之一. 数据包过滤操作 ip过滤器 IP 过滤器帮助 ...
- 【python基础】循环语句-break关键字
1.break关键字 break关键字,其作用是在循环中的代码块遇到此关键字,立刻跳出整个循环,执行循环外的下一条语句. 其在while和for循环中的作用示意图如下: 1.1break在while循 ...
- MySQL中都有哪些锁?
MySQL中都有哪些锁 为什么需要锁 在计算机系统中,锁(Lock)是一种同步机制,用于控制对共享资源的访问.它确保在任何给定时间内只有一个线程能够访问受保护的共享资源,从而避免了由并发访问导致的数据 ...
- AB实验:科学归因与增长的利器
第一章 AB实验的基本原理和应用 AB实验的相关概念: 3个基本参数:实验参与单元.实验控制参数.实验指标 2个核心价值:验证因果关系.量化策略效果 2个关键特性:先验性.并行性 基本流程:分流 -& ...
- DevOps|中式土味OKR与绩效考核落地与实践
昨天一个小伙伴和我讨论了一下OKR和绩效管理,所以这次想简单明了地说下在中国怎么做比较合适,很多高大上的理论无法落地也是空中楼阁. 首先说一些,我个人的理解 道德品质和能力素质决定了一个人的职位行为 ...
- 使用libavcodec将mp3音频文件解码为pcm音频采样数据【[mp3float @ 0x561c1ec49940] Header missing】
一.打开和关闭输入文件和输出文件 想要解决上面提到的问题,我们需要对mp3文件的格式有个大致了解,为了方便讲解,我这里画了个示意图: ID3V2 包含了作者,作曲,专辑等信息,长度不固定,扩展了 ID ...
- 【Python】Locust持续优化:InfluxDB与Grafana实现数据持久化与可视化分析
前言 在进行性能测试时,我们需要对测试结果进行监控和分析,以便于及时发现问题并进行优化. Locust在内存中维护了一个时间序列数据结构,用于存储每个事件的统计信息. 这个数据结构允许我们在Chart ...
- 一文学会TextureID渲染到Surface
最近遇到一个需求,要求将一个GL_TEXTURE_2D类型的纹理ID写入到ImageReader生成的Surface中. 其实这个需求与我之前写过的一篇文章 一文学会MediaCodeC与OpenGL ...