\(\mathcal{Description}\)

  Link.

  这是一道通信题。

  对于长度为一个 \(n\),仅包含字符 X, Y, Z 的字符串 \(s\),将其中 \(n\) 个字符按任意顺序删去,定义删除方案的权值为在子串 XYZ 中删除 Y 的次数。实现两个函数:

  • void Anna(int N, std::vector<char> S),获取字符串信息,传递不超过 \(7\times10^4\) 个 01 位用于通信;
  • void Bruno(int N, int L, std::vector<int> A),获取通信信息,给出权值最大的删除方案。

  \(n\le10^5\)。

\(\mathcal{Solution}\)

  先看看怎么求最大权值。考虑当前最左侧 X 的位置 \(i\) 与最左侧 Z 的位置 \(j\),若 \(j<i\),显然删掉 \(j\) 无任何影响;否则考虑 \(i<k<j\),\(s_k\) 必然取 XY。那么从 \(j-1\) 逆序删除到 \(i+1\),最后删除掉 \(j\),继续迭代。容易(真的容易)看出这就是最大化权值的方案。

  那么 Anna 需要告诉 Bruno 哪些信息呢?——唯一的一个 \(i\),和若干 \(j\)。一个小小的压缩方式是,对于连续的 Z,仅保留最右端的。特别地,在标记 X 的 \(1\) 的后面强制补一个 \(0\) 站位,我们就把信息串转化为长度为 \(n+1\),不存在连续 \(1\) 的数字串。每 \(W\) 为一段,利用 Fibonacci 数列求出每段的字典序编号,再转化为二进制输出,就能传递信息啦。

  观察标称可知,取 \(W=63\),此时一段的总情况数接近 \(2^{44}\),损失较小。运算过程当然是 \(\mathcal O(n)\) 的,信息长度也就比 \(7\times10^4\) 少一百来次。

\(\mathcal{Code}\)

  • Anna.cpp
/* Clearink */

#include "Anna.h"
#include <vector> #ifndef MY_REP_DEFINED
#define MY_REP_DEFINED
#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i )
#endif namespace { typedef unsigned long long ULL; const int MAXN = 1e5, W = 63, B = 44;
int n;
std::vector<char> s;
bool key[MAXN + W + 5];
ULL fib[W + 5]; inline void mark() {
int i = 0;
while ( i < n && s[i] != 'X' ) ++i;
key[i] = true;
for ( int j = i + 1; j < n; ++j ) {
while ( j < n && s[j] != 'Z' ) ++j;
while ( j + 1 < n && s[j + 1] == 'Z' ) ++j;
if ( i >= n || j >= n ) break;
key[j + 1] = true;
}
} inline void encode() {
fib[0] = 1, fib[1] = 2;
rep ( i, 2, W ) fib[i] = fib[i - 1] + fib[i - 2]; for ( int l = 0; l <= n; l += W ) {
ULL msg = 0;
rep ( i, l, l + W - 1 ) if ( key[i] ) {
msg += fib[repi - i];
}
rep ( i, 0, B - 1 ) Send( msg >> i & 1 );
}
} } // namespace. void Anna( int n, std::vector<char> s ) {
::n = n, ::s = s;
mark(), encode();
}
  • Bruno.cpp
/* Clearink */

#include "Bruno.h"
#include <vector> #ifndef MY_REP_DEFINED
#define MY_REP_DEFINED
#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i )
#endif namespace { typedef long long ULL; const int MAXN = 1e5, W = 63, B = 44;
ULL fib[W + 5];
int n;
std::vector<int> msg;
bool key[MAXN + W + 5]; inline void decode() {
fib[0] = 1, fib[1] = 2;
rep ( i, 2, W ) fib[i] = fib[i - 1] + fib[i - 2]; for ( int l = 0; l < msg.size(); l += B ) {
ULL val = 0;
per ( i, l + B - 1, l ) val = val << 1 | msg[i];
rep ( i, l / B * W, i + W - 1 ) {
if ( val >= fib[repi - i] ) {
key[i] = true, val -= fib[repi - i];
}
}
}
} inline void solve() {
int i = 0;
while ( i < n && !key[i] ) Remove( i++ );
if ( i == n ) return ;
for ( int j = i + 1, las = i; j < n; ) {
while ( j < n && !key[j + 1] ) ++j;
per ( k, j - 1, las + 1 ) Remove( k );
if ( j < n ) Remove( las = j++ );
}
Remove( i );
} } // namespace. void Bruno( int n, int l, std::vector<int> msg ) {
::n = n, ::msg = msg;
decode(), solve();
}

