按时间插入的题,优先考虑时光倒流。
操作正着比较麻烦的题优先考虑反着来。
很迷的时候考虑答案的长相。
边定向,一点最多一个入度,一定是基环树/树
让你求能否让一个S经历一顿操作变成T
1:能否T到S
2:如果能,那么我们能否找到一个S和T都能变成的,唯一的中间方案。
3:怎么把S和T按照规则处理成这个中间方案。
科学合理的序列DP题求方案题,强行搞成对于每个子串都查一发答案:
假设状态为
d
p
[
p
o
s
]
[
m
a
r
k
]
dp[pos][mark]
dp[pos][mark],考虑如果只有一个起点
那么令
d
p
[
1
]
[
S
p
e
m
a
r
k
]
=
1
dp[1][Spemark] = 1
dp[1][Spemark]=1就好,
多个起点,对于每个pos,将所有的
d
p
[
p
o
s
]
[
S
p
e
m
a
r
k
]
dp[pos][Spemark]
dp[pos][Spemark]都搞成
1
1
1就行了。
固定终点,在
d
p
[
n
]
[
s
p
e
m
a
r
k
]
dp[n][spemark]
dp[n][spemark]收集答案。
多个终点,对于每个
p
o
s
pos
pos,在
d
p
[
p
o
s
]
[
s
p
e
m
a
r
k
]
dp[pos][spemark]
dp[pos][spemark]收集答案。
多个V形求个max,一定单锋,且还是个V
如果限制为“比XX小的最大的XXX”,没法直接线段树/主席树的话,考虑把XX作为时间,离线操作。
曼哈顿 -> 切比雪夫
每个点有两个属性,a,b,考虑连续区间内,b不同的a的差的最大值问题,线段树维护a的最大最小、次大次小与对应的b,实现用pair,实现用pair,实现用pair。
看见and、or、xor,记得提醒ghj和卢姥爷,是不是FWT。
找规律的题,弄个表,打印出来,坐到一边手推,别占用电脑。
树形背包,sizemax为 k k k,则复杂度其实是 n k nk nk,而不是 n k 2 nk^2 nk2
序列里面的"排序后连续"问题,统一转 m a x − m i n − r + l max-min-r+l max−min−r+l,注意这东西大于等于0,线段树维护min和mincount,单调栈维护min max
栈,push、pop,维护minmax,搞一个单调的,一个不单调的。
树上选k个点,路径和,考虑定边的贡献。dp[i][j]表示,考虑在i子树中,选j个点,所有i以内的边产生的贡献(注意是这些边的贡献,不仅仅是这些边对于这些点的贡献。)
转移的时候,因为知道一共会选择多少点,所以就会有一个
d
p
[
s
o
n
]
[
v
a
l
]
∗
l
e
n
∗
(
k
−
v
a
l
)
dp[son][val] * len * (k-val)
dp[son][val]∗len∗(k−val)的贡献。
“林克卡特树”模型的树上dp问题,状态 d p [ n ] [ 0 / 1 / 2 ] dp[n][0/1/2] dp[n][0/1/2],分别表示考虑i子树,i当前点度为0/1/2,dp写成struct,struct.val和.cnt,重置掉加法和比较。
GHJ的奇妙技巧:
先说题吧,给你个长度为n的整数数列,q个询问,问的是 “在区间[l,r]的所有子区间中,小于U的最大的子区间和是多少?”
n = 2000, q = 1e5
大力出所有的区间和,离线所有询问,把值作为时间,搞掉第三维。
重点来了重点来了。
考虑区间
[
l
,
r
]
[l,r]
[l,r]的一个子区间
[
a
,
b
]
[a,b]
[a,b],他一定满足
a
≥
l
a\geq l
a≥l且
b
≤
r
b\le r
b≤r。
如果两边都是小于就好了,就可以二维前缀和上BIT了。
那咋整?对称呗。
把区间左端点在
[
1
,
n
]
[1,n]
[1,n]做个对称,
k
k
k放到
n
−
k
+
1
n-k+1
n−k+1去。
然后是不是就变成俩小于了。
摸出BIT。
GHJ牛逼!
啊对 特此感谢SWUST的SY选手,让我注意到这个技巧并与大家分享。
(你敢信我在此之前并没有意识到这BIT做二维区间有多离谱这件事)
对于某些“靠后出现的武器一定不劣于靠前出现的”这样的问题,可以考虑用最短路解决。路径长度定义为 “当前代价-到达的最小代价”, 即“浪费值”
如果有其他限制,可以考虑将代价拆分为几部分:从起点拿到最强的武器、用最强的武器进入基环外向树的环、用环里拿到的特殊武器吊打其他怪物,在跑第一部分代价的时候,算好每个决策带来的额外代价即可。
其中第一部分我们只用关心拿到最强武器路径上的浪费值,故可以用最短路来算
SUSTECH兔老师NB!
对于某些DP题, D P [ i ] [ j ] [ k ] DP[i][j][k] DP[i][j][k],发觉一定有 i = = j ∣ ∣ i = = k i==j || i==k i==j∣∣i==k,那不妨直接把i干掉。(ARC073F、ARC074E)
只支持加入,查值域上前n大的数字和,可以用堆来做,维护个小根堆,每次看要不要换掉堆顶元素,不要一言不合权值线段树。
Hall定理:
二分图的最大匹配数为
N
−
M
a
x
(
∣
X
∣
−
∣
N
e
i
g
(
X
)
∣
)
N - Max(|X|-|Neig(X)|)
N−Max(∣X∣−∣Neig(X)∣),
X
X
X为一边的一个子集,Neig是这个子集的邻居,想个办法搞定那个
M
a
x
Max
Max就皆大欢喜。
见到区间翻转,可以无脑差分,变两点翻转。
哥 德 巴 赫 猜 想:大于6的偶数可以拆成俩奇质数。
最长的不在某个串里面的子序列:可以反着做dp,如果要求字典序的话,就dp[i]表示i这个后缀的最长不在里面子序列,然后转移,然后顺着输出字典序。
悬线法找最大全1矩阵:
O
(
n
2
)
O(n^2)
O(n2)处理每个点往左、往右的步数,统计答案的时候,对于每个格子,如果他是障碍,那么他高度为0,否则他继承他上面的那个格子的值,然后左右延伸距离取min,一路统计答案。
好像这个也可以用单调栈做,枚举底,然后做底边相同的那个最大全1矩阵,上单调栈就完事。在此之前处理一下每个点的往上延伸的距离,单调栈弹出的时候统计答案。
“首先看到网格图,依据你对atcoder的理解,应该可以想到行列连边。”——某题解
蛤蛤的项链那个操作,套个BIT之后可以加个值域限制。
还是蛤蛤的项链那个操作,BIT里面挂个Trie,可以区间统计
X
x
o
r
A
≤
B
X\ xor\ A \le B
X xor A≤B的元素种类。
奇怪的单点到单点的大小限制,应该要快速想到建图连边拓扑序。
常系数线性递推式是可以求通项的,求出来之后呼叫GHJ和卢姥爷写BSGS
贴个知乎链接 https://www.zhihu.com/question/25217301
排序后连续/等差数列,一定会用到 r − l = M a x − m i n r-l=Max-min r−l=Max−min,等差数列的话在左边乘一个GCD就好,基于前缀GCD每次变化至少折半的性质,可以证明一些奇怪的复杂度。
读题的时候大力观察有没有distinct,首先不能星际,其次就是distinct会有个调和级数的性质。
如果 ( x 1 , y 1 ) (x_1,y_1) (x1,y1), ( x 1 , y 2 ) (x_1,y_2) (x1,y2), ( x 2 , y 1 ) (x_2,y_1) (x2,y1)都搞定了,那么 ( x 2 , y 2 ) (x_2,y_2) (x2,y2)也会自动把自己搞定:这东西是个MST,行列建点,格点为边。