2020/2021省选作业题目反思

  • 废话不要这么多

T2 cf674G(2020.9.5)
  • 这一道题是之前在OJ上做过的原题。
  • 主要的问题就是思维很容易陷在如何求区间众数上面,其实这道题要求的是绝对众数,并且 p > = 20 p>=20 p>=20是一个很关键的突破口。
  • 考虑 ⌊ 100 p ⌋ < = 1 \left \lfloor {\frac{100}{p}} \right \rfloor<=1 p100<=1的情况,剩下的同理。
  • 发现可以在线段树上面维护一个答案和附带的权值,合并的时候假如答案相同就将权值相加,如果权值不同就选权值比较大的那一个,并且拿大的减去小的。
  • 明明做过的题目去还有很长时间才重新想出来,说明自己以前没有好好反思总结。

T3 agc026_f(2020.9.8)
  • 这一道题有一个很关键的性质,就是无论如何都千万不能让后手变为先手,因为先手可以自由选择起点,优势特别大。
  • 所以假如这个序列的长度是偶数的话,先手只能取两边。
  • 如果长度是奇数的话,我们发现先手只能在偶数的位置上取,并且双方取到最后会剩余一段长度仍为奇数的序列,此时先手会从两端开始取。那么除了这一段先手取奇数位之外,其余的部分先手取的都是偶数位。所以我们需要最大化最后这一段(奇数位之和-偶数位之和)的值。
  • 问题的转化就是将序列分成几段,后手肯定会保留上述值最小的那一段,所以我们要选择一个分序列的方案,这样的话简单的二分+DP即可。
  • 这一道题一开始我还看错题了,结果想了好久做的都是无用功,以后做题之前一定要反复看题目。
  • 这道题有各种各样的转化以及巧妙地结论,是一道很灵活的博弈题,也可以适当地弥补自己在这方面的空缺。虽然码量很短,但是想了超级超级久。

T4 agc034_d(2020.9.9)
  • 看到二分图,一个想到的就应该是网络流。这道题只要想到是网络流就简单了,只要把曼哈顿距离化为一个max的式子,再套一个最大费用最大流就可以了。
  • 但是我不知自己是不是脑子抽筋了,想了半天都没有想到要用网络流,还花了很长一段时间在想怎么用贪心、分治之类的算法来做,想通了以后恍然大悟。
  • 只能说自己想题的思维发散性还不够,应该一条路走不通就赶紧想想其它的路。

T6 cf573E(2020.9.14)
  • 这是我和一个巨犇YYT共同解决出来的题目,其中他出了大部分力。
  • 首先有一个结论:长度为 i + 1 i+1 i+1的最优解是长度为 i i i的最优解增添一个数得到的。
  • 问证明?我不会证。
  • 那么做法就很简单了,就是每一次找到贡献最大的那一个数加进去。接着修改一下还没加进去的数(假如)加进去之后的贡献。很明显每一个贡献都可以分解成 k ∗ a [ i ] + b k*a[i]+b ka[i]+b的形式,这样就可以用分块+凸包来解决了。
  • 时间复杂度: O ( n ∗ s q r t ( n ) ) O(n*sqrt(n)) O(nsqrt(n))了。
  • 要是说这题还要吸取什么经验的话,那就是“大胆猜想”。

