<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[NightRaven的博客]]></title><description><![CDATA[蒟蒻啊。。。]]></description><link>https://blog.youkuaiyun.com/KingKirito</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; KingKirito]]></copyright><item><title><![CDATA[【CSP2019准备】洛谷-P1966 火柴排队+洛谷-P1908 逆序对]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/103017550</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/103017550</guid><author>KingKirito</author><pubDate>Mon, 11 Nov 2019 20:51:48 +0800</pubDate><description><![CDATA[P1966火柴排队
P1908逆序对
火柴排队
显然我们要让a中第i小的对应b中第i小的，粗略想一下，如果一个是2,3，一个是3,4。那么2,3对应3,4比2,3对应4,3来的更好，因为题目中的高度不同，而我们的例子是差最小的极端例子，所以可以得出结论成立。
那么问题来了，怎么一一对应。
先把a,b离散化（打上序号排序），然后根据a序号的顺序排b的序号，此时b的序号，设为数组c，c[i]表示b中c...]]></description><category></category></item><item><title><![CDATA[【CSP2019准备】树状数组]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/103010823</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/103010823</guid><author>KingKirito</author><pubDate>Mon, 11 Nov 2019 15:47:22 +0800</pubDate><description><![CDATA[还剩四天
想重新学树状数组的起因是洛谷P1966
其实这题和树状数组关系不大，只是求逆序对的时候要用到，反正之前不会，就去看了一下，我本来因为会线段树所以基本没有学树状数组，但树状数组的常数更小，用起来也更方便，所以记录下来。
基础
名为lowbit的函数，设k为x的最低位的1，那么lowbit可以算出2^(k-1)。
具体数学证明我也不会，总之记下来就行了。
inline int lowbit(...]]></description><category></category></item><item><title><![CDATA[【模板】AC自动机（洛谷3808&洛谷3796）]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/88673416</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/88673416</guid><author>KingKirito</author><pubDate>Tue, 19 Mar 2019 21:11:07 +0800</pubDate><description><![CDATA[清明时节雨纷纷，省选只能当路人。
最近在狂补算法，AC自动机还是比较难理解。找到了洛谷日报上比较容易理解的版本，才勉强理解。
https://www.luogu.org/blog/42196/qiang-shi-tu-xie-ac-zi-dong-ji
千万记得前置技能trie树和KMP！
我博客里也有有关KMP的感想。（顺带安利一发
https://www.cnblogs.com/NightRa...]]></description><category></category></item><item><title><![CDATA[【模板】KMP与MP的区别（洛谷P3375）]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/88648392</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/88648392</guid><author>KingKirito</author><pubDate>Mon, 18 Mar 2019 19:49:31 +0800</pubDate><description><![CDATA[学KMP的时候巨佬说我这写的是MP，仔细去查了查资料，才发现了区别。
洛谷这道题用KMP是解决不了的，KMP的nxt数组和MP的nxt数组略有不同。
https://www.cnblogs.com/yjiyjige/p/3263858.html
这位大佬写的过程很清楚，但是程序不是怎么看得懂，而且实际放到洛谷的题上测应该也是过不了的（应该。
直接放程序8
#include&lt;bits/stdc...]]></description><category></category></item><item><title><![CDATA[Codeforces 908E. The Number Games题解（倍增）]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/86747556</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/86747556</guid><author>KingKirito</author><pubDate>Sat, 02 Feb 2019 09:52:50 +0800</pubDate><description><![CDATA[传送门
题意：给你一棵树，删掉树上的k个点，使得剩下的点构成的图依然联通，并且使2^(点权)之和尽量大，请从小到大输出这几个点。
思路：因为是2的次方，所以很自然的能想到最大的点一定要保留，否则剩下的所有点加起来都没有他大，这是很显然的而且正确的贪心策略。所有可以以最大的点为根拎成一棵树。
如果我们直接想删掉哪些点其实是不好的，我们能删的点只能是叶子结点或者是一个根和他所有的子孙，但如果我们只考虑...]]></description><category></category></item><item><title><![CDATA[【全网最高端】中缀表达式转为后缀表达式以及求值（可用于负数，阶乘，高精度）]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/83104806</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/83104806</guid><author>KingKirito</author><pubDate>Wed, 17 Oct 2018 09:31:47 +0800</pubDate><description><![CDATA[代码里有注释。。。直接上代码。。。
#include&amp;amp;lt;bits/stdc++.h&amp;amp;gt;
#define rep(i,k,n) for(int i=k;i&amp;amp;lt;=n;i++)
#define per(i,n,k) for(int i=n;i&amp;amp;gt;=k;i--)
#define pii pair&amp;amp;lt;int,int&amp;amp;gt;
#define pb push_back
#define mp ...]]></description><category></category></item><item><title><![CDATA[Codeforces 514C. Watto and Mechanism解题报告（字典树）]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/82931585</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/82931585</guid><author>KingKirito</author><pubDate>Wed, 03 Oct 2018 14:27:34 +0800</pubDate><description><![CDATA[传送门
题意：给你一个字典和一些询问，问你对于每个询问的字符串必须更改一个字符，能否得到字典中的某一个单词。
思路：先构造一颗字典树，然后搜一遍就行了，要注意strlen不能每次都用，常数很大！
#include&amp;lt;bits/stdc++.h&amp;gt;
#define rep(i,k,n) for(int i=k;i&amp;lt;=n;i++)
using namespace std;
const i...]]></description><category></category></item><item><title><![CDATA[URAL 2020. Traffic Jam in Flower Town题解]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/81610549</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/81610549</guid><author>KingKirito</author><pubDate>Sun, 12 Aug 2018 20:59:54 +0800</pubDate><description><![CDATA[传送门



题意：有两列摩托车，一列为从南向北行驶，一列从北向南行驶，且南北向路是双行线，而东西线路是单行线，要求的是两列摩托车经过十字路口的最短时间。



思路：小型模拟





using namespace std;
const int maxn=1000+5;
string s1,s2;
int n1,n2;
int cnt1,cnt2,ans;
int main()
{
    c...]]></description><category></category></item><item><title><![CDATA[URAL 2010. Sasha the Young Grandmaster题解]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/81610290</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/81610290</guid><author>KingKirito</author><pubDate>Sun, 12 Aug 2018 20:39:55 +0800</pubDate><description><![CDATA[传送门



题意：国际象棋的规则，给你n*n的棋盘，并且给你一个(x,y)的坐标，问你在这个位置上放战车等棋子分别能攻击到几个格子。



思路：降智打击，骑士和国王都是八连通（骑士只是另一种八连通），只要周围跑一圈判断有没有出界就ok，主教左上右上等四个边界减自身坐标取xy最小值就是能攻击到的格子，战车就不用说了(n-1)*2，皇后就是主教加战车。





using namespace s...]]></description><category></category></item><item><title><![CDATA[URAL 2018. The Debut Album]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/81610229</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/81610229</guid><author>KingKirito</author><pubDate>Sun, 12 Aug 2018 20:33:46 +0800</pubDate><description><![CDATA[传送门



题意：三个数N,A,B，你有1，2两种数字，组合成一个长为N的数列，1没有连续A个，2没有连续B个，问有几种排列方法。



思路：DP，dp[i][j]表示i个数，末尾为j的方案个数，可以由i-a(或者是b，看j是1还是2)到i的不同于j的方案个数总和转移而来。



using namespace std;
const int maxn=50005,modn=1e9+7;
int...]]></description><category></category></item><item><title><![CDATA[URAL 2033. Devices题解]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/81606941</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/81606941</guid><author>KingKirito</author><pubDate>Sun, 12 Aug 2018 15:36:32 +0800</pubDate><description><![CDATA[传送门



题意：有六个人，每个人都买了一台设备，每台设备都有一个价格，请你找出买的人最多且最低价格最低的那一台。



思路：没啥好说的，直接上代码



using namespace std;
struct node
{
    string dev;
    ll price;
    int num;
} z[10];
bool cmp(node a,node b)
{
    if(...]]></description><category></category></item><item><title><![CDATA[URAL2025. Line Fighting题解]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/81606706</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/81606706</guid><author>KingKirito</author><pubDate>Sun, 12 Aug 2018 15:14:23 +0800</pubDate><description><![CDATA[传送门



题意：有N个人，你要把他们分成K个队伍，每两个队伍之间每两个人都会打一架，请你求出最后分配完最多一共要打几场。



思路：小学学过和相同时越接近积越大，每个队伍分配(n/k)下取整个人，多余的前几个队伍每个分配一个人就行了，然后n^2暴力求打架的次数。



AC程序

using namespace std;
int n,t;
vector&amp;lt;int&amp;gt; v;
int m...]]></description><category></category></item><item><title><![CDATA[URAL 2011. Long Statement题解]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/81606516</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/81606516</guid><author>KingKirito</author><pubDate>Sun, 12 Aug 2018 14:57:46 +0800</pubDate><description><![CDATA[传送门



题意：有N个为1或2或3的数，问用这N个数的排列方式是不是有6中以上。



思路：降智题，显然六个数以上无论这六个数是怎么组成，只要有两种数字就一定能组成6种，5种及以下我就懒得找规律了，直接全排列统计。



AC程序



using namespace std;
const int maxn=105;
int a[maxn],n,ans;
set&amp;lt;int&amp;gt; se;...]]></description><category></category></item><item><title><![CDATA[Codeforces 883D. Packmen Strike Back（二分+DP）]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/81586564</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/81586564</guid><author>KingKirito</author><pubDate>Sat, 11 Aug 2018 14:42:18 +0800</pubDate><description><![CDATA[传送门



题意：一条长为n线上有几个吃豆人和几个豆子，你可以控制吃豆人的移动方向，选定方向之后吃豆人便会一直向这个方向走，问能吃到的最大豆子数和为了达到这个目标所需的最少时间。



思路：最大的豆子数量其实就是所有的豆子，唯一有个特例就是只有一个人，有两个人以上的话，不难想出只要两人面对面走就能吃到所有豆子了，所以先处理只有一个人的情况。



void straight()
{
    i...]]></description><category></category></item><item><title><![CDATA[Codeforces 292C. Beautiful IP Addresses解题报告（Brute Force）]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/81560131</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/81560131</guid><author>KingKirito</author><pubDate>Fri, 10 Aug 2018 11:17:42 +0800</pubDate><description><![CDATA[传送门 
题意：给你N个数，求符合标准ip地址规则的所有ip地址，要求每个数都至少用一次。



思路：暴力dfs一位一位向后加数，我用的位运算判断是否使用过和mask比较，dfs到最后一位加点，然后把答案存起来最后输出就ok了（简称暴力）



AC程序



//库省略
using namespace std;
vector&amp;lt;string&amp;gt; ans;
int mask,n;
boo...]]></description><category></category></item><item><title><![CDATA[Codeforces 666B. World Tour 解题报告]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/81179962</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/81179962</guid><author>KingKirito</author><pubDate>Tue, 24 Jul 2018 10:26:05 +0800</pubDate><description><![CDATA[传送门 
题意：一个有N个定点M条边的有向图，dist[i][j]表示从i到j的最短距离，每条边的长度皆为1，请你给出有序的四个点a,b,c,d，使dist[a][b]+dist[b][c]+dist[c][d]最大。



思路：先用SPFA处理最短路是显然的，然后就是怎么选择点的问题，既然要和最大，那么肯定是两两个点之间的距离最大，那么我们可以预处理出每个点距离最远的点，然后只暴力中间两个点，...]]></description><category></category></item><item><title><![CDATA[POJ 3538/Codeforces 100078D:Domestic Networks 解题报告]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/81133467</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/81133467</guid><author>KingKirito</author><pubDate>Fri, 20 Jul 2018 15:41:14 +0800</pubDate><description><![CDATA[点击这里进入题目 
题意：有N个顶点M条边，每一条边都有相应的长度，你有长度为5和长度为6的线，你要用它来覆盖这些边，使花费最小。



思路：一个图上要求最小的花费，很明显要先处理最小生成树



AC程序

//库省略
using namespace std;
const int maxn=10005;
int n,m,k;
int fa[maxn];
int mst[maxn];
int n...]]></description><category></category></item><item><title><![CDATA[Codeforces 269D. Maximum Waterfall解题报告]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/81133032</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/81133032</guid><author>KingKirito</author><pubDate>Fri, 20 Jul 2018 15:23:57 +0800</pubDate><description><![CDATA[点击这里进入题目 
题意：在一面墙上有几块木板，给你木板在前面上的高度，左端点，右端点，你可以控制水流的方向，水流能从上面的木板流向下面的木板需要两个木板在高度上有相交以及中间没木板隔开，问最大的水流量。

思路：先用一个vector，将左端点和右端点拆开记录，同时标清楚是哪一块木板，高度在哪，以及是左端点还是右端点，然后按照从左到右的顺序排序。然后遍历这个vector，遇到左端点就将这块木板压入...]]></description><category></category></item><item><title><![CDATA[Codeforces 95E Lucky Country解题报告]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/81122794</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/81122794</guid><author>KingKirito</author><pubDate>Fri, 20 Jul 2018 15:08:06 +0800</pubDate><description><![CDATA[点击这里进入题目 
题意：有N个国家，每个国家之间一共有M条无向路。国家会由路连成一个个联通块，然后问你要最少添加几条边，使最大的联通块的点的个数为一个幸运数（只包含4或7的数）。

思路：首先要做的肯定是处理联通块，可以用dfs或并查集，把每个连通块的大小都记录下来，这时候假如把每一个作为一个单独的来处理会很慢，我们要做的是把相同大小的放在一起，记录相同大小联通块的数量，再整体dp。

AC程序...]]></description><category></category></item><item><title><![CDATA[Codeforces 460C Present（二分+线段树）]]></title><link>https://blog.youkuaiyun.com/KingKirito/article/details/80958728</link><guid>https://blog.youkuaiyun.com/KingKirito/article/details/80958728</guid><author>KingKirito</author><pubDate>Sun, 08 Jul 2018 13:29:14 +0800</pubDate><description><![CDATA[点击这里进入题目



题目大意：给你n个数，可以做出m次修改，每次修改一个长度为w的区间，给这区间每一个数字加一，问修改后数组中最小值的最大值。



思路：看到区间修改和十的五次方的数据范围，很难想不到线段树，再看到最小值的最大值，也很难不想到二分，那么就直接二分最后的答案，然后用线段树维护check即可。



AC程序：



//库省略
using namespace std;
cons...]]></description><category></category></item></channel></rss>