<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[cjk_My steps]]></title><description><![CDATA[千里天青染了驿道]]></description><link>https://blog.youkuaiyun.com/cjk_cjk</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; cjk_cjk]]></copyright><item><title><![CDATA[[NOI2014]随机数生成器（模拟+贪心）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46875599</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46875599</guid><author>cjk_cjk</author><pubDate>Tue, 14 Jul 2015 11:42:39 +0800</pubDate><description><![CDATA[【题解】
先一步步按题目的操得出序列 
然后在方阵中找出最小的数(对于初始方阵是1)的位置(x,y)
再在矩阵(1,1)-(x,y),(x,y)-(n,m)中分别找出最小数的位置 

递归是没必要的，也不容易找出每个子矩阵内最小的数 
可以反过来考虑：
1,2,3……能不能依次使用？
1肯定可以，2的话，必须在1划分出的子矩阵(1,1)-(x,y)或(x,y)-(n,m)中才行 ]]></description><category></category></item><item><title><![CDATA[[NOI2014]动物园（kmp+递推）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46869177</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46869177</guid><author>cjk_cjk</author><pubDate>Mon, 13 Jul 2015 22:59:02 +0800</pubDate><description><![CDATA[【题解】
这里首先定义失配指针f[i]满足：第i个位置的字符与第f[i]位相同，字符数组从1开始 
如：aba f[1]=0,f[2]=0,f[3]=1 
要求出num[i]，只需延f指针上溯，找到所有长度不超过i/2的位置，它的数目即为num[i]
可以考虑fail树的思想，用cnt[i]记录从i延失配指针上溯，能遇到的结点数目 
找出最大的长度不超过i/2的位置j，则num[i]=c]]></description><category></category></item><item><title><![CDATA[[NOI2014]魔法森林（动态加边+SPFA）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46855453</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46855453</guid><author>cjk_cjk</author><pubDate>Mon, 13 Jul 2015 00:45:55 +0800</pubDate><description><![CDATA[【题解】
求两个变量构成的最优值，可以考虑限制一个变量，最优化另一个 
观察此题，可以得到这样一个思路：
假设已知答案中的Ai的最大值不超过x，只需最小化1到n路径上的Bi的最大值 
不难想到二分这个Ai的上限x
更新方式为SPFA，即，设d[i]为：只考虑Ai
然而这样的话，对于每个x，d数组都要重新求 
不如我们按Ai从小到大加边，随着加边来更新 BiMax 的最小值，这样d[i]]></description><category></category></item><item><title><![CDATA[[NOI2014]起床困难综合症（二进制拆分+贪心）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46855289</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46855289</guid><author>cjk_cjk</author><pubDate>Mon, 13 Jul 2015 00:20:27 +0800</pubDate><description><![CDATA[【题解】
还是老思路：二进制位运算的题，我们单独考虑每一位，最后合并答案 
这道题中：在0~m中选一个数"丢"到那一堆运算里，相当于判断从每一位"丢"下去0或1后，得出结果的高位尽量是1的方案 
为了方便，我们直接丢两个数：0000000……000与1111111……111，就可以O(2*n)求出每一位"丢"0或是"丢"1能得到的方案了，并不需要每一位"丢"两次 
然后从高位到低位贪心地判]]></description><category></category></item><item><title><![CDATA[[NOI2004]郁闷的出纳员（Treap）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46834479</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46834479</guid><author>cjk_cjk</author><pubDate>Fri, 10 Jul 2015 19:55:59 +0800</pubDate><description><![CDATA[【题解】
Treap水过
注意：对于null结点，不能进行 o->s = o->ch[0]->s + 1 + o->ch[1]->s 操作，一定要考虑此问题


【代码】
#include
#include
int ans=0;
struct Node
{
	Node* ch[2];
	int v,r,s;
	int cmp_v(int x) const
	{
		if(x==v) r]]></description><category></category></item><item><title><![CDATA[[NOI2009]植物大战僵尸（最大流）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46760025</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46760025</guid><author>cjk_cjk</author><pubDate>Sun, 05 Jul 2015 08:08:16 +0800</pubDate><description><![CDATA[我冒着明天困屎= = 的危险写了这道题和题解


【题解】
最大权闭合子图模型，注意同一排里面的植物可以保护外面的
若A能保护B，就连边 A->B，容量无穷大，将s与所有正权点相连，所有负权点与t相连，容量都为点权的绝对值
还要注意若A,B互相保护，即图上有环，或环能保护一个点，则它们都不可能取！预处理时把它们都删掉。这个预处理只需记录入度，拓扑排序即可。再注意，千万别把s和t也考虑进]]></description><category></category></item><item><title><![CDATA[BZOJ2763 [JLOI2011]飞行路线（分层图最短路）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46688505</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46688505</guid><author>cjk_cjk</author><pubDate>Mon, 29 Jun 2015 23:09:20 +0800</pubDate><description><![CDATA[【题解】
设 d[i][j]为到达结点i，免费票用掉j张时，花费的最小值 
则 d[i][j]可以更新 d[k][j] (i与k有边相连)，若j
注意总共会产生n*k=10^5种状态，SPFA算法，队列要开大一些，10^7可过，或者循环队列 
还有SPFA会跑的很慢，"Spfa不适和分层图" ──贴吧 



【代码】
#include
#include
#define INF ]]></description><category></category></item><item><title><![CDATA[[NOI2002]银河英雄传说（并查集）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46684409</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46684409</guid><author>cjk_cjk</author><pubDate>Mon, 29 Jun 2015 17:14:41 +0800</pubDate><description><![CDATA[【题解】
建立并查集，并维护每个结点到root的距离、每个连通块中结点的个数sum 
"M i j"即：将father(i)到root的距离改为 sum[father(y)]，将sum[father(y)]增加 sum[father(x)]



【代码】
#include
#include
#include
int fa[30005],dis[30005]={0},sum[3000]]></description><category></category></item><item><title><![CDATA[BZOJ1202 [HNOI2005]狡猾的商人（并查集）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46681371</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46681371</guid><author>cjk_cjk</author><pubDate>Mon, 29 Jun 2015 13:45:47 +0800</pubDate><description><![CDATA[【题解】
给出[l,r]的区间和，相当于s[r]-s[l](前缀和思想)
一旦已经知道了 s[a]-s[b],s[b]-s[c]，再给出一条[a,c]就可以判断"账本的真假"了 

将每条这样的信息(l,r,w)，l,r放入一个集合中，用并查集来维护，并维护cha[l]=s[root]-s[l],cha[r]=s[root]-s[r]
若 l,r已经在同一个集合中，就直接查询cha[l]]]></description><category></category></item><item><title><![CDATA[BZOJ1854 [Scoi2010]游戏（并查集/二分图匹配）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46675525</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46675525</guid><author>cjk_cjk</author><pubDate>Sun, 28 Jun 2015 23:30:49 +0800</pubDate><description><![CDATA[【题解】
将一个装备抽象成一条边，它连接着编号为其属性值的两个结点 
这样，取装备等价于取边; 每个装备只能用一次，等价于在每条边上仅能取一个端点 
因此，连好所有的边，构成一个个连通块，它们产生了这样一条性质：
对于某一连通块，若其为一棵树，则它的所有结点(属性值)中，只有一个不能取。(因为树的边比点少一，每条边上只能取一个点)]]></description><category></category></item><item><title><![CDATA[BZOJ1044 [HAOI2008]木棍分割（二分答案/单调性优化dp+递推优化）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46656529</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46656529</guid><author>cjk_cjk</author><pubDate>Sat, 27 Jun 2015 02:28:46 +0800</pubDate><description><![CDATA[【题解】

f[i][j]:前i个数分j段的最小值
设 f[i][x]:前i个数分j段的最小值
f[i][x]=min{ max(f[j][x-1],s[i]-s[j]) }
二分答案即可
然而我的方法类似于斜率优化：
假设j比k优，讨论j,k的大小关系，可得(只写最后结论)：
1) j&lt;k(前优) f[j][x-1]&lt;f[k][x-1] 且 s[j]+f[k][x-1]&gt;...]]></description><category></category></item><item><title><![CDATA[[APIO2014]序列分割（斜率优化dp）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46644305</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46644305</guid><author>cjk_cjk</author><pubDate>Fri, 26 Jun 2015 03:22:50 +0800</pubDate><description><![CDATA[【题解】
一个重要的结论：
对于同一组分割方式，总得分与分割的先后顺序无关
不妨考虑最先分成的3部分，设区间和分别为Sa,Sb,Sc
可以证明，先分割a,b还是b,c，最终得分都是ab+bc+ca，即最先分成的3部分无需考虑顺序，子问题也是一样
于是，从前往后切割即可


设f[x][i]为前i个数分x份的最大得分，显然1
dp方程：f[x][i]=max{ f[x-1][j] ]]></description><category></category></item><item><title><![CDATA[BZOJ1875 [SDOI2009]HH去散步（矩阵乘法）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46644299</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46644299</guid><author>cjk_cjk</author><pubDate>Fri, 26 Jun 2015 03:06:05 +0800</pubDate><description><![CDATA[【题解】
小规模图的连通性问题，可以用邻接矩阵+快速幂求解 
本题唯一特殊的一点就是：
不能沿着刚刚走来的路走回，注意：不是不能走重边，而是不能反向走刚刚走过的边 

处理方法是将无向边拆成两条有向边，互换点与边的地位，即：将两条有向边按是否首尾相接建立邻接矩阵 
所有边Ei:u->v与Ej:v->w(w!=u)，都有 Y[i][j]=1
此时Y[i][j]=1的意义是：从边i的末端]]></description><category></category></item><item><title><![CDATA[BZOJ3233 [Ahoi2013]找硬币（线性筛+dp）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46644235</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46644235</guid><author>cjk_cjk</author><pubDate>Fri, 26 Jun 2015 03:04:29 +0800</pubDate><description><![CDATA[【题解】
本蒻一直在想二维dp，看了题解才发现竟然一维就可以 
设f[i]为最大面值为i时，买下所有兔纸花费的最小硬币数 
f[i] = min{ f[j] - sigma(a[k]/i*(i/j-1)) } , j|i，其中，j为次大面值，这个方程考虑的是选了i能减小多少j的使用

注意，如果硬币种类很多，是不影响最优答案的(不用就行了)  ----------->  重要的性质
所]]></description><category></category></item><item><title><![CDATA[BZOJ2038 [2009国家集训队]小Z的袜子（分块法）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46630529</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46630529</guid><author>cjk_cjk</author><pubDate>Thu, 25 Jun 2015 01:50:53 +0800</pubDate><description><![CDATA[【题解】
本题中，每个区间的答案不能由子问题合并得到，所以不能使用分治一类的数据结构如线段树等 
而 ans = sigma( cnt[color[i]]*(cnt[color[i]]-1)/2 )，构成答案的颜色不止一种，所以要将不同颜色分开算答案 
但 n

我这个蒟蒻只能写分块法。
分块的对象：由于区间的答案不能由子问题合并得到，所以对序列分块无效，考虑对询问分块 

考虑将]]></description><category></category></item><item><title><![CDATA[BZOJ1030 [JSOI2007]文本生成器（AC自动机+dp）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46625079</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46625079</guid><author>cjk_cjk</author><pubDate>Wed, 24 Jun 2015 18:09:24 +0800</pubDate><description><![CDATA[【题解】
与poj2778有类似之处，只不过本题模板串太长，无法用到矩阵，而文本较短，适于dp


ans = 26^m - 不含任意单词的文本数 

不含任意单词的文本数 的求法：
转化成从有向图的一点出发，走n步到达另一结点的方案数 
本题为 从字典树的root出发，走m步到达任一结点，且不构成单词 的方案数，需使建立的所有有向边合法(无法走出单词)
将单词建成AC自动机，每]]></description><category></category></item><item><title><![CDATA[poj2778 DNA Sequence（AC自动机+矩阵快速幂 ）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46620601</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46620601</guid><author>cjk_cjk</author><pubDate>Wed, 24 Jun 2015 12:44:53 +0800</pubDate><description><![CDATA[大神附图的题解：http://blog.youkuaiyun.com/morgan_xww/article/details/7834801
【题解】
将所有病毒串建立成字典树，并标记词尾结点，以下称"非法结点"

那么，我们希望改造一下这棵树，即删掉一些结点，构造一些有向边，使得一个n位字符串相当于从改造图的根走n步，且中途不会形成非法串 
对于树上的某个结点u，先允许它走到非法结点，将所有有向边都]]></description><category></category></item><item><title><![CDATA[BZOJ3172 [Tjoi2013]单词（AC自动机+打标记）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46611107</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46611107</guid><author>cjk_cjk</author><pubDate>Tue, 23 Jun 2015 22:29:45 +0800</pubDate><description><![CDATA[刚开始把题意理解错了囧
题意：给定n个字符串，求每个字符串在其他字符串中出现的次数之和 


【题解】
首先肯定要建立AC自动机 

暴力算法：
以每个词为文本串做匹配，每匹配上一个位置，就从该节点延fail或last数组上溯，给经过的的词尾结点加上1次出现次数 

优化：
由上述算法可知，每个文本串(即每个单词)在AC自动机上的每个结点，都可以使 其延fail数组能走到的单]]></description><category></category></item><item><title><![CDATA[BZOJ1014 [JSOI2008]火星人prefix（Splay+字符串Hash）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46595819</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46595819</guid><author>cjk_cjk</author><pubDate>Mon, 22 Jun 2015 21:03:57 +0800</pubDate><description><![CDATA[【题解】
动态的LCP问题 

用 Splay 处理动态区间：

插入操作"I x d"的实现：
首先将x旋转至树根，则d应插在x的右字树中
找到 x的右子树的最左端结点(即原来的s[x+1]在树中的对应结点)，将d添加为它的左孩子 

用 字符串Hash 判断字符串是否相等：

o->H表示由o及其左右子树所对应字母构成的字符串的Hash值，
则 o->H = o->ch]]></description><category></category></item><item><title><![CDATA[BZOJ3506 [Cqoi2014]排序机械臂（离散化+Splay）]]></title><link>https://blog.youkuaiyun.com/cjk_cjk/article/details/46594153</link><guid>https://blog.youkuaiyun.com/cjk_cjk/article/details/46594153</guid><author>cjk_cjk</author><pubDate>Mon, 22 Jun 2015 16:37:31 +0800</pubDate><description><![CDATA[【题解】
题目大意：
给定一个n元素数列，n次操作，第i次要求输出第i小的数的当前位置t，再将区间[i,t]翻转 

模板题，记录伸展树中 以每个结点为根的子树的最小值，通过它在logN时间内找到最小值的位置，
然后提取出序列并打上翻转标记，
每次操作结束，将最左边的元素分裂出去，这样每次操作都是找最小值 

本题有重复元素，有些麻烦，但题目只让给出位置，可以先离散化去重再处理]]></description><category></category></item></channel></rss>