T5 agc024_f(2020.9.15)
  • 这道题比较奇怪,想了很久,最后还是看了一眼题解。
  • 很显然假如拿 i i i去匹配 j j j,最优的匹配方法是对于 i x i_x ix j y j_y jy,找到最小的 y ′ y' y使得 i x + 1 = j y ′ i_{x+1}=j_{y'} ix+1=jy,然后
  • 首先比较自然地一个暴力就是设一个bool数组 b k [ i ] [ j ] bk[i][j] bk[i][j]表示的是一个01串 i i i能否去匹配一个01串 j j j,但是发现时间空间复杂度都是 O ( 2 n ) O(2^n) O(2n)的,显然不能过,考虑把状态压缩一下。
  • 发现对于一个状态 b k [ i ] [ j ] bk[i][j] bk[i][j],以后的转移都与接在 j j j后面的01串有关,而与 j j j本身并没有多大的关系,所以可以设一个DP数组 f [ i ] [ k ] f[i][k] f[i][k],代表拿01串 i i i去匹配 j j j,匹配后剩余的01串为 k k k,这样的合法的 j j j的个数。发现 i i i k k k的位数和不超过 n n n,所以时间复杂度就变为 O ( 2 n ∗ n ) O(2^n*n) O(2nn)了。
  • 总的来说还是自己并没有找到一个合适的优化DP的方法,不会巧妙地转换状态。

T7 cf704E(2020.10.13)
  • 这是一道思想也难,实现也难的题目。
  • 显然树链剖分,先把每条线段的端点按横坐标排序,然后用类似于扫描线的方法处理。
  • 有一个关键的性质就是:假如两条线段会相交,那么它们在某一个时刻一定是相邻的。这样子就很好办了,可以用一个平衡树/set维护每一条线段,插入的时候查找前驱后继更新,删除的时候也是如此。
  • 关键在于这个题目的细节有yi点多,怒肝了两个晚上,打了5k+的代码,终于AC了,旁边有一个同学提交了将近30次才AC。

T48 agc027_d(2020.10.15)
  • 又看错题意了,虚空肝题半小时。
  • 考虑用“相邻”这个条件,发现可以把整个矩形像国际象棋盘一样分成黑白两部分。这样我们可以把一些质数填在白色里面。黑色即为旁边几个白色的lcm +1。
  • 因为要不超过 1 0 15 10^{15} 1015,所以显然把白色填成两个质数乘积的形式是最优的。

T25 arc091_d(2020.10.16)
  • 首先显然可以转换为求SG值的问题。
  • 然后打表找规律即可。
  • (我也不知道这么自然简单的方法为什么没有想出来)
  • 这个故事告诉我们不会求数列就考虑用打表求解。

T34 agc032d(2021.3.14)
  • 这道题本来是比较清真的,但是自己想了好久。
  • 考虑选择一些点是不作为一个区间的 l , r l,r l,r旋转的,那么它们的相对顺序不变。
  • 这些不动的点就把整个序列分成了许多个区间。
  • 然后其它点就判断一下是否在相应的区间里面,如果不是就加上相应的 A / B A/B A/B
  • f [ i ] f[i] f[i]表示做到第 i i i个点,它是不动点,最小的代价。
  • O ( n 2 ) O(n^2) O(n2)DP即可。

T32 agc025e(2021.3.12)
  • 设一条边被 c c c条路径经过,那么它的贡献的上界是 m i n ( 2 , c ) min(2,c) min(2,c)
  • 考虑怎么取到上界。
  • 考虑把两两路径之间的交求出来,然后把这些路径交中被包含的删掉。剩下路径交转化为一些两条路径方向不同的条件,用并查集维护即可。
  • 可以发现这样是正确的,具体证明可以考虑三条路径最多只会生成2条不互相包含的路径交。所以不会形成阴间环的情况。

T20 agc036e(2021.3.14)
  • 这道题没有实现,但基本上是对的。
  • 考虑选择一个出现次数最多的字符(假设是A),把这个字符当做挡板,然后挡板内就只能填一些交替的BC。有些A删掉是不会损失BC的,有些是会损失。先删没有损失的A,然后剩下的A就一定要么损失1个B,要么损失1个C。
  • 假如B的出现次数大于C,那么优先删损失B的即可。
  • 考虑A的删除个数所造成的答案大小是单峰的,在某个恰当的时候求出答案即可。

