T 1 T1 T1
- T ≤ 1 e 3 T\le 1e3 T≤1e3, L , R ≤ 1 e 18 L,R\le 1e18 L,R≤1e18, K ≤ 100 K\le 100 K≤100
- 考虑数位
d
p
dp
dp,
f
u
,
K
,
a
,
b
f_{u,K,a,b}
fu,K,a,b 表示到第
u
u
u 位,奇偶位的和为
a
,
b
a,b
a,b 的个数
如果每一次做一遍的复杂度是 O ( T ∗ 8 1 2 ∗ 18 ∗ 10 ) O(T*81^2*18*10) O(T∗812∗18∗10),10 是转移复杂度,凉凉
于是按照套路预处理出 f f f,复杂度 O ( 18 ∗ 8 1 3 ∗ 10 ) O(18*81^3*10) O(18∗813∗10),然后看询问怎么做
我们每次钦定当前位填的数 < < < 那一位的数,做完之后钦定当前位顶满做下一位就可以把 < < < 某个数的幸运数个数求出了,这样复杂度是 O ( 18 ∗ 10 ) O(18*10) O(18∗10) 的 - 主要是预处理过后快速询问比较巧妙, C o d e Code Code
T 2 T2 T2
- T ≤ 10 , n ≤ 400 , m ≤ 500 T\le 10,n\le 400,m\le 500 T≤10,n≤400,m≤500
- 费用流模型显然:把在集合中的贡献先全部加上,那么选一个集合中的点的费用就是负数,原点向
m
m
m 个点连费用为其本身费用的边,
m
m
m 个点向
n
n
n 个能匹配就连边,
n
n
n 个点向汇点连边
根据模拟费用流的那套理论,与原点汇点相连的边不会退流,那么我们可以贪心
按权值为第一关键字,大小为第二关键字按顺序插入,用匈牙利算法判断能不能放进去
其实就是用匈牙利模拟费用流解决字典序的问题,最坏的复杂度是 O ( T m 3 ) O(Tm^3) O(Tm3),严重不满, C o d e Code Code
T 3 T3 T3
- n ≤ 40 , T ≤ 50 n\le 40,T\le 50 n≤40,T≤50
- 本来以为要用个啥高级算法结果是搜索剪枝
考场写了个按度数排序每次 r a n d o m s h u f f l e random\ shuffle random shuffle 的大数据随机化小数据搜索的做法,结果只有 50 50 50
考下来面向数据编程可以把随机化卡成极限 90 90 90。
题解用了两个剪枝,一个是最优性剪枝(废话),一个是每个连通块处理(这个也随便卡),所以这道题就没什么意思了。
如果要随机化的话可以状压存边 O ( n ) O(n) O(n)做一遍,大概可以做 8000 8000 8000 遍