03 2020 档案

摘要:题目问题等同于找从s出发的路径,经过的点为偶数。是否存在这样的路径。 我们可以通过暴力dfs找到一条路径,深度为偶数。但是这里的问题在于,对于环该怎么处理。因为可能沿着环走一圈,可以改变一个点的深度的奇偶。 所以我们对于每一个点,针对奇偶进行判断。 这样的话,最多2 n个点,题目要求大于1e6输出d 阅读全文
posted @ 2020-03-30 19:25 LORDXX 阅读(98) 评论(0) 推荐(0)
摘要:令dp[i][j]表示,s字符串第i个结尾的所有字串,和t字符串[1,2,3,...,j]所有的子序列的匹配数量。 dp[i][j]=dp[i][j 1] dp[i][j]+=(s[i]==s[j])?dp[i 1][j 1]+1:0 阅读全文
posted @ 2020-03-30 17:34 LORDXX 阅读(124) 评论(0) 推荐(0)
摘要:```cpp #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #pragma GCC optimize(2) #define up(i,a,b) for(int i=a;ib 阅读全文
posted @ 2020-03-30 16:49 LORDXX 阅读(145) 评论(0) 推荐(0)
摘要:令dp[i]表示,以第i个点为转折点,i前面全部是大写,后面全部是都是小写的代价,自然等于i前面的小写+i后面的大写。(i自己是大写还是小写无所谓,可以没有代价的归入大写或者小写) 阅读全文
posted @ 2020-03-29 12:51 LORDXX 阅读(147) 评论(0) 推荐(0)
摘要:待修莫队。(用奇偶优化真的能快300ms!) 阅读全文
posted @ 2020-03-29 12:34 LORDXX 阅读(112) 评论(0) 推荐(0)
摘要:莫队。 统计ai[i]的出现次数,每一次先还原贡献,再加上或减去当前的贡献即可。 阅读全文
posted @ 2020-03-29 09:51 LORDXX 阅读(115) 评论(0) 推荐(0)
摘要:动态开点线段树+dp。 题目转换成求$x_i$ include include include include include include include include include include include // include include include pragma GCC 阅读全文
posted @ 2020-03-29 08:54 LORDXX 阅读(61) 评论(0) 推荐(0)
摘要:tarjan找环。我们通过枚举一个点的入边为wolf/village出边为wolf/village ,可以知道,当且仅当,一个环里面有且仅有一个出边为wolf的时候,被指向的那个人为wolf。 一旦能够确定wolf了,那么所有指向wolf的人,如果出边为village,那么这个人也是wolf。反向d 阅读全文
posted @ 2020-03-23 10:57 LORDXX 阅读(167) 评论(0) 推荐(0)
摘要:dp,枚举出所有的方法数目,可以发现,有很多方案数目是可以合并的。 阅读全文
posted @ 2020-03-23 10:44 LORDXX 阅读(161) 评论(0) 推荐(0)
摘要:对边权进行排序。令dp[i]表示以i为结束点的最大上升长度。那么,我们每一次加入一条边,dp[to]=dp[from]+1。其中需要注意,边权相等的时候,需要特殊考虑。 阅读全文
posted @ 2020-03-19 12:11 LORDXX 阅读(146) 评论(0) 推荐(0)
摘要:dp[i][j]表示最后一位是$b_i[i]$,倒数第二位是$b_i[j]$的最长序列长度。那么dp[i][j]=dp[j][k]+1($b_i[i]$==$b_i[i]$)其他情况dp=2。 阅读全文
posted @ 2020-03-19 11:10 LORDXX 阅读(99) 评论(0) 推荐(0)
摘要:令dp[i]表示长度为i,最少费用。 可以发现,当且仅当i为偶数的时候,dp[i]=min{dp[i/2]+y}。当为奇数的时候,dp[i]=min{dp[i+1]+x,dp[i 1]+x}。因为这个更新直接做不好做。我们考虑倍增。因为i从0开始,一开始一定dp[1]=x。所以考虑1\~2区间,2\ 阅读全文
posted @ 2020-03-18 21:33 LORDXX 阅读(81) 评论(0) 推荐(0)
摘要:首先可以发现,若是后手能赢,那么先手取后手的值,一定能赢,所以首先排除后手胜。 对于平局,当且仅当,所有异或值为零,无论怎么取,双方均相等。剩下的便是先手胜利。 阅读全文
posted @ 2020-03-18 21:17 LORDXX 阅读(97) 评论(0) 推荐(0)
摘要:分块+floyd 令dp[i][j][k]表示i到j恰好k条路经的最小权值。那么就有:dp[i][j][k]=min{dp[i][p][k 1]+dp[p][j][1]}我们可以预处理出前100条路径的dp值。然后考虑大范围转移,对dp[i][j][100]做一次floyd转移到200,再做一次转移 阅读全文
posted @ 2020-03-18 21:14 LORDXX 阅读(76) 评论(0) 推荐(0)
摘要:状压dp,先记录偶数状态,然后直接暴力转移即可。 阅读全文
posted @ 2020-03-18 21:05 LORDXX 阅读(81) 评论(0) 推荐(0)
摘要:因为x\^k=y,x^x=0,所以求出异或前缀和,$sum_i$\^k=$sum_j$,则区间i+1到j,异或值=k。所以我们运用莫队进行统计,唯一的问题在于,这次维护的区间l\~r,表示的l+1~r的值,所以莫队维护的区间是左开右闭。 阅读全文
posted @ 2020-03-17 22:47 LORDXX 阅读(93) 评论(0) 推荐(0)
摘要:可以观察到,因为我们答案是通过MEX函数得到,那么假设,当前MEX的值是p,那么这时候一共有1+2+3+4...+p 1个与$c_1$,$c_2$,$c_3$...$c_p 1$相同,一共是p (p 1)/2个数字,那么MEX值一定不超过$\sqrt n$。故暴力能统计答案。 对于有修改的询问,我们 阅读全文
posted @ 2020-03-17 18:05 LORDXX 阅读(105) 评论(0) 推荐(0)
摘要:令dp[u]表示,以u为节点,向下走的路径数目。一次dfs能够做完。再令f[u]表示,以u为节点,向上走需要的代价。 对于u的子节点v,计算v向下走的代价,计算v向上走的代价。 向上走的代价=(u去掉v向下走的代价+f[u]) 所以f[v]=(u去掉v向下走的代价)+f[u] 阅读全文
posted @ 2020-03-17 11:02 LORDXX 阅读(88) 评论(0) 推荐(0)
摘要:bitset优化背包 阅读全文
posted @ 2020-03-17 09:48 LORDXX 阅读(134) 评论(0) 推荐(0)
摘要:曼哈顿最小树。 阅读全文
posted @ 2020-03-16 20:42 LORDXX 阅读(86) 评论(0) 推荐(0)
摘要:令dp[k][j]表示,走k步到j的方法。我们首先预处理,走到第i个位置的时候,可以走到的地方,那么每一次,dp[k+1][a]~dp[k+1][b](a和b是j所能到的左右端点)+=dp[k][j],可以看到这是区间更新,那么我们利用差分数组来更新即可。其中自己也是一个断点。 阅读全文
posted @ 2020-03-16 15:23 LORDXX 阅读(119) 评论(0) 推荐(0)
摘要:A B 因为可以取无限个序列,那么去重后,有多少个数字最长上升序列就是多少。 C 首先,必须有一条边,权值等于0。在不包含这条边的所有路径总,mex=0。 当包含0的时候,考虑1的位置,不包含1的路径,mex=1。 即包含0,又包含1的时候,考虑2的位置。当一个结点的子树,当于等于3的时候,我们考虑 阅读全文
posted @ 2020-03-16 15:14 LORDXX 阅读(109) 评论(0) 推荐(0)
摘要:首先可以发现,数字从高到低,每一个数字只能放在已经放了的数字所在的行和列中。 因此我们可以得出一个dp 令dp[k][i][j]表示已经有i行,j列被覆盖,同时拥有k个数字。 所以每一次转移,只会多出一行,或者一列,或者都没有。 这道题极度卡常。我今天比赛交了13发才过,注意模运算,乘法次序等。 阅读全文
posted @ 2020-03-14 21:29 LORDXX 阅读(92) 评论(0) 推荐(0)
摘要:二维线段树维护区间最值。 阅读全文
posted @ 2020-03-13 21:40 LORDXX 阅读(101) 评论(0) 推荐(0)
摘要:二维线段树维护区间最值。 阅读全文
posted @ 2020-03-13 20:11 LORDXX 阅读(115) 评论(0) 推荐(0)
摘要:E. 令dp[i][status]表示第i位,状态为status的时候,最优解。 对于每一个i的时候,遍历所有status转移,然后判断一下这个时候k能否继续插入。 阅读全文
posted @ 2020-03-10 11:37 LORDXX 阅读(131) 评论(0) 推荐(0)
摘要:动态开点线段树。 首先以机器人的看见距离排序,那么如果遍历到i,那么i前面的机器人,如果i能看见他,反过来他也能看见i。 我们再利用机器人的智商建立权值线段树。每颗线段树中维护+ k范围内能有的机器人数量。 阅读全文
posted @ 2020-03-10 11:00 LORDXX 阅读(100) 评论(0) 推荐(0)
摘要:A水题 B.题意:重组该序列,使得对于任意ai i!=aj j 我们将a数组排序,从大到小。那么a1 =a2 也就有a1 1 a2 2。故从大到小输出即可。 cpp include include include include include include include include inc 阅读全文
posted @ 2020-03-10 10:57 LORDXX 阅读(204) 评论(0) 推荐(0)
摘要:```cpp #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #pragma GCC optimize(2) #define up(i,a,b) for(int i=a;ib;i--) #de 阅读全文
posted @ 2020-03-06 21:32 LORDXX 阅读(143) 评论(0) 推荐(0)
摘要:通过观察可以发现,当以u为根节点的时候,向他的子节点转移x次,此时差值固定,即等差数列。 我们就可以通过树链剖分,给每一条链上,维护线段树,保存等差数列。 最后再通过求前缀和的方式求得。 阅读全文
posted @ 2020-03-06 21:28 LORDXX 阅读(120) 评论(0) 推荐(0)
摘要:分块+暴力。 对于每一块来说。如果更新不是一整块,我们直接暴力重构,如果是一整块更新的话,就给这一个块打上一个标记。 当询问的时候,我们二分答案,对于不是一整块的区间,暴力。 对于是一整块的区间,我们优先判断他和标记的大小。如果标记更大,那么由于这一道题更新的时候,区间只取min,故块中的所有数据不 阅读全文
posted @ 2020-03-06 21:25 LORDXX 阅读(100) 评论(0) 推荐(0)
摘要:令len[x]表示特殊点(即要去的地方)到u的距离。 那么从u出发 走完所有特殊点所需要的代价是 2 [sigma(len[x])] max(len[x]) 令dp[u]表示从小到上,特殊点到u的距离和。我们如果从1出发,sigma(len[x])就可以通过一次dfs求得。我们令sum表示距离和。 阅读全文
posted @ 2020-03-06 16:28 LORDXX 阅读(151) 评论(0) 推荐(0)
摘要:令dp[n][k]表示 长为n的序列 分成k段 所需要的最小代价。 我们暴力转移。 dp[i][t]=min(dp[i'][t 1]+cost[i'+1][i]) (其中i'小于i) 对于这种dp我们首先考虑线段树dp,我们可以找到min(dp[i'][t 1]),但是没有办法统计cost的值。所以 阅读全文
posted @ 2020-03-06 16:15 LORDXX 阅读(154) 评论(0) 推荐(0)