第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(沈阳)
D . J o u r n e y t o U n ′ G o r o D. Journey to Un'Goro D.JourneytoUn′Goro
题 意 题意 题意
构 造 长 度 为 n 的 字 符 串 , 每 个 点 是 b 或 r 。 之 后 选 两 个 点 L , R ( 1 ≤ L ≤ R ≤ n ) , 使 得 [ L , R ] 中 有 奇 数 个 r , 问 ( L , R ) 点 对 的 最 大 数 量 。 按 字 典 序 输 出 构 造 的 序 列 , 如 构造长度为n的字符串,每个点是b或r。之后选两个点L,R(1 \leq L\leq R\leq n),使得[L,R]中有奇数个r,问(L,R)点对的最大数量。按字典序输出构造的序列,如 构造长度为n的字符串,每个点是b或r。之后选两个点L,R(1≤L≤R≤n),使得[L,R]中有奇数个r,问(L,R)点对的最大数量。按字典序输出构造的序列,如 果 数 量 > 100 只 输 出 前 100 个 果数量>100只输出前100个 果数量>100只输出前100个
解 法 解法 解法
把 b 看 成 0 , r 看 成 1 , 的 到 01 数 组 b , 对 b 求 异 或 前 缀 和 。 把b看成0,r看成1,的到01数组b,对b求异或前缀和。 把b看成0,r看成1,的到01数组b,对b求异或前缀和。
( L , R ) 中 有 奇 数 个 1 ⇒ b [ r ] − b [ l − 1 ] 是 奇 数 ⇒ b [ r ] 与 b [ l − 1 ] 奇 偶 性 不 同 (L,R)中有奇数个1 \Rightarrow b[r] - b[l - 1]是奇数 \Rightarrow b[r]与b[l - 1]奇偶性不同 (L,R)中有奇数个1⇒b[r]−b[l−1]是奇数⇒b[r]与b[l−1]奇偶性不同
设 b [ 0 ∽ n ] 中 有 x 个 0 , y 个 1 , ( L , R ) 的 选 法 有 x ∗ y 种 , 当 x ∗ y = ⌊ ( n + 1 ) 2 ⌋ ⌈ ( n + 1 ) 2 ⌉ 时 最 大 。 设b[0\backsim n]中有x个0,y个1,(L,R)的选法有x*y种,当x*y= \lfloor \frac {(n+1)} {2} \rfloor \lceil \frac {(n+1)} {2} \rceil时最大。 设b[0∽n]中有x个0,y个1,(L,R)的选法有x∗y种,当x∗y=⌊2(n+1)⌋⌈2(n+1)⌉时最大。
可 以 看 出 b 数 组 中 , 0 和 1 的 个 数 都 不 能 超 过 ⌈ ( n + 1 ) 2 ⌉ , 根 据 这 个 条 件 进 行 剪 枝 。 可以看出b数组中,0和1的个数都不能超过 \lceil \frac {(n+1)} {2} \rceil,根据这个条件进行剪枝。 可以看出b数组中,0和1的个数都不能超过⌈2(n+1)⌉,根据这个条件进行剪枝。
因 为 只 要 输 出 100 组 , 可 能 能 用 d f s 过 , 事 实 证 明 也 是 可 以 的 。 因为只要输出100组,可能能用dfs过,事实证明也是可以的。 因为只要输出100组,可能能用dfs过,事实证明也是可以的。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 100010;
char s[N];
int n, m, lim, cnt;
void dfs(int u, int cnt0, int cnt1, int sum) {
if (cnt0 > lim || cnt1 > lim) return ;
if (u == n + 1) {
s[n + 1] = '\0';
cout << s + 1 << endl;
cnt ++;
if (cnt >= 100) exit(0);
}
s[u] = 'b';
int t0 = 0, t1 = 0;
if (sum & 1) t1 = 1;
else t0 = 1;