「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\) 的互不同构的树 ...
随机推荐
- 学习原根 by OI-wiki
根据 OI-wiki 的讲解,加以自己的理解和简化.偏重于算法竞赛而不是数学竞赛. 前置知识: 费马小定理:\(a^{p-1} \equiv 1(\mod p)\),\(p\) 为质数. 欧拉定理:\ ...
- chess草稿(附代码!)
2022/8/12日过了,代码如下:(已删除调试语句,保留注释,为了使代码更容易看懂并没有卡常.卡完常的代码不是给人看的) 点击查看代码 /* 倒序操作+合并连通块+维护集合,支持合并.区间查询+线段 ...
- 【一步步开发AI运动小程序】十一、人体关键点跳跃追踪
随着人工智能技术的不断发展,阿里体育等IT大厂,推出的"乐动力"."天天跳绳"AI运动APP,让云上运动会.线上运动会.健身打卡.AI体育指导等概念空前火热.那 ...
- flutter 的 in_app_web_view实现下载功能
flutter与前端交互,利用in_app_web_view实现下载功能: 首先下载库,终端输入 flutter pub add flutter_inappwebview 之后导出 import 'p ...
- App性能测试之iTest
本文主要介绍下App性能测试工具iTest_V4.7的使用. 功能简介 1.监控Andorid系统(支持手机,平板,电视,车机等智能终端设备)以及应用app的cpu.内存.流量.电池.帧率.页面耗时等 ...
- mysql和neo4j集成多数据源和事务
在微服务大行其道的今天,按理说不应该有多数据源这种问题(嗯,主从库算是一个多数据源的很常见的场景.),但是也没人规定不能这样做. 就算有人规定的,曾经被奉为圭臬的数据库三大范式现在被宽表冲得七零八落, ...
- SpringBoot+MyBatisPlus实现读写分离
前言 随着业务量的不断增长,数据库的读写压力也越来越大.为了解决这个问题,我们可以采用读写分离的方案来分担数据库的读写负载.本文将介绍如何使用 Spring Boot + MyBatis Plus + ...
- IDEA中去除竖线
IDEA中去除竖线 使用IDEA时突然多出了一条竖线 , 进入设置取消竖线
- HCL 实验7:OSPF
拓扑图 R1配置 [R1]int g0/1 [R1-GigabitEthernet0/1]ip add 192.168.4.1 24 [R1-GigabitEthernet0/1]undo shutd ...
- 【Java】并行执行任务
在实际的应用上,我们平时需要调用第三方的接口,可能会调用多个接口,串行执行的话, 就需要等待所有的接口调用完成之后才获取到结果,那我们有没有并行的方法的呢? 串行执行 以下是三个接口,假设他们额的执行 ...