\(\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. [ SQLAlchemy ] 自我引用型的多对多关系(Self-Referential Many-to-Many Relationship)理解

    参考: https://www.jianshu.com/p/2c6c76f94b88 https://madmalls.com/blog/post/followers-and-followeds/ 实 ...

  2. Java数据类型 long 与 Long 的区别 和 正确用法

    1.区别 (1) long  是 基本类型  [类似于 int] Long 是 对象类型  [类似于Integer] (2) long 默认值是 0 Long 默认值是 null 2.比较方法 (1) ...

  3. 安装Cacti-plugin

    安装pluginunzip cacti-plugin-0.8.7e-PA-v2.6.zip -d cacti-plugin-archcp -R cacti-plugin-arch/* /data/ww ...

  4. PPT制作手机手指滑动效果

    原文链接:https://www.toutiao.com/i6495304998786695694/ 上一节我们完成了手机滑动粗糙效果,这部分我们将给动画添加一个手指的图片. 首先,选择"插 ...

  5. Centos安装与配置

    一.安装 默认安装 二.配置 配置网卡 BOOTPROTO=none ONBOOT=yes IPADDR=xxx.xxx.x.xx PREFIX=24 GATEWAY=xxx.xxx.x.x DNS1 ...

  6. test_3 简单密码破解

    题目描述:密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了.哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全. 假设渊子原来一个BBS上的密码为zvbo9441987 ...

  7. kibana7.x安装配置操作elasticsearch

    什么是Kibana? Kibana是一个基于Node.js的Elasticsearch索引库数据统计工具,可以利用Elasticsearch的聚合功能,生成各种图表,如柱形图,线状图,饼图等. 而且还 ...

  8. Unity3D开发入门教程(三)——添加启动脚本

    五邑隐侠,本名关健昌,12年游戏生涯. 本教程以 Unity 3D + VS Code + C# + tolua 为例. 一.启动脚本 第一篇 "搭建开发环境",在 "配 ...

  9. 【刷题-LeetCode】215. Kth Largest Element in an Array

    Kth Largest Element in an Array Find the kth largest element in an unsorted array. Note that it is t ...

  10. elementui表格里面的索引,多选的复用解决

    使用elementui表格时,当一个页面通过if判断有多个不同的表格时,其中一个或多个表格想要设置索引或者多选框时,会发现你在第一个里面设置了索引或者多选框,其他的表格都会出现,你在后面的其中一个设置 ...