<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[cat_pikapikapi的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/cat_pikapikapi</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; cat_pikapikapi]]></copyright><item><title><![CDATA[nanchang B A Funny Bipartite Graph]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/103494593</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/103494593</guid><author>cat_pikapikapi</author><pubDate>Wed, 11 Dec 2019 16:32:54 +0800</pubDate><description><![CDATA[题意是：给你一个二分图，让你在其中选一些边，边和边两边的点构成一个新图，然后问新图的最小代价？
新图要满足两个条件：右边的点必须全选，左边的点必须满足互斥关系。

原图也满足一些性质，每个点的度小于3，左边的每个点不会向左边编号比它小的点连边。

为什么爆搜能过，为什么爆搜能过，为什么爆搜能过。。。。。。

而且还比我快。

爆搜就是加个剪枝，如果当前的sum比ans大就不继续往下搜了。。。。不会...]]></description><category></category></item><item><title><![CDATA[GYM 102439 Equal Mod Segments]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/103460921</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/103460921</guid><author>cat_pikapikapi</author><pubDate>Mon, 09 Dec 2019 17:17:13 +0800</pubDate><description><![CDATA[题意是，给你一个序列，问有多少区间 [l,r] 满足 a[l]%a[l+1]%a[l+2].....%a[r]==a[r]%a[r-1]%a[r-2]...%a[l]?

我们考虑一个区间 [l,r] 假设区间内最小值在pos处取得，那么区间的合法性可以表示为

a[l]%a[l+1]%a[l+2].....%a[pos]==a[r]%a[r-1]%a[r-2]...%a[pos].因为在mod ...]]></description><category></category></item><item><title><![CDATA[2014-2015 ACM-ICPC Northeastern European Regional Contest (NEERC 14)]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/101426534</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/101426534</guid><author>cat_pikapikapi</author><pubDate>Wed, 04 Dec 2019 16:50:27 +0800</pubDate><description><![CDATA[I - Improvements

题意：给你一个排列，定义序列中相邻的两个数为一个区间，要求最终的序列不能有相交的区间，问最多有几个数可以保留不动？

首先想到了最终序列是个什么样，然后也感觉不会像贪心了。

思路还是不够清奇。。。。

考虑每个数的下标，如果对一个合法序列重排序，那么可以发现他们下标是一个先递增再递减的。

比如 对于原序列 18 7 2 3 6 5 4，按照元素大小对下标重...]]></description><category></category></item><item><title><![CDATA[Banned Patterns 计蒜客 - A1533]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/103389204</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/103389204</guid><author>cat_pikapikapi</author><pubDate>Wed, 04 Dec 2019 16:49:28 +0800</pubDate><description><![CDATA[这个题，感觉特别神奇，感觉复杂度是正确的，但是给不出特别正确的证明。

题意：给你n个匹配串，给你m次询问，然后问询问串里有没有子串是某个匹配串的映射？

最开始就感觉多模式匹配肯定是ac自动机嘛，然后发现映射情况数太多不好处理，就想有没有什么方法能消除字母与字母之间的影响，想了想口胡了一种做法，就是把考虑每个字母上次出现的位置，然后表示成位置差，这样一来每个串就可以o（1）的映射成一个唯一的数字...]]></description><category></category></item><item><title><![CDATA[Arranging Wine]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/103211157</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/103211157</guid><author>cat_pikapikapi</author><pubDate>Sat, 23 Nov 2019 10:25:25 +0800</pubDate><description><![CDATA[大概在很久之后，做了一道差不多的题，才回来把这道题给补了。

题意是给你n瓶红酒，m瓶白酒，然后把白酒和红酒分成很多堆，红白相间排成一行，然后每堆红酒不超过d瓶，问有多少种方案。

题目给的解释特别有迷惑性，其实我们把一堆平着放，就是求所有的酒排列方案（相邻的红酒不能超过d瓶）。

然后考虑先放白酒，那么白酒与白酒之间有m+1个空位，只要把红酒插进去就行。

就是把n个小球放到m个不同的盒子中，每...]]></description><category></category></item><item><title><![CDATA[Tree Factory cf596div1D]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/103164146</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/103164146</guid><author>cat_pikapikapi</author><pubDate>Wed, 20 Nov 2019 15:34:05 +0800</pubDate><description><![CDATA[给以一条链，每次可以把一个点变成它父亲的父亲儿子，问最少多少次可以变成给定的树？

考虑将一颗树变成一条链，那么就是把一个点变成兄弟的儿子。

而考虑最少需要多少步，每一次操作最多让树高加一，那么最少需要n-max(dep)-1次。

那么为了让操作次数达到最少，每次都必须更新最长链。


#include &lt;bits/stdc++.h&gt;

using namespace std;

...]]></description><category></category></item><item><title><![CDATA[The 2019 Asia Nanchang First Round Online Programming Contest C. Hello 2019]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/100665661</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/100665661</guid><author>cat_pikapikapi</author><pubDate>Mon, 09 Sep 2019 16:18:40 +0800</pubDate><description><![CDATA[赛后发现是道原题。。。

比赛时想到了线段树维护dp，然而dp没有写好。。。

考虑如果只对原序列询问一次，那么可以o（n）的dp去做，dp[i][j]表示在i个位置达到状态j的最小花费，第二维的状态有｛2｝，｛20｝，｛201｝，｛2019｝。

发现可以分开考虑在每个位置转移的花费，然后用线段树维护。

考虑两个不同区间状态的合并，可以暴力枚举中间转态，k^3的转移。




#includ...]]></description><category></category></item><item><title><![CDATA[Gym - 101190D Delight for a Cat（费用流）]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/100024632</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/100024632</guid><author>cat_pikapikapi</author><pubDate>Tue, 03 Sep 2019 17:15:50 +0800</pubDate><description><![CDATA[题意：在n个小时中，猫要么在睡觉，要么在吃东西，不能同时进行，但是要求每相邻的k个小时，猫睡觉的时间不能小于ms，吃东西的时间不能小于me，给出每个小时吃东西和睡觉的收益，求最大收益。

想了好久的上下限，但是好像没办法做，也可以是我太菜了。

看题解也想了好久，果然是我太菜了吗。。。。

考虑一开始全在睡觉，那么要求我们找出一些时间点来，使满足限制的条件下，收益最大。

我们用第i个点来表示第i...]]></description><category></category></item><item><title><![CDATA[Solid Dominoes Tilings HDU - 5731 (轮廓线 容斥 )]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/100120359</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/100120359</guid><author>cat_pikapikapi</author><pubDate>Wed, 28 Aug 2019 16:13:52 +0800</pubDate><description><![CDATA[比较好玩的容斥，，，

如果不加限制的话，是一个经典的轮廓线dp。

加上限制之后，考虑利用容斥求出不合法的方案数。

最开始想的时候，想的是求出所有的方案数，减去所有列不合法的方案数，减去所有行不合法但列合法的方案数。。

但是好像过去麻烦，可以考虑再求得时候就保证行合法，这样就只需要减去列不合法的方案数。

只需要容斥一下,枚举所有可能的列状态，减去一列不合法的方案，加上两列不合法方案，，，
...]]></description><category></category></item><item><title><![CDATA[2019牛客多校赛 第九场 I KM and M]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/99996489</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/99996489</guid><author>cat_pikapikapi</author><pubDate>Wed, 21 Aug 2019 20:59:58 +0800</pubDate><description><![CDATA[首先，可以按位考虑，对于第i位有多少个m的倍数满足这一位上为1？

对于一个数x，我们判断这一位上是否为1，参考十进制的做法，即 ;

那么将公式变一下型：

后半部分是一个等差数列整除一个整数的求和式。

很久之前就存过这个板子了，但比赛时还是不会做。。。。


#include &lt;bits/stdc++.h&gt;

using namespace std;
#define ll lon...]]></description><category></category></item><item><title><![CDATA[2019hdu多校六 Ridiculous Netizens（点分治）]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/98849569</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/98849569</guid><author>cat_pikapikapi</author><pubDate>Thu, 08 Aug 2019 10:56:28 +0800</pubDate><description><![CDATA[大概题意是： 给你一颗无根树，每一个结点有点权， 有多少颗子树的结点乘积不超过m？子树的定义是树上的连通块。

首先我们考虑另一个问题，假设给你一颗有根树，所以包含根的子树有多少种满足乘积不超过m？

考虑树形dp的做法，定义dp[i][j]是在i被选取后这颗子树中乘积为j的子树方案数，这样每次将两颗子树合并的复杂度是m*m的。但实际上子树大小限制了状态数不会那么多，所以每次计算一个点的贡献的复...]]></description><category></category></item><item><title><![CDATA[2019牛客1 i]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/97896043</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/97896043</guid><author>cat_pikapikapi</author><pubDate>Fri, 02 Aug 2019 14:25:26 +0800</pubDate><description><![CDATA[大致题意：给你n个点，第i个点在的位置为(xi,yi)，有两个属性值(ai,bi)。现在让你把这n个点划分为A和B两个部分，使得最后不存在i∈A和j∈B，使得xi&gt;=xj且yi&lt;=yj。然后对于所有的划分方法，找到并输出

                               

比较巧妙的dp思路吧。。。。
...]]></description><category></category></item><item><title><![CDATA[DSU on tree CodeForces - 741D]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/97552520</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/97552520</guid><author>cat_pikapikapi</author><pubDate>Fri, 02 Aug 2019 14:20:54 +0800</pubDate><description><![CDATA[dsu on tree

主要还是去学了一下这个东西，大概就是利用的轻重链的性质，把暴力的复杂度优化到了（nlogn）。非常神奇的算法。

题目还是略板的。

题目意思就是问每棵子树上有多少权值异或和为0或者二进制最多1个1的链。


#include &lt;bits/stdc++.h&gt;

using namespace std;
#define N 500005
#define go(...]]></description><category></category></item><item><title><![CDATA[2019牛客第一场h xor]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/97418471</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/97418471</guid><author>cat_pikapikapi</author><pubDate>Fri, 26 Jul 2019 21:09:11 +0800</pubDate><description><![CDATA[应用了线性基的性质。

一个基可以表示向量空间里任意一个数。

所以任意求一组基，计算每一个基之外的数的贡献，就是这个数必选，其他数可选可不选

基之内的数，如果这个基不可被替代，那么贡献为0，否则贡献与基之外的数一样。


​
#include &lt;bits/stdc++.h&gt;

using namespace std;
#define N 300005
#define pii pai...]]></description><category></category></item><item><title><![CDATA[Wavel Sequence HDU - 6078 (dp)]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/95864111</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/95864111</guid><author>cat_pikapikapi</author><pubDate>Sun, 14 Jul 2019 10:48:58 +0800</pubDate><description><![CDATA[这个题，做的时候想了个cdq的做法，但是o（n^2 lognlogn）的，感觉上就会T死。

正解还是很巧妙的。。。

定义dp[i][j],1&lt;=i&lt;=n,0&lt;=j&lt;=1，表示以a[i]为结尾，大于或小于的情况。

枚举第二个数组的元素，对于每个元素，遍历第一个数组，用前缀和统计一个大于和小于的情况，遇到相等遍进行修改。


#include &lt;bits/stdc+...]]></description><category></category></item><item><title><![CDATA[RXD and numbers HDU - 6064（欧拉回路路径数）]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/95726212</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/95726212</guid><author>cat_pikapikapi</author><pubDate>Sat, 13 Jul 2019 09:50:51 +0800</pubDate><description><![CDATA[BEST定理

答案为T1(G)∗∏i=1n(di−1)!T1(G)∗∏i=1n(di−1)!
其中T1(G)=T1(G)=(出度矩阵-邻接矩阵)去掉第一行第一列后行列式的值

这道题固定了起点是1，所以答案要乘上1的出度，可以理解成把一条回路从1点断开。

又因为这道题两个点之间的边被认为是相同的，还需要对答案除以∏mi=1∏mj=1(Di,j!)。


#include &lt;bits/s...]]></description><category></category></item><item><title><![CDATA[HDU-6065 RXD, tree and sequence（dp+LCA）]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/95593809</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/95593809</guid><author>cat_pikapikapi</author><pubDate>Fri, 12 Jul 2019 10:12:39 +0800</pubDate><description><![CDATA[主要利用了LCA 的性质——一个区间的LCA等于区间内相邻点的深度最低的LCA。

所以这个问题就转化成选取k个相邻点的深度 或 单点的深度。


#include &lt;bits/stdc++.h&gt;

using namespace std;
#define N 300005
#define go(i,a,b) for(int i=(a);i&lt;=(b);i++)
#define i...]]></description><category></category></item><item><title><![CDATA[牛客5 G  Glad You Came]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/94597594</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/94597594</guid><author>cat_pikapikapi</author><pubDate>Thu, 04 Jul 2019 10:30:08 +0800</pubDate><description><![CDATA[长度为n的数组，m次操作， 每次操作把一个区间内小于v的数更新成v

m很大，但是据说mlogn能卡过去，也只能说一句随机数据真的蛮快的

正解是rmq的变形？

用倍增的思想把一个区间分成nlogn个区间，这样每一个区间都能分成2个区间。每次更新直接更新他所在的区间。

全部跟新完后按区间从大到小逆向更新一遍。

真是神奇的操作。


#include &lt;bits/stdc++.h&gt;...]]></description><category></category></item><item><title><![CDATA[牛客第一场多校H Longest Path &&斜率dp]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/94210883</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/94210883</guid><author>cat_pikapikapi</author><pubDate>Mon, 01 Jul 2019 10:05:25 +0800</pubDate><description><![CDATA[题意：给你一颗树，每条边有边权，定义每条路径长度为路径上相邻边 权值差的平方和。

树dp加斜率优化


#include &lt;bits/stdc++.h&gt;
using namespace std;
#define N 200005
#define ll long long
#define go(i,a,b) for(int i=(a);i&lt;=(b);i++)
#define de...]]></description><category></category></item><item><title><![CDATA[Coloring Tree]]></title><link>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/92003754</link><guid>https://blog.youkuaiyun.com/cat_pikapikapi/article/details/92003754</guid><author>cat_pikapikapi</author><pubDate>Fri, 14 Jun 2019 20:20:35 +0800</pubDate><description><![CDATA[考虑这样一个推广问题：有一个无向图，给每个点染色，有k种颜色，任意两个距离&lt;=d的点不能相同颜色，问有多少种染色方案
这个问题是不好解决的，但我们可以解决一些特殊的拓扑结构

如果是个链，那显然从左往右计算每个位置可以染多少种颜色然后乘起来就行了
	如果是个树，那就是这个题目了，主要是要类比链的情况寻找一个合适的拓扑序进行计算，找这个拓扑序的关键就是轮到某个点x的时候，已经拓扑过的与x距离&...]]></description><category></category></item></channel></rss>