\(\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. Vue系列教程(一)之初识Vue

    一.Vue和MVVM Vue是一个渐进式的js框架,只注重视图层,结合了HTML+CSS+JS,非常的易用,并且有很好的生态系统,而且vue体积很小,速度很快,优化很到位. Vue技术周四MVVM开发 ...

  2. Echart可视化学习(十一)

    文档的源代码地址,需要的下载就可以了(访问密码:7567) https://url56.ctfile.com/f/34653256-527823386-04154f 官网找到类似实例, 适当分析,并且 ...

  3. STM32 EXTI(外部中断)

    一.EXTI 简介 EXTI(External interrupt/event controller)-外部中断/事件控制器,管理了控制器的 20个中断/事件线.每个中断/事件线都对应有一个边沿检测器 ...

  4. day23 结构体

    (1).若有说明和定义: typedef int *integer: integer p,*q: 则下列叙述正确的是[C] (A).q是基类型位int的指针变量 (B).p是int型变量 (C).p是 ...

  5. day 13 函数指针类型

    (1).有以下程序: 则正确的选项是[B] (A).7 4 (B).4 10 (C).8 8 (D)10 10 分析:主要考求字符串的长度,strlen是专门求字符串长度的函数,但不包含'\0'在内. ...

  6. Kafka connector (kafka核心API)

    前言 Kafka Connect是一个用于将数据流输入和输出Kafka的框架.Confluent平台附带了几个内置connector,可以使用这些connector进行关系数据库或HDFS等常用系统到 ...

  7. nacos集群开箱搭建

    记录/朱季谦 nacos是一款易于构建云原生应用的动态服务发现.配置管理和服务管理平台,简单而言,它可以实现类似zookeeper做注册中心的功能,也就是可以在springcloud领域替代Eurek ...

  8. Casbin + Gin + Gorm 学习探索

    Casbin 是一个强大的,开源的访问控制框架,权限管理机制支持多种访问控制模型: 并且支持多种编程语言: 文档地址:https://casbin.org/docs/zh-CN/overview Gi ...

  9. python20day

    昨日回顾 正则表达式 元字符 量词 贪婪非贪婪 转义符 re模块 findall 会优先显示分组内容 取消优先显示(?: ) search 只能返回第一个符合条件的项 得到的结果需要.group()取 ...

  10. Task+ConcurrentQueue多线程编程

    队列(Queue)代表了一个先进先出的对象集合.当您需要对各项进行先进先出的访问时,则使用队列.当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队. ConcurrentQueue< ...