一句话题解(2021.7&8)

7167. 【2021.07.12 NOI模拟】简单的希尔伯特曲线题(hilbert)

发现一行的和为\((4^n-1)2^{n-1}\),所以可以根据右上角分类讨论

第一象限:左/下都是算行的和,右上递归

第二象限:下是算行的和,左上递归

第三象限:xy交换递归

第四象限:容斥递归右下

loj#3342. 「NOI2020」制作菜品

先考虑m=n的,发现可以通过把数减K然后把正的移到负的上均摊来构造,一定有解

再考虑m=n-1,发现只用多合出一个-K然后变成m=n,由于总和合法所以显然可以,只用从0开始贪心往负的那边跳,跳不动了就跳正的

最后m=n-2,只用找到一个和为-K的集合,然后做两遍m=n-1,找集合用bitset优化,最后反着找状态来求方案

loj#3340. 「NOI2020」命运

考虑dp,设f[i,j]表示考虑子树i,从下往上的未确定的路径的最深端点深度为j

转移先做max卷积,然后加入当前点往上的(一段前缀后移到某一位),再删掉超过当前深度不合法的(后缀清0),可以直接维护f的前缀但这样不好优化

实际问题就是线段树合并做max卷积,维护前缀和即可

loj#3339. 「NOI2020」美食家

把时间和位置压成(5n)^2的矩阵,直接矩乘

7162. 【2021.07.06 NOI模拟】膜拜大丹(worship)

结论:最优长度为2,因为只用取某一次往高处走的然后连向走到他的

把点放到(i,ai),(bj,j),set直接求

7161. 【2021.07.06 NOI模拟】路过中丹(pass)

看错了两次题

首先如果中间存在ai=ai+2,则可以走L->R->i+1->i or i+2构造,判掉

剩下不存在ai=ai+2,发现此时只能存在偶回文串覆盖,因为如果想同时往一边走根据之前的关系可以移到ai,ai+2,不存在

考虑每个位置的最短串覆盖,由于回文串可以往内缩所以只用求出作为左/右端点的最短串,马拉车+单调栈求

询问[L,R]只有存在在[L,R]中间的且区间包含[L,R]的才不合法,实际是二位偏序,排序扫描线+线段树

7160. 【2021.07.06 NOI模拟】合成小丹(merge)

先通过合并相同长度的求出答案的长度,之后按位确定变成判定问题,只用合出一个合法的即可

如果还是直接按长度来搞会错,因为合并的长度可能不同(在不同层

发现合并操作写出来是一棵二叉树,从下往上每次把同层的合并

求出每个数可能所在的层,显然越往上越优因为可以省掉其他的,求出后O(w)判断,复杂度在于怎么O(w)求

实际直接用二进制维护每个数可能的后缀位置,每次and一下然后取lowbit即可,hash确定次数

6132. 【NOI2019模拟2019.4.18】构图

按绝对值小->大排序

全负显然是一段首尾连,剩下的和1连;有正数就用正数和一段负数的后缀对位连,多出的和最小负数连,前面的负数变为全负的情况

因为不能有空,不能在非最小的重叠(都可以后移)

100207. 决心

操作次数最多为2,奇环可以固定一个点往外扩展操作,偶环可以固定一条边扩展,或者固定一个点扩展

一个环内部的操作方案为环长(环长=2时操作方案为1,但是可以选择回合所以也是2),还有相同大小的环可以有环长种方案合并(不是各选一个点的环长^2,这样会算重)

若合并的环长度和为奇数则显然不行(多用了一次),为偶数则只有固定点的方案可以,而固定点一定是要对角线,所以两个环长度相等

暴力划分,求一种大小环的方案用O(个数)求,哈希记忆化后时间近似于O(nk+(ΣS(k,i))*k+2^k*k^2)

因为每种环初始和为n,合并链后加[0,k]所以是nk;多出来的k^2部分只会在组合出来的环长里贡献,即2^k*k^2

CF1542E. Abnormal Permutation Pairs

判断排列字典序:前面一段相同,所以dp不同字符后的那段,最后加上不同的字符

前缀和优化O(n^3)

agc054

A:首先排除首尾不同的,剩下就判断是否存在连续两个和头不同的,否则为-1

因为如果没有则无论怎样删都无法让连续两个和头不同

B:等价(?)题意:把n个数分成两个集合,使得和相等,贡献为Σ方案*(|S|)!*(n-|S|)!

可以发现按顺序把两个集合加到原排列里唯一对应

C:反着做,只能移sum=K的,并且由于K是最大的所以后面没有小于当前数的,所以可以任意移,乘(n-i+1)

D:先求出不考虑x把括号匹配的步数,然后应该可以等价在每对括号中间划线,每段贡献是最长o,求最大贡献,可以1d1d+细致讨论做到n^2,或者一个个把ox加入

阳间的做法是直接设f[i,j]表示做到i,带着j个的答案,g[i,j]表示放了一个未匹配的(,根据遇到的字符讨论:

(:由于放(与符号无关,所以经过(字符时只用判断当前的是否往前移,由于前面的(已经匹配了,所以用前缀和即可得到没有多放的)个数,多放的)=(所以可得,注意g可能存在一个(未和)匹配所以要+1

):)只会往右走所以直接加

o:f不变,g+1

x:f不能过,g+1

时间复杂度O(n^2)

E:结论:设p1<pn,合法的充要条件是存在i使得pi<=p1且pi+1>=pn

证明:反着搞,只要删掉(p1,pn)内的数剩下的即可随便删

充分性显然,用p1,pi和pi+1,pn即可删掉两侧的,剩下的一定在范围外

必要性考虑归纳反证,对于当前的n假设不存在i且合法,则第一步放下的会分成两个子问题,且有一边的限制更紧,必然不存在i,所以不合法,找不到第一步放下的

计数直接暴推,容斥不合法的,枚举(p1,pn)中间的数个数,剩下的按 中间-大于-小于-中间 放,最后变为求组合数一列

F:结论:能删完的充要条件是ai,bi-1,bi的和为偶数且没有超1/2的

证明:必要显然,充分可以归纳,从头往后找第一个把bi-1,bi减1不合法的作为右端点,操作即可

先用差分约束/前后缀和做到bi-1>=bi+ai,bi>=bi-1+ai,若有ai>=bi-1+bi则分成子问题

此时的一些性质:除端点外ai<bi-1+bi,且若(bi-1+bi+ai)%2=1则约束关系取不到等号

对于每个子问题,若(bi-1+bi+ai)%2=1的个数为偶数则方案唯一,两两配对中间b减1

否则考虑每个a是否能-1,若(bi-1+bi+ai)%2=1则显然可以,否则减1后可能会压到左/右的界,会不断往左/右b减1,直到某个没有压界的位置停下来

维护前/后的第一个停下来(ai<=(bi-1+bi)+1)的位置判断,还有一个问题就是当ai=(bi-1+bi)+1时,减1后会变为偶数分成子问题,此时用前面的(bi-1+bi+ai)%2=1个数判断

时间复杂度O(n)

6058. 【GDOI2019模拟2019.3.13】false-false-true

反过来求最多,最优显然是哪边多走哪边,把折线写出来发现只有在y=x处会猜方向,其余都是固定的

并且固定方向时的总和(势能)为max(n,m),每次走到y=x时还会多1/2的期望,枚举算一下

posted @ 2021-06-30 22:25  gmh77  阅读(261)  评论(0编辑  收藏  举报