<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Winterfell30' Blog]]></title><description><![CDATA[太弱了。。。]]></description><link>https://blog.youkuaiyun.com/Dreamon3</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Dreamon3]]></copyright><item><title><![CDATA[HDU 5787 K-wolf Number]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/52996369</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/52996369</guid><author>Dreamon3</author><pubDate>Tue, 01 Nov 2016 15:27:23 +0800</pubDate><description><![CDATA[题意求区间[l,r]中有多少个数不存在连续k位含有相同的数位。思路比较裸的数位DP，但是因为刚开始没有想好思路就开始写后来调试挺长的时间。 
因为K比较小，所以我们直接加4维状态分别表示前面取的四个数，每次加下一个的时候根据K判断一下就好了。有些不好处理的地方是010这种有前导零的，那么前导零我们统一用11这个数位取不到的数来表示就可以了。代码#include <stdio.h>
#include]]></description><category></category></item><item><title><![CDATA[HDU 5781 ATM Mechine]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/52996214</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/52996214</guid><author>Dreamon3</author><pubDate>Tue, 01 Nov 2016 15:17:03 +0800</pubDate><description><![CDATA[题意取款机里面有0-K不确定的钱数，如果查询的钱数超过余额就会警告一次，否则不警告，求警告W次内猜到确定钱数的期望是多少。思路dp[i][j]表示还剩0~i的钱数时还可以被警告j次的期望。 
那么得到 
dp[i][j]=dp[k−1][j−1]∗ki+1+dp[i−k][j]∗i+1−ki+1+1dp[i][j] = dp[k-1][j-1] * \frac{k}{i+1}+dp[i-k][j]]]></description><category></category></item><item><title><![CDATA[HDOJ 5763 Another Meaning]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/52929723</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/52929723</guid><author>Dreamon3</author><pubDate>Wed, 26 Oct 2016 00:30:49 +0800</pubDate><description><![CDATA[题意给两个字符串a和b，b有两义性，求a一共有多少种可能的意思。思路首先KMP预处理出所有b是a子串的末尾位置，然后基础dp就可以了。 
如果i位置是子串末尾则dp[i] = dp[i-1] + dp[i-lenb] + 1否则直接转移。代码#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>]]></description><category></category></item><item><title><![CDATA[HDOJ 5769 Substring]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/52927693</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/52927693</guid><author>Dreamon3</author><pubDate>Tue, 25 Oct 2016 21:52:06 +0800</pubDate><description><![CDATA[题意求一个字符串有多少个不同的子串，要求这些子串都包含至少一次x字符。思路如果不考虑包含x字符的话，求不同子串个数是一个后缀数组经典问题（spoj 694）。考虑那个问题的做法：∑leni=1len−sa[i]−lcp[i]\sum_{i=1}^{len}{ len - sa[i] - lcp[i]}，len-sa[i]就是sa[i]开头的串的个数，再减去sa[i-1]时减过的lcp[i]，累加起来]]></description><category></category></item><item><title><![CDATA[HDOJ 5754 Life Winner Bo]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/52910652</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/52910652</guid><author>Dreamon3</author><pubDate>Mon, 24 Oct 2016 12:52:42 +0800</pubDate><description><![CDATA[题意在1,1处的国际象棋，两个人依次移动，走到n,m。 
求King，Queen，knight，castle走法的时候谁会赢或者平局。思路国王就判断一下要走步数的奇偶性就可以了，都为偶数的时候G会胜利。 
车走的时候相当于两堆石子每次取任意个，也就是说直接的nim，两个步数异或起来就可以了。或者考虑对称性也能得到。 
女王走的时候因为多加了斜着走，就相当于两堆石子中多加入了同时取相同个数石子的操作就]]></description><category></category></item><item><title><![CDATA[HDOJ 5745 La Vie en rose (bitset优化DP)]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/52904871</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/52904871</guid><author>Dreamon3</author><pubDate>Sun, 23 Oct 2016 21:53:29 +0800</pubDate><description><![CDATA[题意字符串s和p，p可以交换相邻两个字符的位置但是只能交换一次。求每个s[i]到s[i+len(p)-1]是否能由p变化得到。思路dp[i][j][0/1/2]分别表示在s的i位置和p的j位置时p[j]与p[j-1]交换、不交换、与p[j+1]交换时是否能变换得到。 
因为dp是一个bool数组所以我们可以用bitset表示第一维也就是母串的匹配情况，第二维滚动一下。对于s[i]和p[j]的匹配情况]]></description><category></category></item><item><title><![CDATA[HDOJ 5738 Eureka]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/52904782</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/52904782</guid><author>Dreamon3</author><pubDate>Sun, 23 Oct 2016 21:38:27 +0800</pubDate><description><![CDATA[题意给出一些点，求有多少个集合满足在所有其他点都在其中两个点中间。思路首先题目给的那个式子化简之后就变成了求点共线的组合数的问题。 
首先想到通过斜率统计然后否定了因为精度不行然后考虑把斜率表示成向量的形式，但是向量会有平行的情况也不好处理。然后用了这种固定一个点来求贡献的做法，不需要考虑平行也不需要考虑精度，唯一需要考虑的就是重点的问题了。单独考虑重点的时候集合就是2num−1−12^{num-1]]></description><category></category></item><item><title><![CDATA[HDOJ 5724 Chess (SG)]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/52904648</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/52904648</guid><author>Dreamon3</author><pubDate>Sun, 23 Oct 2016 21:21:04 +0800</pubDate><description><![CDATA[题意有n排列数为20的格子，有些行的有些格子放有棋子，每次可以把一个棋子向右移动一个格子，也可以从别的棋子上面跳过去，不能走的人即为输，判断这个人输赢。思路加深了一下对求SG表的记忆，其实就是类似DP的考虑当前状态可以通过一步变成什么子问题的状态，然后就求子问题中不存在的mex就行了。 
这个题在算某个行的状态的时候把每一行状压一下然后枚举下一步的子问题就可以了。代码#include <stdio.]]></description><category></category></item><item><title><![CDATA[Codeforces Gym 100513]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/52892064</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/52892064</guid><author>Dreamon3</author><pubDate>Sat, 22 Oct 2016 14:19:29 +0800</pubDate><description><![CDATA[前面这些题都是一些模拟贪心= =描述还都很长。。。100513I - Sale in GameStore可以买任意一个游戏，然后可以选任意个加起来价值小于这个游戏的求最多能有几个。#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace]]></description><category></category></item><item><title><![CDATA[POJ 1743 Musical Theme (二分后缀数组LCP)]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/52875418</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/52875418</guid><author>Dreamon3</author><pubDate>Thu, 20 Oct 2016 18:09:56 +0800</pubDate><description><![CDATA[题意给出一段长度小于2e4的序列，如果有两个不重叠子段的一一相邻两个数之间变化情况相同就可以说这两段的是相同的theme。小于5视为0。思路首先我们先对序列进行处理，a[i] = a[i+1] - a[i]，新序列即为变化情况的数列，问题转化成找到新序列的最长不重叠子段。 
二分答案x然后可以利用lcp数组的性质找到所有符合条件的最左起点和最右起点，判断和x的大小关系即可。代码#include <s]]></description><category></category></item><item><title><![CDATA[HDOJ 3537 Daizhenyang's Coin]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/52109255</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/52109255</guid><author>Dreamon3</author><pubDate>Thu, 04 Aug 2016 01:03:12 +0800</pubDate><description><![CDATA[题意给出一些正面朝上的硬币的位置，每次可以将一个或者两个或者三个硬币翻面。最右边一个硬币必须是正面的，最后不能操作的人输。思路SG打出表，然后能发现SG(n)是有规律的，当2n的二进制位的1的个数是奇数时SG(n)=2*n，否则是2*n+1。 
这个规律的证明网上有很多不再赘述，附上SG打表代码。代码#include <stdio.h>
#include <string.h>
#include <i]]></description><category></category></item><item><title><![CDATA[HDOJ 5807 Keep In Touch]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/52087447</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/52087447</guid><author>Dreamon3</author><pubDate>Mon, 01 Aug 2016 17:17:00 +0800</pubDate><description><![CDATA[A - Maximum Increase求最长连续子串长度int a[maxn];int main()
{
    //freopen("H:\\in.txt","r",stdin);
    //freopen("H:\\out.txt","w",stdout);
    int n;
    scanf("%d", &n);
    int ans = 0, mmax = 0, now = 1;]]></description><category></category></item><item><title><![CDATA[Codeforces 689D Friends and Subsequences (RMQ+二分)]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/51926944</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/51926944</guid><author>Dreamon3</author><pubDate>Sat, 16 Jul 2016 22:52:56 +0800</pubDate><description><![CDATA[题意求有多少对区间满足其中一个区间的最大值等于另一个区间的最小值。思路首先RMQ预处理出所有区间的最大值和最小值（线段树会超时。。。） 
然后因为我们固定这两个区间的左端点枚举区间的右端点，因为右端点越大max越大min越小，所以是满足二分的单调性的。 
所以这题的做法就是枚举左端点，二分右端点的max == min的左边界l和右边界r,即[i,l]到[i,r]的区间都是满足max等于min的，统计]]></description><category></category></item><item><title><![CDATA[HDOJ 3938 Portal (离线并查集)]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/51872048</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/51872048</guid><author>Dreamon3</author><pubDate>Sun, 10 Jul 2016 16:23:08 +0800</pubDate><description><![CDATA[题意给出一个带边权的图，令两个点之间的路径的费用为中途经过的边的最大值，对每个查询求有多少对点路径费用小于等于给定的L。思路用类似kruskal的思想，每个点都设置一个sum数组表示它所相连的所有满足小于当前L的边相连的点有多少个(其实数组名用size更合适)。 
然后对于每次查询L，因为边我们也是升序排序的，所以对于所有小于L的边都有sum[find(edge[i].u)]*sum[find(ed]]></description><category></category></item><item><title><![CDATA[HDOJ 1811 Rank of Tetris (并查集+topo)]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/51871995</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/51871995</guid><author>Dreamon3</author><pubDate>Sun, 10 Jul 2016 16:12:43 +0800</pubDate><description><![CDATA[题意给出一些人之间的rating高低或等于关系，判断给出的关系是否冲突，能不能通过这些排出所有人。思路如果没有等于的话这个题是个比较经典的拓扑排序，加上等于之后我们每次相等的两边的关系需要合并，所以用并查集专门维护一下相等时的关系集合，其他的拓扑排序来做即可。代码#include <stdio.h>
#include <string.h>
#include <iostream>
#include <]]></description><category></category></item><item><title><![CDATA[Codeforces Round #360 (Div. 2)]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/51802357</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/51802357</guid><author>Dreamon3</author><pubDate>Fri, 01 Jul 2016 16:13:22 +0800</pubDate><description><![CDATA[A按照题意暴力找一下char s[110];int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int n, d;
    scanf("%d%d", &n, &d);
    int last = -1, ans = 0;
    for (int i = 0; i < d]]></description><category></category></item><item><title><![CDATA[POJ1717 Dominoes (背包)]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/51790825</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/51790825</guid><author>Dreamon3</author><pubDate>Thu, 30 Jun 2016 15:36:23 +0800</pubDate><description><![CDATA[题意每个牌子由上部分和下部分构成，可以180度翻转，求令上部分和下部分的差值最小时的翻转次数。思路dp[i][j]表示当前为第i个格子，上面的和减去下面的差为j时最少翻转个数。因为有正有负所以加个maxn，然后因为数组再滚动一下就可以了。 
刚开始WA了后来把内层循环直接改成6000到-6000就过了，还有一个可能RE的地方是sum的上下的和，最大是12000不是6000。代码#include <s]]></description><category></category></item><item><title><![CDATA[Codeforces 686 D Kay and Snowflake (树重心)]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/51772200</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/51772200</guid><author>Dreamon3</author><pubDate>Mon, 27 Jun 2016 23:17:06 +0800</pubDate><description><![CDATA[题意给出n个节点的树和q个查询(范围均为3e5)，对每个查询输出x为根节点的子树的重心。思路树的重心有几个很好用的性质，下文参考这里 
1.树中所有点到某个点的距离和中，到重心的距离和是最小的；如果有两个重心，那么他们的距离和一样。 
2.把两个树通过一条边相连得到一个新的树，那么新的树的重心在连接原来两个树的重心的路径上。 
3.把一个树添加或删除一个叶子，那么它的重心最多只移动一条边的距离。]]></description><category></category></item><item><title><![CDATA[Codeforces 571B Minimization (DP)]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/51700021</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/51700021</guid><author>Dreamon3</author><pubDate>Fri, 17 Jun 2016 15:04:03 +0800</pubDate><description><![CDATA[题意有一个n个数的序列，给出一个k，可以通过对序列重排让∑n−ki=1|Ai−Ai+k|\sum_{i=1}^{n-k}|A_{i}-A_{i+k}|最小，求最小值。思路题目相当于分成k组，使得{0,k,2k…},{1,k+1,2k+1…}等这些序列分别的序列更小。 
显然对于每一个链就是排序之后得到的绝对值的和最小，通过列项相消就能得到对于序列i他的结果就maxi−minimax_i-min_i]]></description><category></category></item><item><title><![CDATA[LightOJ 1051 Good or Bad (递推DP)]]></title><link>https://blog.youkuaiyun.com/Dreamon3/article/details/51686273</link><guid>https://blog.youkuaiyun.com/Dreamon3/article/details/51686273</guid><author>Dreamon3</author><pubDate>Thu, 16 Jun 2016 00:02:06 +0800</pubDate><description><![CDATA[题意如果一个字符串含有连续的3个元音或者连续的5个辅音那么他就是bad的，否则他就是good的，字符串中含有’?’，’?’有可能是任何字母，如果因为问号不确定的话就是mix。思路因为数据很小所以刚开始直接考虑模拟，但是问号的处理很麻烦，换成了dp的做法。 
dp的方程还是比较显然的，但是同样是mixed不太好判断。 
dp[0/1][i][j]表示在i前第j个位时元音和辅音的情况，最后判断good即]]></description><category></category></item></channel></rss>