<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[eeeaaaaa的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/eeeaaaaa</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; eeeaaaaa]]></copyright><item><title><![CDATA[spoj Count on a tree【主席树】]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/46662689</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/46662689</guid><author>eeeaaaaa</author><pubDate>Sat, 27 Jun 2015 17:10:43 +0800</pubDate><description><![CDATA[题意：给一棵树还有一些询问求从u-v这条路径上点的权值的第K大。
我们可以从根开始维护主席树，就相当于以根为起点维护前缀和，这样我们可以求出u-v这条路径上对应点的权值，对u,v求一下lca(最近公共祖先)，然后点的权值就是c[u]+c[v]-2*[lca(u,v)]，然后同样二分找第k大。
#include
#include
#include
#include
using namespace]]></description><category></category></item><item><title><![CDATA[POJ2104 K-th Number【主席树】]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/46662589</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/46662589</guid><author>eeeaaaaa</author><pubDate>Sat, 27 Jun 2015 17:02:06 +0800</pubDate><description><![CDATA[题意：给一段序列，还有一些询问，查询l-r中的第k大的数是什么
主席树求第K大的板子，维护前缀和，然后作差二分找第k大就是
#include
#include
#include
using namespace std;
const int MAXN=100010;
int tot,a[MAXN],n;
int vec[MAXN],idx;
int c[MAXN*30],lson[MAXN*30]]></description><category></category></item><item><title><![CDATA[SPOJ - DQUERY 【主席树】]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/46647473</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/46647473</guid><author>eeeaaaaa</author><pubDate>Fri, 26 Jun 2015 10:50:43 +0800</pubDate><description><![CDATA[题意：给出一段序列，然后有q个询问，要求求出下标l-r的出现数的种数。
在线方法就可以用主席树，这里T[i]是根据i-n的数建立的线段数，每次更新时，如果当前的数在上一个状态没有出现过，可以直接插入，出现一条新链，如果出现过，应该先把这个数擦出，然后在这个擦除的状态上更新，这样查询的时候就只要查询T[l]这个线段数上1-r的和了，[1,l-1]的和应该是0，因为对于T[l]，前面都没有插入到这颗]]></description><category></category></item><item><title><![CDATA[HDU5261 蜀道难【单调队列】]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/46618505</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/46618505</guid><author>eeeaaaaa</author><pubDate>Wed, 24 Jun 2015 10:01:48 +0800</pubDate><description><![CDATA[题意：中文题，他给的半径实际上就是两点之间的距离，然后要求找出两个点的权值加上之间的距离最大。
a数组表示每个点的权值，设两个点分别是i,j，所以答案就是a[i]-i*r+a[j]+j*r,对于一个j应该要找到满足要求最大的a[i]-i*r，所以就用单调队列了，还要注意就是单调队列里相等的话就直接加到队尾，优先取编号小的。
#include
#include
#include
using na]]></description><category></category></item><item><title><![CDATA[HDU5016 Mart Master II【点分治】]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45748471</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45748471</guid><author>eeeaaaaa</author><pubDate>Fri, 15 May 2015 19:05:44 +0800</pubDate><description><![CDATA[题意：给出一棵数，树上有些点有商店，要你建一个商店使你可以得到最多的顾客，顾客选择去离他最近的商店（距离相同去编号小的）。
首先预处理一下所有点离他最近的商店，记录下来编号和距离，用一个pair就好了。first记录距离，second记录编号，排序也刚好符合题意。。预处理感觉和spfa差不多那样弄一下（其他方法我不会。。）。。
然后就是点分治了，找到每一次重心后，求出到这个点的距离，用dis[]]></description><category></category></item><item><title><![CDATA[HDU4871 Shortest-path tree【最短路+点分治】]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45722139</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45722139</guid><author>eeeaaaaa</author><pubDate>Thu, 14 May 2015 15:55:47 +0800</pubDate><description><![CDATA[题意：给出一张图，要求从1点开始跑最短路，并以1为根生产一棵最短路树（长度相同找到字典序最小的），然后求出这个树上恰好经过k个点的最长路径，并输出数量。
从1点跑一遍最短路，然后dfs生产最短路生成树，然后点分治，找到重心之后对重心每条边算一次经过了i个点的最长路，然后还要用数组记录一下前面经过了i个点的最长路。。处理方法在讲点分治的论文上有。
#include
#include
#inclu]]></description><category></category></item><item><title><![CDATA[POJ1987 Distance Statistics【点分治】]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45600425</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45600425</guid><author>eeeaaaaa</author><pubDate>Sat, 09 May 2015 12:35:42 +0800</pubDate><description><![CDATA[题意：给一棵树求之间距离不超过k的点对数量。。
和poj1741一模一样。。。一样的做法。。每次找经过根的点对的数量。。统计数量时，排个序然后头尾开始找数量就好
#include
#include
#include
using namespace std;
const int MAXN=40010;
const int INF=1<<30;
struct EDGE
{
	int v,next;]]></description><category></category></item><item><title><![CDATA[bzoj2152 聪聪可可【点分治】]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45584159</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45584159</guid><author>eeeaaaaa</author><pubDate>Fri, 08 May 2015 19:33:55 +0800</pubDate><description><![CDATA[题意：中文题。。。。。。
按点分治的的方法，每次都求出经过根的可行方案的个数，这里要求是3的倍数，所以我们可以把距离根的距离%3，那么取余后的距离根的距离为1和2的可以组成3，两个0当然也可以，这里用cnt[0],cnt[1],cnt[2]表示0,1,2的个数，对每个1可以有cnt[2]个2与他组成符合条件的路，所以数量就是cnt[1]*cnt[2]，从2跑到1也可以所以还要*2，这个结果就是c]]></description><category></category></item><item><title><![CDATA[POJ1741 Tree]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45503457</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45503457</guid><author>eeeaaaaa</author><pubDate>Tue, 05 May 2015 15:45:21 +0800</pubDate><description><![CDATA[题意：找出一棵树中有多少个点对之间的距离小于等于k。。
论文上的题。
点分治，找到树的重心，然后计算经过这个重心的点对，计算从根到这个子树每个节点的距离，然后找到所有点对过根的距离小于等于k的，然后再减去再同一棵子树里的就行了，然后分治一直递归下去。。
#include
#include
#include
using namespace std;
const int MAXN=10010;
]]></description><category></category></item><item><title><![CDATA[HDU5221 Occupation【树链剖分+线段树】]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45479501</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45479501</guid><author>eeeaaaaa</author><pubDate>Mon, 04 May 2015 13:23:11 +0800</pubDate><description><![CDATA[题意：有三种操作，1代表占领u-v这条路径上的所有点，2表示失去u这个点，3占领以u为根的子树的所有点。。对每一个询问输出他占领城市的权值之和。。
首先树链剖分处理一下，然后用线段树维护区间求和区间查询就好了，查询过的点再置0。。。
处理子树可以根据dfs序来求，可以在树链剖分的时候记录下这个点的dfs序，然后查询子树就可以直接有一个区间了。
1操作没有想到处理一个点的时候错了。。wa了几次]]></description><category></category></item><item><title><![CDATA[HDU2825 Wireless Password【AC自动机】]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45399315</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45399315</guid><author>eeeaaaaa</author><pubDate>Thu, 30 Apr 2015 21:14:41 +0800</pubDate><description><![CDATA[题意：求出题目所给的m个串中至少出现k个串且长度为n的字符串的个数。。
AC自动机+状压DP。。。感觉不懂状压DP还是弄懂状压DP比较好
AC自动机的核心其实就是状态转移。。
dp[i][j][k]，i表示目前的长度，j表示AC自动机的状态（转移到了哪个节点），k表示已经出现了哪几个串的状态。。AC自动机在转移的时候要根据fail指针适当的合并状态，因为转移到了这个节点，这个节点的fail也]]></description><category></category></item><item><title><![CDATA[HDU4691 Front compression【后缀数组】]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45336553</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45336553</guid><author>eeeaaaaa</author><pubDate>Tue, 28 Apr 2015 15:24:08 +0800</pubDate><description><![CDATA[题意：先给出一个串，然后下面给一个n表示输入串的个数，然后每行两个数表示输入的串的起点和重点（左闭右开）。。问的是 不压缩和压缩之后的大小。。
每个字符占1大小，空格和回车也占1.。
很基本的后缀数组，求lcp，因为不会写RMQ。。。所以直接写线段树了。。每次求一下这个串与上一个串的lcp。。然后处理就好了
#include
#include
#include
#define ls (k<<]]></description><category></category></item><item><title><![CDATA[HDU5212 Code]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45308675</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45308675</guid><author>eeeaaaaa</author><pubDate>Mon, 27 Apr 2015 12:43:38 +0800</pubDate><description><![CDATA[题意：输出那个程序的结果
这题其实就是求任意一个数与每一个数的gcd×（gcd-1）,然后全部加起来。。
把每个数值对应的个数记下来，然后从最大的数开始，找这个数的倍数，如果gcd是x那个构成这个gcd的两个数一定都是x的倍数，如果有k个数是x的倍数，那么这k个数任意组合就可以形成k*k中情况，这写数中也有可能存在gcd是2×想，3×x的，所以要减去形成gcd是2*x,3*x的情况，从大到小就]]></description><category></category></item><item><title><![CDATA[ural1297 Palindrome【后缀数组】]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45269133</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/45269133</guid><author>eeeaaaaa</author><pubDate>Sat, 25 Apr 2015 12:06:35 +0800</pubDate><description><![CDATA[题意：给出一个串，求出这个串的最长回文字串。
用后缀数组解决，把这个串反向并接在原串后面，中间加一个没有出现过的字符。然后枚举回文字串的中心（这里要按串的长度分成奇数长度和偶数长度），求这个枚举的位置和在反向接上去的那个位置，这两个位置之间的最长公共前缀就可以了。。求公共前缀用个线段树维护就好了
#include
#include
#include
#define ls (k<<1)
#def]]></description><category></category></item><item><title><![CDATA[SPOJ Query on a tree]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/44496019</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/44496019</guid><author>eeeaaaaa</author><pubDate>Fri, 20 Mar 2015 19:14:24 +0800</pubDate><description><![CDATA[题意：给出一个n个节点的树，边的标号分别是1-n-1，然后有两种操作，CHANGE 将第i条边的权值改成ti，QUERY 查询a点到b点中的边的最大权值。。
QTREE系列的第一题，第一次写树链剖分，树链剖分之后用线段树解决，中途出现了RE和WA，找了几天才解决，都在代码中注释了。。
#include
#include
#include
#include
#define ls (k<<1)
#]]></description><category></category></item><item><title><![CDATA[HDU3943 K-th Nya Number（数位DP）]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/43150825</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/43150825</guid><author>eeeaaaaa</author><pubDate>Mon, 26 Jan 2015 12:20:58 +0800</pubDate><description><![CDATA[题意：给出l,r和x,y，要求找出l道r之间含有x个4，y个7的第k大的数。
数位DP，先预处理一下，处理处当前是i位数，含有x个4，y个7的数的个数，然后从高位到低位枚举数字就可以了。
然后二分查找。。代码有注释
#include
#include
#include
using namespace std;
typedef long long ll;
ll dp[21][21][21];
]]></description><category></category></item><item><title><![CDATA[bzoj2038 [2009国家集训队]小Z的袜子(hose) (分块)]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/42029323</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/42029323</guid><author>eeeaaaaa</author><pubDate>Fri, 19 Dec 2014 16:29:13 +0800</pubDate><description><![CDATA[题意：中文题。。。
用分块写的，每次增加一个数x，能形成的种数，ans就增加2*cnt[x],然后再cnt[x]++，每减少一个数，cnt[x]--，ans减少2*cnt[x]。。。就是这样搞了。。
#include
#include
#include
#include
using namespace std;
const int MAXN=50010;
int vec[MAXN],idx;
]]></description><category></category></item><item><title><![CDATA[bzoj1588 [HNOI2002]营业额统计 (Splay)]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/41923707</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/41923707</guid><author>eeeaaaaa</author><pubDate>Sun, 14 Dec 2014 10:54:10 +0800</pubDate><description><![CDATA[题意：中文题。。不多说。
这题就是裸的Splay模板。。。但是出了一个问题。。导致我WA了12次（最后随机数对拍才找到）。。。
没插入一个点，把这个点旋转到根，然后找到根的左子树最靠右边的的，根的右子树最靠左边的点，然后相减处理下就好。。。
这里我是WA在，每把一个点旋转到根，忘记把表示根节点的那个点修改成根了。。。然后还RE了几发，原因是我写的是多组数据（测试是单组数据），然后我需要初始化]]></description><category></category></item><item><title><![CDATA[HDU3487 Play with Chain (Splay)]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/41898613</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/41898613</guid><author>eeeaaaaa</author><pubDate>Fri, 12 Dec 2014 20:35:14 +0800</pubDate><description><![CDATA[题意：给两种操作，一种是切下[a,b]这一段加到c这个位置之后，还有一个翻转[a,b]这个位置，操作过后输出序列。
Splay。。。。虽然理论比较简单，但本渣还是写了一下午+调了3个小时。。。
对于两种操作，切下来的时候就是先把a-1旋转到根，然后把b+1旋转到a-1那个节点的右边，然后b+1这个节点的左子树就是[a,b]的序列了，插入把c旋转到根，c+1旋转到根的右边，然后直接插入到c+1的]]></description><category></category></item><item><title><![CDATA[POJ3481 Double Queue (Splay)]]></title><link>https://blog.youkuaiyun.com/eeeaaaaa/article/details/41824719</link><guid>https://blog.youkuaiyun.com/eeeaaaaa/article/details/41824719</guid><author>eeeaaaaa</author><pubDate>Tue, 09 Dec 2014 15:45:42 +0800</pubDate><description><![CDATA[题意：给出三种操作，1表示加入一个值和一个优先级，2表示找到最大优先级的数的值并输出，然后去掉这个数，3表示找到最小优先级的值并输出然后去掉。。。
Splay的模板，写的时候除了一点问题，这里涉及到了插入和删除操作，插入按平衡二叉树的操作就差不多了，删除的时候先把要删除的移动到根节点，然后找第一个比根节点优先级小的数（如果没有直接删掉这个节点，把根节点右移下就好），然后把那个数旋转到根节点的左节]]></description><category></category></item></channel></rss>