<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Since_natural_ran]]></title><description><![CDATA[Have a pure heart to overcome everything .]]></description><link>https://blog.youkuaiyun.com/Since_natural_ran</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Since_natural_ran]]></copyright><item><title><![CDATA[算法学习kruskal]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/81048024</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/81048024</guid><author>Since_natural_ran</author><pubDate>Sat, 14 Jul 2018 22:02:22 +0800</pubDate><description><![CDATA[Codeforces Round #446 (Div. 1)

题意

​   有n个节点m条边的无向图图G，可以保证连通性。现在有q个询问，每个询问有k个边，判断是都在同一个最小生成树中，若存在则输出YES否则输出NO。

样例            



输入：
5 7
1 2 2
1 3 2
2 3 1
2 4 1
3 4 1
3 5 2
4 5 2
4
2 3 4
3 3 4 5
2 1...]]></description><category></category></item><item><title><![CDATA[回文串算法Manacher]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78906189</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78906189</guid><author>Since_natural_ran</author><pubDate>Tue, 26 Dec 2017 20:31:46 +0800</pubDate><description><![CDATA[回文串算法Manacher首先用一个非常巧妙的方式，将所有可能的奇数/偶数长度的回文子串都转换成了奇数长度：在每个字符的两边都插入一个特殊的符号。比如 abba 变成 #a#b#b#a#， aba变成 #a#b#a#。 为了进一步减少编码的复杂度，可以在字符串的开始加入另一个特殊字符，这样就不用特殊处理越界问题，比如#a#b#a#。  下面以字符串12212321为例，经过上一步，变成了 S[] =]]></description><category></category></item><item><title><![CDATA[HDU 5371]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78906185</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78906185</guid><author>Since_natural_ran</author><pubDate>Tue, 26 Dec 2017 20:31:00 +0800</pubDate><description><![CDATA[HDU 5371题意：​   长度为n 的数列，现在有一种对称形式为aba (其中b与a对称)，输出满足题意的最长的数列长度。思路：​   用Manacher求出辅助数组Mp，然后重点来了。​   若想求出上面的形式，不妨枚举b的起点，那么直接判断第二个a是否满足即可，还是利用到Mp的性质。#include <iostream>
#include <cstdio>
#include <cstring]]></description><category></category></item><item><title><![CDATA[POJ1849]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78887375</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78887375</guid><author>Since_natural_ran</author><pubDate>Sun, 24 Dec 2017 21:08:57 +0800</pubDate><description><![CDATA[POJ1849题意：​    有一颗n个结点的带权的无向树, 在s结点放两个机器人, 这两个机器人会把树的每条边都走一遍, 但是最后机器人不要求回到出发点. 问你两个机器人走的路总长之和的最小值是多少?思路：1. 假设只有1个机器人遍历树,且要求回到原点, 它最少需要走多少路?
​       答: 它需要走树总长sum的两倍, 即每条树边它都要走两次才行. 这个结论画个图就明白了, 对于每条边,]]></description><category></category></item><item><title><![CDATA[Gym - 101522B树的直径]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78880964</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78880964</guid><author>Since_natural_ran</author><pubDate>Sat, 23 Dec 2017 17:04:47 +0800</pubDate><description><![CDATA[Gym - 101522B题意：​   给出一棵树，然后按照所给出的方式建立新的边，然后可以一层层的建边直到无边可建。问需要多少个小时，每一个小时可以建立一条边，可以多线程建立。思路：​   画图可以找到规律，最坏的情况是n个点是一个线性的，那么时间将是最长，根据线性找规律发现其长度与时间是以2倍递增的，每一个新的小时便可以在原来的基础上画2倍的线，所以找出最长边然后判断2的ans次方即可。#inc]]></description><category></category></item><item><title><![CDATA[Hiho 1044 状态压缩dp]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78826700</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78826700</guid><author>Since_natural_ran</author><pubDate>Sun, 17 Dec 2017 18:30:09 +0800</pubDate><description><![CDATA[Hiho 1044题意：​   有n个座位连续分布，现在给出限制条件m个连续座位上最多可以打扫q个位置，问最多能打扫多少垃圾。思路：​   对于前面的状态枚举每一种可能，对于当前状态只有两种选择，分别计算即可。#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std]]></description><category></category></item><item><title><![CDATA[Gym 101617H dfs + 离散化 + 枚举]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78825963</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78825963</guid><author>Since_natural_ran</author><pubDate>Sun, 17 Dec 2017 16:38:59 +0800</pubDate><description><![CDATA[Gym 101617H题意：​   有n个房间，m个门，k个桥，每一个门只允许特殊范围编号的人通过，问从出发点s到t可以有多少人通过。思路：​   读完题发现k没有什么作用。。​   对于这样的题在比赛的时候并没有读，太菜！从答案来看求的人数，通过题意可以发现这必然是一个连续的区间，左右端点不知道的情况下很难暴力，也无法枚举答案，因为很难验证。​   正解很巧妙，对于答案所在的区间必然是存在于某几个]]></description><category></category></item><item><title><![CDATA[Gym 101617J dp]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78821929</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78821929</guid><author>Since_natural_ran</author><pubDate>Sat, 16 Dec 2017 20:46:54 +0800</pubDate><description><![CDATA[Gym 101617J题意：​   n个金矿，每一个金矿都有一个初始值代表第一天里面所含的金子数量，每天减少di，现在从金矿1出发，问最多能获得多少金子。思路：​   时间是最难解决的问题，因为时刻在变化，但是如果能够对时间做处理，那么题目就很简单了。​   不妨枚举时间和前一个所在位置的状态，当时间和状态都满足的时候才可以继续走。#include <iostream>
#include <cstd]]></description><category></category></item><item><title><![CDATA[Gym 101617Jbfs+优先队列]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78815502</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78815502</guid><author>Since_natural_ran</author><pubDate>Fri, 15 Dec 2017 17:49:28 +0800</pubDate><description><![CDATA[Gym 101617J题意：​   n个金矿，每一个金矿都有一个初始值代表第一天里面所含的金子数量，每天减少di，现在从金矿1出发，问最多能获得多少金子。思路：​   用bfs的方式思考，对于每一个状态就是沿着路径暴力搜索，利用bfs层的思想，对于采金矿的时间也是合理的，但是这样会超时，所以需要用到优化。1. 对于时间有一个最大的时间，可以通过输入算出
2. 对于某一个金矿的到达存在不同的方式，记录]]></description><category></category></item><item><title><![CDATA[Gym 101617D dp]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78811676</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78811676</guid><author>Since_natural_ran</author><pubDate>Fri, 15 Dec 2017 12:49:02 +0800</pubDate><description><![CDATA[Gym 101617D题意：​   有一个nXn的图，由.和#组成，现在从1，1出发，每次跳最多k个格子，落点不能是#，问到（n，n）最少需要几步，如果无法到达则输出-1.注意只能向右和下走。思路：​   此题可以从dp方式来思考，当走到当前一步时，最重要的是判断从哪里开始，从上或者左，不妨开两个数组a和b分别记录行和列的信息:a[j]a[j] 保存当前j列中.所在的位置b[i]b[i] 表示能够到]]></description><category></category></item><item><title><![CDATA[Gym 101617D 线段树]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78811675</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78811675</guid><author>Since_natural_ran</author><pubDate>Fri, 15 Dec 2017 12:48:33 +0800</pubDate><description><![CDATA[Gym 101617D题意：​   有一个nXn的图，由.和#组成，现在从1，1出发，每次跳最多k个格子，落点不能是#，问到（n，n）最少需要几步，如果无法到达则输出-1.注意只能向右和下走。思路：​   直接bfs查询会超时，因为2000的数据会存很多点，但是如果对能到达的格子快速查找最小的步数可以用高级数据结构来完成，线段树。
对于每一行和每一列用线段树维护
#include <iostream]]></description><category></category></item><item><title><![CDATA[HDU 5459 根据题意找规律]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78755044</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78755044</guid><author>Since_natural_ran</author><pubDate>Fri, 08 Dec 2017 19:52:59 +0800</pubDate><description><![CDATA[HDU 5459 根据题意找规律题意：​   求一个字符串所有c字符位置到其它位置所需的步数和。思路：​   就根据题目的意思，如果要求出下一项则需要前两项的和加上前两项移动需要的步数，此时如果能从这里想的话就很简单了。#include <iostream>
#include <cstdio>
#include <cstring>using namespace std;typedef long lo]]></description><category></category></item><item><title><![CDATA[POJ 3167]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78725773</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78725773</guid><author>Since_natural_ran</author><pubDate>Tue, 05 Dec 2017 22:31:46 +0800</pubDate><description><![CDATA[POJ 3167题意：​   原串长度为n，匹配串长度为m，输出匹配串在原串中出现几次，并且输出其出现的位置。思路：​   利用kmp的思想，求出Next数组，求的方法是对于数字的排列存在规律，因为两个数列不同只能比较相对大小，其体现在当前数字之前的比其小的个数和与之相等的个数，预处理其存在的个数。​   as[i][j]as[i][j] : 在a[i]a[i] 位置之前（包括本身）k数字存在的个数]]></description><category></category></item><item><title><![CDATA[HDU 3374]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78703916</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78703916</guid><author>Since_natural_ran</author><pubDate>Sun, 03 Dec 2017 20:29:27 +0800</pubDate><description><![CDATA[HDU 3374题意：​   字符串长度为n（n<=1000000），问从哪个位置循环是最大字符串，从哪一个字符串循环时最小字符串，如果存在多个输出最大、最小的位置以及有多少个。思路：​   利用kmp算出有多少个循环，便是多少个。​   利用最大和最小表示法求出位置，注意输出最小的位置。#include <iostream>
#include <cstring>
#include <cstdio>]]></description><category></category></item><item><title><![CDATA[HDU5442 最小（大）表示法]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78693100</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78693100</guid><author>Since_natural_ran</author><pubDate>Sat, 02 Dec 2017 10:12:43 +0800</pubDate><description><![CDATA[最小（大）表示法​   一个字符串扩增到两倍的时候，在0~n-1的范围中都可以通过循环找到与原字符串同构的字符串，但是其中有两个特殊的字符串，字典序最大和字典序最小（数字也可以当做字典序来处理），直接暴力找到最小或者最大的算法复杂度是O(n^2) ，有一种最小（大）表示法可以解决此问题。百度论文：https://wenku.baidu.com/view/c6c5e7335a8102d276a22fa]]></description><category></category></item><item><title><![CDATA[HDU 5441并查集 by cyl]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78681467</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78681467</guid><author>Since_natural_ran</author><pubDate>Thu, 30 Nov 2017 21:50:45 +0800</pubDate><description><![CDATA[HDU 5441题意：​   杰克喜欢旅游，从城市a到城市b是他最喜欢的，现在有n个城市m个路。​   当杰克在从城市a到城市b 的时候需要坐车，但是需要有等待时间t，他无法忍受超过x 的等待时间。​   问：给出不同的x的忍耐时间，最多有多少a->b的方式，a->b和b->a当做两种不同的方式。思路：​   由于x值有很多个，不能每次查找的时候都要新建立一个图，为了利用上一步的运算，不妨对询问先从]]></description><category></category></item><item><title><![CDATA[HDU 5438拓扑+bfs或者dfs]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78681444</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78681444</guid><author>Since_natural_ran</author><pubDate>Thu, 30 Nov 2017 21:48:33 +0800</pubDate><description><![CDATA[HDU 5438题意：​   有个人有p个池塘，每一个池塘有其价值，池塘之间有连接的管道，现在主人由于资金的问题，需要抛弃一些池塘，其特点是与之相邻的池塘只有一个，当然如果删除了一个池塘之后剩下的池塘仍然有类似的池塘还要接着删除。​   删除之后，问连通图中池塘的个数为奇数个的连通图所有池塘的价值和。思路：​   记录每一个池塘所连接的边，其实也就是入度，此题的边是双向的，所以直接记录即可。​]]></description><category></category></item><item><title><![CDATA[HDU 5437by cyl优先队列]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78681407</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78681407</guid><author>Since_natural_ran</author><pubDate>Thu, 30 Nov 2017 21:44:50 +0800</pubDate><description><![CDATA[HDU 5437题意：​   有个人要过生日，有k个朋友来拜访，但是他家里实在是有点小，只能依次让朋友进门，有m个特定的时间，每次可以进入p个人，每一个朋友来会带礼物，价值为v。主人还是比较贪心的，他让朋友进入的条件是谁的礼物价值大谁先进，价值相等就按照拜访的顺序进入。思路：​   可以看出是细节题，考察了对优先队列的掌握，问题在于要猜测出题人的思路，或者说是算法不错但是无法AC的时候，多思考是不是]]></description><category></category></item><item><title><![CDATA[V - Digital Deletions HDU-1404]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78282412</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78282412</guid><author>Since_natural_ran</author><pubDate>Thu, 19 Oct 2017 11:12:15 +0800</pubDate><description><![CDATA[V - Digital Deletions HDU-1404题意：​   给出一个不超过6位的数字（有可能会出现前导零），有两种操作：1. 更改某一位的数字比其原来的小
2. 如果某一位是0可以将其和之后的数字删除
例如：两个人在玩游戏，谁先操作到最后谁获胜。思路：​   此题可以sg打表，利用最简单的性质：同样逆推局面推出胜态。用相反的操作，还原胜态。#include <iostream>
#in]]></description><category></category></item><item><title><![CDATA[I - Ugly Problem HDU-5920]]></title><link>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78254841</link><guid>https://blog.youkuaiyun.com/Since_natural_ran/article/details/78254841</guid><author>Since_natural_ran</author><pubDate>Mon, 16 Oct 2017 21:46:50 +0800</pubDate><description><![CDATA[I - Ugly ProblemHDU - 5920 题意：​   有一个大数，长度不超过1000，现在需要分解它，并且分解出来的数字都是回文数字，求出每一个分解 的个数和每一个分解的的数字。要求个数不能超过50.题意：​   此类题需要思维发散，向回文串的思路走的话会想到先找出一半，然后复制另一半，得到的数字必然是回文串，并且尽可能的大，当然会遇到此回文串比原串 大，即应该将左边的一半减一再还原，]]></description><category></category></item></channel></rss>