把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

IOI2018

组合动作

首先考虑如何问出第一位的信息,显然可以\(3\)步。

然后接下来考虑逐位增加,每次暴力需要两步。这样总共\(2N+1\)步。

考虑优化,首先我们发现每次允许询问串长为\(4N\),而\(4=3+1\),因此假设不是首字母的字符为\(c_1,c_2,c_3\),每次可以问\(Ans+c_2+Ans+c_3+c_1+Ans+c_3+c_2+Ans+c_3+c_3\),如果长度不变,就是\(c_1\),如果增加\(1\),就是\(c_2\),如果增加\(2\)就是\(c_3\),这样子是\(N+3\)步。

瓶颈在于第一个需要\(3\)步和最后一个需要\(2\)步,可以发现其实第一个只需要\(2\)步即可,类似于分治,先询问\(AB\),如果在\(AB\)中再询问\(A\),就可以确定出四个字符到底是哪个,这样就是\(N+2\)步。

submission

排座位

牛逼题,考场上写复杂了没调出来。

首先考虑\(H=1\)怎么做,发现如果是一个长方形充要于这是一个联通块,则线段树维护点数减去边数即可。

然后考虑扩展到二维,联通块显然是不够的,比如L型就不行。我们发现所有这样的都具有形如拐角的结构,也就是说一个\(2\times 2\)的小正方形中有恰好\(3\)个被占据。则每次修改的时候把这\(8\)个小正方形和\(8\)条边暴力修改即可。

初始化的时候用差分而非直接线段树,时间复杂度\(O(NM+Q\log NM)\)常数巨大。

submission

机械娃娃

每个点之间显然独立,考虑将每个点分开来构造。

如果一个点的出去的次数为\(2\)的幂次,则构造是平凡的,直接构造成线段树形式即可。而如果不是\(2\)的幂次,则可以补全成\(2\)的幂次,取dfs序后\(n\)个叶子节点为出边,其余指向根节点,最坏情况是\(2N\)个开关。

实际上有一些开关是无用的,我们只保留\(n\)个叶子节点在线段树上形成的虚树,容易发现这不改变答案,并且对于\(n\)个节点的出边,这是一些满二叉树加上一条链,显然是\(n+\log n\)个开关。

但是每个节点分开的log并不能对应整体的log。但是每个节点分开其实是没有意义的,直接构造一棵线段树即可。

submission

高速公路收费

牛逼题,考场上写了个神奇点分居然能过51。

首先考虑Subtask 2,已经知道了一个点,需要在树上找到另外一个点。按照深度将树分层后,显然较大深度的边改变权值对较小深度的点的最小值没有影响。因此可以二分一段深度后缀边变化,需要\(\log n\)次询问。

那么在树上只需要知道一条边在最短路上,剩下两端点可以两次二分出来。最短路上的边仍然可以二分。设当前区间为\([l,r]\),中点为\(mid\),将\([1,l),(r,m],[l,mid]\)的边都改变边权。如果最短路变化,那么\([l,mid]\)中一定有在最短路上的边,否则\((mid,r]\)上一定有。这样也可以\(\log m\)次二分出来,总共需要\(1+\log m+2\log n\)次询问。

可以扩展到图上,边照样二分,然后以两个端点跑最短路树,可以依据和两个端点的大小关系找到起点和终点可能的点,然后像在树上一样二分即可。询问次数大概是\(50\)次。可以通过。

submission

posted @ 2023-01-03 16:27  275307894a  阅读(67)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end