Lydsy月赛合辑

20 篇文章 0 订阅

前言

不想单开的就写在这里了
都还是挺不错的啊
权限题没有

4886

又是被OZY秒杀的我
不考虑严格大于的话你直接ai,bi取个max就过了…
现在要考虑严格大于,相当于每个矩形,都是一条在ai,bi中的边
我们定义这个数被作为一次长,当且仅当有一条新的边指向了他
最后我们就要给所有边定向,显然要求每个数最多只有一个入度,贡献就是出度*权值
显然所有的连通块要不就是环套树要不就是树
是树的很简单,只有一个点取了他所有度来作为贡献,最后加上最大的那个点的权值就行了
否则的话每个点都会有一个入度,直接算答案就行了
并查集维护一下

还是挺类似bzoj4883的

4978

只能往数据随机这方面靠了
一开始做了一个每个点找前面a,b最小的1k个暴力做,然后滚出了
我们可以确定一个阙值 M M M,使得答案在 M M M以内的所有数都被全部扫完一遍
大概确定个M=8000,后面没有被扫到的数暴力做
就能过了…
数据随机的玩意还是凭感觉啊…

4918

真是没脑子了
糊了半天才发现没把下边界容斥掉根本就没办法记忆化
别管根号的回文数枚举直接dp就可以了
预处理 s u m [ i ] sum[i] sum[i]表示能组成位数为 i i i的(含前导零)回文数有多少种方案
然后常规数位dp

5076

被OZY忽悠去写辣鸡kd树…
显然可以把贡献拆成每个点的
每个点的贡献就是 i − p r e [ i ] i-pre[i] ipre[i],其中 p r e [ i ] pre[i] pre[i]表示和 i i i颜色相同的前一个位置是什么
然后不考虑修改的话每个询问就是个二维数点
( l , l ) (l,l) (l,l)为左下角和 ( r , r ) (r,r) (r,r)为右上角的矩形数点的权值和
修改的话,直接再加一个点进去,就是权值取负的.
然后cdq就可以了

5130

性质就是每个字符串的最小循环节长度就是 i − n e x t [ i ] i-next[i] inext[i],其中这个 n e x t next next k m p kmp kmp n e x t next next数组
我们从头开始给这个字符串编号,遇到一个新字符就 t o t + 1 tot+1 tot+1,否则就拿出旧编号给他
显然这些就是本质不同的字符串,其他只是乘一个组合数而已
爆搜这些本质不同的字符串,每次做一发 k m p kmp kmp
状态数大概只有400W个,然后就可以过了…
哦其实状态数是 O ( b e l l ( n ) ) O(bell(n)) O(bell(n))的…因为就是集合划分数

5128

感谢OZY的思路
首先肯定要枚举这个母串,可以用一些诸如是否是约数,每个字母的数量是否能组成总共字母的数量的小技巧来优化
然后区间dp f [ i ] [ j ] f[i][j] f[i][j]表示 [ i , j ] [i,j] [i,j]能否被全部表示出来
两种转移
要不就是分成两段,这两段都能被表示出来
要不就是在最后的位置匹配母串的一个字符,这个字符是确定的,然后询问 f [ i ] [ j − 1 ] f[i][j-1] f[i][j1]
记忆化一下可以写的更舒服

4979

感谢OZY的DISS让我加速想出了这题
可以发现合法的路径一定是从一个点往下走一段,横着走一段,再往上走一段
直接对x轴分治,找到每个点到这个中轴线最高高度是多少
然后按这个高度排序,路径可以拆分为 A − u 1 + B + u 2 &lt; = K A-u1+B+u2&lt;=K Au1+B+u2<=K
其中A是较矮那段的长度,B是较高那段的长度,u1是A的高度,u2是B的高度
排序一下从上往下扫就可以了,注意算重的情况,复杂度是 n l o g 2 n nlog^2n nlog2n

5075

不难发现可以大胆猜想中间那一段的雷数是唯一的
我们可以求出从第3行开始,每次下移3行的行的雷数,就是3,6,9,12,15…行的
同理,我们也可以求出从第n-2行开始,每次上移3行的雷数,就是n-2,n-5,n-8,n-11…行的
怎么求的话,以第3行为例,用第二行求出1~3行的和,再用第一行求出1~2行的和就可以知道了
如此n有两种情况,如果n-2模3不为零的话,显然我们可以每三行求出其中不同两行的和,这样第三个行的和也就确定了
如果模3为0的话,显然n/2+1这一行模三为0,于是这一行在一开始就能知道
所以无论如何我们都可以知道n/2+1这行的和…直接扫就可以了
一开始太过于纠结具体的填法…就忽略了某些行的数量是一定的,因为具体只可以有一个 2 n 2^{n} 2n的做法…

5096

题目条件限制很舒服…很好证明这个最长上升子序列一定是A,B两串的最长上升子序列之和
证明的话可以考虑反证法…不展开了
现在的方向就是要在序列中删除一些数,使得LIS减小
于是可以每个数拆点 i , i + n i,i+n i,i+n,从 i − &gt; i + n i-&gt;i+n i>i+n连边,流量为代价
对于每一个LIS,从小到大连边,大概就是 m i n + n − &gt; m a x min+n-&gt;max min+n>max,流量INF,这样连,然后源向最小的连,最大的向汇连。由于一个点不可能同时是起点和终点,所以直接跑最小割
其实不需要找到所有LIS,用dp数组f[i]向f[i]+1且大小满足限制的连就可以了
显然边数只会有 n 2 n^2 n2,非常舒服
很早就想到了这个想法只是naive的认为可能同时是起点终点就不写了,去了个厕所冷静一下发现我假了2333…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值