前言
不想单开的就写在这里了
都还是挺不错的啊
权限题没有
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]
i−pre[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]
i−next[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][j−1]
记忆化一下可以写的更舒服
4979
感谢OZY的DISS让我加速想出了这题
可以发现合法的路径一定是从一个点往下走一段,横着走一段,再往上走一段
直接对x轴分治,找到每个点到这个中轴线最高高度是多少
然后按这个高度排序,路径可以拆分为
A
−
u
1
+
B
+
u
2
<
=
K
A-u1+B+u2<=K
A−u1+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
−
>
i
+
n
i->i+n
i−>i+n连边,流量为代价
对于每一个LIS,从小到大连边,大概就是
m
i
n
+
n
−
>
m
a
x
min+n->max
min+n−>max,流量INF,这样连,然后源向最小的连,最大的向汇连。由于一个点不可能同时是起点和终点,所以直接跑最小割
其实不需要找到所有LIS,用dp数组f[i]向f[i]+1且大小满足限制的连就可以了
显然边数只会有
n
2
n^2
n2,非常舒服
很早就想到了这个想法只是naive的认为可能同时是起点终点就不写了,去了个厕所冷静一下发现我假了2333…