交互题(一)

普通交互题

UR #10 世界线

  • 有一个长度为n的排列A,而你需要求出它
  • 你可以进行两轮实验,每轮开始有一个2n个点的图,且有边(i, A_i+n),每轮实现分为两个部分,第一个部分你可以在[1,n]的定点间连一些边,,第二个部分你可以询问[n+1,2n]的顶点间的联通关系。
  • 加边和询问的数目都不得超过2\cdot 10^6
  • n \le 10^4

每个联通块内的点都是不可区分的

试着采用连通块大小传递一些信息

如果在两轮种都给每一个i分配不同的大小,就可以区分开来

第一次连所有横边,知道了纵坐标大小

第二次连所有竖边,知道了横坐标

如何把图分为若干个联通块?

联通块数目只有2\cdot \sqrt{n}级别,暴力即可

对于每个联通块询问一次即可

加边是O(n)

IOI2014 Game

  • Bob有一个图,Alice想向Bob询问这个图是否完全连通,但Alice每次只能询问一条边是否存在,Bob想最大化Alice的询问数,简单来说,Bob需要让Alice至少问n \cdot \dfrac{n-1}{2}次,且在这之前Alice都无法确定图是否完全连通,为此Bob甚至可以在Alice询问之前更改图,但不能违背之前的回答
  • 你需要按Bob来回答交互库Alice的询问
  • n \le 1500

代码很好写

#include "game.h"
int c[1600];
void initialize(int n){}
int hasEdge(int u,int v){if(u

Secret

  • 交互库给出一个加法运算(满足结合律但不一定满足交换律),给出一个序列A,每次询问一个区间求区间和(使用交互库中的加法运算)
  • 要求一次询问只能调用一次加法运算,且初始化过程中调用加法运算的次数不超过8000.
  • N \le 1000, M \le 10^4

首先此题不能用树状数组,只能用线段树(没有减法运算)

建立一个线段树,不维护区间和,对于每个区间节点维护中点向前的前缀和与向后的后缀和

Oath

  • 给一个运算,有结合率,有一个序列刚开始为空,有三个操作:
  1. 在某个版本的序列末尾添加一个元素得到新版本
  2. 在某个版本的序列末尾删除一个元素得到新版本
  3. 询问某个版本的序列区间做运算的结果
  • 每个询问只允许调用一次运算
  • 交互库会根据调用运算的次数生成数据(比如交互库检测到你删除所用的操作较多,就会生成一坨删除操作来把你卡掉)
  • m \le 3\times 10^5

据lzz所说他写了19K的交互库就为了卡掉各种时间复杂度不是期望的算法(

很显然这是一道强制在线的题目,所以....

一个显然的想法就是建线段树(很容易炸)

如果只有插入,没有删除的时候这个复杂度是对的

但是有了删除之后复杂度就变成均摊的了,就可以卡掉,使得变成非均摊

可以把2号操作变成查询历史版本

可以把3号操作变成询问某个版本的后缀和

用Treap维护

每个节点维护向左的后缀和与右子树和

加节点为O(1)

Treap有旋转,旋转的时候直接把子树暴力重构一下,子树期望大小是log n

Treap是重量平衡的

插入节点的时候直接把右子树加上这个节点就可以了

Treap是个期望数据结构,所以不会被卡,重构的概率非常低

通信题

定义:有两个程序,第一个程序获得一些输入,处理出一些格式的信息给第二个程序,第二个程序获取这些信息和一些输入,输出询问所求的答案

有损信息压缩

  • 对长度为10000的英文文章进行压缩再解压,加密前和加密后的字符都是小写字母和" ",",","."。传输过程中每一个字符有\dfrac{1}{10}的概率损坏

做法比较诡异(lzz说的)

字符集为29,看成0~28

每18位一组,传29位过去

接收方只要在29位中保留了18位就能还原

把18位看成一个17次多项式,28位就相当于点值

只要知道18个点值就可以插值插回这个多项式

正确率?

考虑单个损坏超过9位的概率,总正确率是99.44\%

US Camp 16

  • N张卡片传输信息,每张卡片可能朝上或者朝下,传输过程中可能整体颠倒,求传输信息量和构造方案
  • N \le 60

US Camp 17

  • N张卡片传输信息,每张卡片可能朝上或者朝下,传输过程中可能把最下面一张放到上面(只放一次),最大化传递信息数目
  • N \le 22

对于每个串考虑循环节

如果循环节是奇数

把这个串右移2位,4位,6位,以此类推

最小表示法的思想

Coins

  • 给一个8 \times 8的棋盘,编号从063,每个格子上有一个硬币,你可以翻转至多1枚硬币,传输一个063之间的整数

Amusement Park

  • Alice和Bob会获得同一张无向图(点和边的编号都相同),此外Alice还会获得一个[0,2^{60})的整数X,Bob获得他现在的位置P
  • 现在Alice必须在一个点上放一个Bit,而Bob可以移动不超过120次并获得经过的所有点上Alice放的Bit.
  • Alice需要把X发送给Bob。
  • 60 \le N \le 10000; M \le 20000

先求最小生成树

从根开始随便找一个大小为60的联通块,DFS

Goodbye Yiwei E新年的贺电(UOJ178)

  • 传输一个大小为2^{10}2^{32}\rightarrow 2^{10}的map

一个显然的做法就是取一个比较大的模数,大概在10^6

把map看成多项式

插值插回去即可

大概能获得40~50分

你可能感兴趣的:(交互题,OI)