Solution -「JOISC 2021」古老的机器的更多相关文章

  1. Solution -「JOISC 2021」「LOJ #3489」饮食区

    \(\mathcal{Description}\)   Link.   呐--不想概括题意,自己去读叭~ \(\mathcal{Solution}\)   如果仅有 1. 3. 操作,能不能做?    ...

  2. Solution -「JOISC 2021」「LOJ #3495」聚会 2

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个结点的树.称点集 \(S\) 到结点 \(u\) 的会合距离为 \(\sum_{v\in S}\ope ...

  3. Solution -「JOISC 2021」「LOJ #3491」道路建设

    \(\mathcal{Description}\)   Link.   平面上有 \(n\) 个互不重合的点 \((x_{1..n},y_{1..n})\),求其两两曼哈顿距离的前 \(m\) 小值. ...

  4. Solution -「NOI 2021」「洛谷 P7740」机器人游戏

    \(\mathcal{Description}\)   Link.   自己去读题面叭~ \(\mathcal{Solution}\)   首先,参悟[样例解释 #2].一种暴力的思路即为钦定集合 \ ...

  5. Solution -「JOISC 2020」「UOJ #509」迷路的猫

    \(\mathcal{Decription}\)   Link.   这是一道通信题.   给定一个 \(n\) 个点 \(m\) 条边的连通无向图与两个限制 \(A,B\).   程序 Anthon ...

  6. Solution -「NOIOL-S 2021」「洛谷 P7470」岛屿探险

    \(\mathcal{Description}\)   Link.   给定序列 \(\{(a,b)_n\}\),\(q\) 组形如 \((l,r,c,d)\) 的询问,求 \[\Big|\{i\in ...

  7. Solution -「JOISC 2019」「LOJ #3036」指定城市

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个结点的树,双向边权不相同.\(q\) 次询问,每次询问在树上标记 \(e\) 个点,标记的价值为所有趋 ...

  8. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  9. Solution -「简单 DP」zxy 讲课记实

    魔法题位面级乱杀. 「JOISC 2020 Day4」治疗计划 因为是不太聪明的 Joker,我就从头开始理思路了.中途也会说一些和 DP 算法本身有关的杂谈,给自己的冗长题解找借口. 首先,治疗方案 ...

随机推荐

  1. ubuntu 18.04 安装mongodb并设为开机自启动

    导入包管理系统使用的公钥 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB4 ...

  2. Go语言系列之知识框架

    一.Go基础入门知识 二.变量和基本数据类型 三.流程控制语句 四.数组和切片 五.map的声明和使用 六.函数func方法 七.指针和地址 八.结构体 九.接口interface 十.并发神器gor ...

  3. Kubernetes API作为权威接口,Kubernetes将成为软件的通用控制平面

    1创新之处在于API这是有关 Kubernetes的两部分系列中的第一篇.第一部分是一个答案:影响Kubernetes设计的关键思想是什么?Kubernetes会将它与其他平台区分开来吗?第二部分是关 ...

  4. HDU 1863 畅通工程 (并查集)

    原题链接:畅通工程 题目分析:典型的并查集模版题,这里就不详细叙述了.对算法本身不太了解的可以参考这篇文章:并查集算法详解 代码如下: #include <iostream> #inclu ...

  5. Linux防火墙--IPtables企业级配置策略思路

    一.防火墙简介 防火墙定义:是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内.外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术. 防火墙发展应用:最早 ...

  6. 【PTA】5-2 下列程序读入时间数值,将其加1秒后输出,时间格式为:hh: mm: ss,即“小时:分钟:秒”,当小时等于24小时,置为0。

    5-2 下列程序读入时间数值,将其加1秒后输出,时间格式为:hh: mm: ss,即"小时:分钟:秒",当小时等于24小时,置为0. #include <stdio.h> ...

  7. 面试必问之 CopyOnWriteArrayList,你了解多少?

    一.摘要 在介绍 CopyOnWriteArrayList 之前,我们一起先来看看如下方法执行结果,代码内容如下: public static void main(String[] args) { L ...

  8. 一条 Git 命令减少了一般存储空间,我的服务器在偷着笑

    元旦不是搭建了一个<Java 程序员进阶之路>的网站嘛,其中用到了 Git 来作为云服务器和 GitHub 远程仓库之间的同步工具. 作为开发者,相信大家都知道 Git 的重要性.Git ...

  9. 《剑指offer》面试题22. 链表中倒数第k个节点

    问题描述 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有6个节点,从头节点开始,它们的值依次是1.2.3.4.5. ...

  10. 【一个小实验】腾讯云的redis的主从结构的特性

    使用腾讯云上的redis,可以添加多个备机的分片,并且可以选择不同的账号来设定主从读写的策略. 现在设置两个账号:primary-主节点写,主节点读:secondary-主节点写,从节点读. 研究出了 ...