解题思路整理

按时间插入的题,优先考虑时光倒流。

操作正着比较麻烦的题优先考虑反着来。

很迷的时候考虑答案的长相。

边定向,一点最多一个入度,一定是基环树/树

让你求能否让一个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 maxminr+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(kval)的贡献。

“林克卡特树”模型的树上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 al b ≤ r b\le r br
如果两边都是小于就好了,就可以二维前缀和上BIT了。
那咋整?对称呗。
把区间左端点在 [ 1 , n ] [1,n] [1,n]做个对称, k k k放到 n − k + 1 n-k+1 nk+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==ji==k,那不妨直接把i干掉。(ARC073F、ARC074E)

只支持加入,查值域上前n大的数字和,可以用堆来做,维护个小根堆,每次看要不要换掉堆顶元素,不要一言不合权值线段树。

Hall定理:
二分图的最大匹配数为 N − M a x ( ∣ X ∣ − ∣ N e i g ( X ) ∣ ) N - Max(|X|-|Neig(X)|) NMax(XNeig(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 AB的元素种类。

奇怪的单点到单点的大小限制,应该要快速想到建图连边拓扑序。

常系数线性递推式是可以求通项的,求出来之后呼叫GHJ和卢姥爷写BSGS
贴个知乎链接 https://www.zhihu.com/question/25217301

排序后连续/等差数列,一定会用到 r − l = M a x − m i n r-l=Max-min rl=Maxmin,等差数列的话在左边乘一个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,行列建点,格点为边。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值