zoukankan      html  css  js  c++  java
  • 一句话题解(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的期望,枚举算一下

  • 相关阅读:
    python os
    [BZOJ2887] 旅行
    UVA1104 Chips Challenge
    CF364E Empty Rectangles
    CF1408H Rainbow Triples
    CF1214G Feeling Good
    CF506E Mr. Kitayuta's Gift
    采用Canal监听mysql数据库变化
    Java8 ParallelStream
    Java8 方法引用
  • 原文地址:https://www.cnblogs.com/gmh77/p/14956719.html
Copyright © 2011-2022 走看看