T31 agc023f(2021.3.11)
  • 先考虑一个简单的问题,对于一个点,假如它必须要先删一个子树才能再删另一个子树,求答案。
  • 列一个不等式就可以发现先删 c n t 0 c n t 1 \frac{cnt0}{cnt1} cnt1cnt0大的肯定更优。其中 c n t 0 cnt0 cnt0表示该子树0出现的个数, c n t 1 cnt1 cnt1表示该子树1出现的个数。
  • 那么原题该怎么做呢?
  • 我们把所有点扔在一起考虑,但考虑到要先删父亲才能删儿子,我们只能考虑相邻的点。假设现在有一个 c n t 0 c n t 1 \frac{cnt0}{cnt1} cnt1cnt0很大的点,我们就把它和它的父亲连接起来,表示它的父亲一删完就要删这个点。
  • 那剩下的点该怎么办呢?假如一个点已经和它的父亲连接起来了,那就把它们看做一个新点, c n t 0 , c n t 1 cnt0,cnt1 cnt0,cnt1为这两个点的和。这样就变成了一个子问题,因为最多只会合并 n n n次,所以时间复杂度是 O ( n l o g n ) O(nlogn) O(nlogn)的。

T36 agc020e(2021.3.30)
  • 这道题没想到这么清真。
  • 考虑对于一个字符串,我们可以把它分成几个拼接起来的字符串,这个时候我们要枚举最后一段的长度,然后把这个字符串分成两部分递归处理。
  • 对于 ∗ K *K K的情况我们枚举长度的约数,发现就会变成一个子问题。
  • 用hash压缩一下空间,发现100最多只会有6w种。
  • 记忆化搜索即可。

T29 cf708D(2021.4.2)
  • 这道题费用流应该是很自然的,但不知道自己为什么没想到。
  • 可能是因为身体不适的缘故吧。
  • 有点像上下界网络流的做法,建一个超级源点和超级汇点,然后根据需要让所有点和超级源汇连边,最后每一条原图中的边也分类讨论新建几条边,主要思路就是根据 c , f c,f c,f的相对大小,建正向边( f f f增加)或反向边( f f f减少),就可以转化为一个最小费用最大流问题。
  • 例如当 f > c f>c f>c时如果想让 f f f增加就要花费 2 2 2的代价。
  • 注意要先让所有 c < f c<f c<f c c c变成 f f f

T30 agc036f(2021.4.2)
  • 果然以我现在的能力F题还是相当有难度的。
  • 先去除掉左区间的限制,发现很容易做,再考虑容斥加上左区间的限制。
  • 有几条很重要的限制:
    1. min ⁡ i = 0 n − 1 R i ≥ max ⁡ i = n 2 ∗ n − 1 R i 1.\min_{i=0}^{n-1}R_i \geq \max_{i=n}^{2*n-1}R_i 1.i=0minn1Rii=nmax2n1Ri
    2. min ⁡ i = 0 n − 1 R i ≥ max ⁡ i = 0 n − 1 L i 2.\min_{i=0}^{n-1}R_i \geq \max_{i=0}^{n-1}L_i 2.i=0minn1Rii=0maxn1Li
    3. L i = 0 ( n ≤ i < 2 ∗ n − 1 ) 3.L_i=0(n \le i<2*n-1) 3.Li=0(ni<2n1)
  • 我们就可以发现只有0到n-1容斥是有意义的。
  • 但是我们需要排序啊?
  • 发现根据以上性质,不管怎么排序,它的顺序都和前n个以左端点为关键字排序,后n个以右端点为关键字排序是一样的。
  • 那么我们就可以直接设DP来容斥。
  • f i , j f_{i,j} fi,j代表做到第 i i i个数,容斥了 j j j个的方案数。
  • 分三种情况:后n个,前n个容斥,前n个不容斥。
  • 发现有一点小问题,需要把选 0 , 1 , 2 , 3 , . . . , n − 1 0,1,2,3,...,n-1 0,1,2,3,...,n1个容斥分开来做。
  • 每一次是 O ( n 2 ) O(n^2) O(n2)的,所以总时间复杂度是 O ( n 3 ) O(n^3) O(n3)的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值