第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(沈阳)

第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(沈阳)

D . J o u r n e y t o U n ′ G o r o D. Journey to Un'Goro D.JourneytoUnGoro

题 意 题意

构 造 长 度 为 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)点对的最大数量。按字典序输出构造的序列,如 nbrL,R(1LRn),使[L,R]r(L,R) 果 数 量 > 100 只 输 出 前 100 个 果数量>100只输出前100个 >100100

解 法 解法

把 b 看 成 0 , r 看 成 1 , 的 到 01 数 组 b , 对 b 求 异 或 前 缀 和 。 把b看成0,r看成1,的到01数组b,对b求异或前缀和。 b0r101bb

( 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)1b[r]b[l1]b[r]b[l1]

设 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[0n]x0,y1(L,R)xy,xy=2(n+1)2(n+1)

可 以 看 出 b 数 组 中 , 0 和 1 的 个 数 都 不 能 超 过 ⌈ ( n + 1 ) 2 ⌉ , 根 据 这 个 条 件 进 行 剪 枝 。 可以看出b数组中,0和1的个数都不能超过 \lceil \frac {(n+1)} {2} \rceil,根据这个条件进行剪枝。 b012(n+1),

因 为 只 要 输 出 100 组 , 可 能 能 用 d f s 过 , 事 实 证 明 也 是 可 以 的 。 因为只要输出100组,可能能用dfs过,事实证明也是可以的。 100dfs

#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;
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值