<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[geng4512的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/geng4512</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; geng4512]]></copyright><item><title><![CDATA[51nod算法马拉松29 图]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/78199079</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/78199079</guid><author>geng4512</author><pubDate>Wed, 11 Oct 2017 00:02:24 +0800</pubDate><description><![CDATA[传送门 
因为给出的是一个非A即B的问题，我们可以考虑一下最小割(不知道是不是在乱说。。) 
然后我们可以定义对于一个点u，如果在切割后u与源点S相连，那么表示u在A集合，否则u与T相连，在B集合。 
然后我们对于给出的无向图中已有的边(u,v)，S连向u和v，流量为|u-v|，表示如果u和v任意一个不在A集合，都将付出|u-v|的代价。 
然后我们对于给出的无向图中没有的边(u,v)，u和v连向T]]></description><category></category></item><item><title><![CDATA[HDU6200 mustedge mustedge mustedge (2017 ACM/ICPC Asia Regional Shenyang Online)]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/77969920</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/77969920</guid><author>geng4512</author><pubDate>Wed, 13 Sep 2017 19:24:02 +0800</pubDate><description><![CDATA[传送门题目大意给出一张连通图，现在有两种操作： 
⋅1 u v\cdot 1\ u\ v:向图中加入一条连接uu和vv的边 
⋅2 u v\cdot 2\ u\ v:询问uu和vv之间的必经边的条数思路首先随便找到一个生成树，每条边的初始权值为1，对于所有非树边(u,v)(u,v)，将生成树上uu到vv的路径上的所有边的权值都变为0，那么询问时只需要回答uu到vv的边权和即可，这就很容易了。 
然后]]></description><category></category></item><item><title><![CDATA[2017 ACM-ICPC 亚洲区（乌鲁木齐赛区）网络赛 [计蒜客] Our Journey of Dalian Ends]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/77969574</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/77969574</guid><author>geng4512</author><pubDate>Wed, 13 Sep 2017 18:43:00 +0800</pubDate><description><![CDATA[传送门题目大意在一个无向图上，求大连到西安经过上海的最短路，每个点只能走一次。思路考虑费用流，从源点连向大连和西安流量各为1，从上海连向汇点流量为2，通过拆点来限制流量。代码#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5, INF = 0x3f3f3f3f;
struct Edge { int v, w,]]></description><category></category></item><item><title><![CDATA[HDU6053 TrickGCD(容斥原理)]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/76307582</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/76307582</guid><author>geng4512</author><pubDate>Sat, 29 Jul 2017 14:50:02 +0800</pubDate><description><![CDATA[传送门 
考虑枚举所有数的最大公约数g，那么答案大概张成这个样子 
∑g=2∞(−μ(g))∏i=1n⌊aig⌋\sum_{g=2}^{\infty}(- \mu(g))\prod_{i=1}^{n}\lfloor{\frac{a_i}{g}}\rfloor 
其中的莫比乌斯函数是用来容斥的，不知道的可以先学习一下。 
按照式子直接做是n2n^2的，肯定不能通过。考虑优化。想到⌊aig⌋\lfloo]]></description><category></category></item><item><title><![CDATA[HDU6046 hash 【2017多校联训第二场B】]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/76222509</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/76222509</guid><author>geng4512</author><pubDate>Thu, 27 Jul 2017 22:16:40 +0800</pubDate><description><![CDATA[传送门 
题目大意：给出一个106∗10610^6 * 10^6的矩阵的每一位的计算方式，然后给出一个103∗10310^3*10^3的矩阵，求这个矩阵出现的位置。 
题解：对于小矩阵的每一个位置求出这个位置以及之后6363位的值压在一个unsigned long longunsigned\ long\ long里面。因为这个大矩阵是完全随机的，而且2642^{64}远大于101210^{12}所以]]></description><category></category></item><item><title><![CDATA[BZOJ3545: [ONTAK2010]Peaks(线段树合并)]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/52056623</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/52056623</guid><author>geng4512</author><pubDate>Thu, 28 Jul 2016 16:30:18 +0800</pubDate><description><![CDATA[传送门 
这题允许离线的话，就直接线段树合并就可以了。 
这个线段树就是一棵值域线段树。枚举一维表示边权的大小，把边权小于枚举值的边的两端所在的线段树合并了，在线段树里查询第k大值就可以了。 
如果是加强版的话，可以使用主席树合并来完成。#include <cstdio>
#include <algorithm>
using namespace std;
#define MAXN 500005
in]]></description><category></category></item><item><title><![CDATA[BZOJ4556: [Tjoi2016&Heoi2016]字符串]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/51843209</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/51843209</guid><author>geng4512</author><pubDate>Wed, 06 Jul 2016 23:31:21 +0800</pubDate><description><![CDATA[这道题说难也不难，但是有一个很经典的维护主席树的思想。首先我们先建出一个后缀数组，然后我们按照sa的顺序建一棵以原串下表为权值的主席树，查询(a,b,c,d)(a, b, c, d)的时候，先二分一个长度，找出sa中串[c,c+len][c, c+len]的区间，然后查询区间中是否有下标属于[a,b−len+1][a, b-len+1]。 
代码：#include <cstdio>
#include]]></description><category></category></item><item><title><![CDATA[组合数模任意数]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/51701227</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/51701227</guid><author>geng4512</author><pubDate>Fri, 17 Jun 2016 16:55:12 +0800</pubDate><description><![CDATA[本文内容是求组合数模合数的方法 
本方法有局限性，假设求CKN mod PC_N^K \ mod \ P 
其中P=Πmi=1Pqii,其中P = \Pi_{i=1}^{m}P_i^{q_i},对于任意i,j∈[1,m],(Pi,Pj)=1对于任意i,j\in[1,m],(P_i, P_j) = 1 
若要使用本方法，则PqiiP_i^{q_i}不能太大 
具体方法如下具体方法如下 
我们知道，一般]]></description><category></category></item><item><title><![CDATA[BZOJ3439 KPM的MC密码]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/51447729</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/51447729</guid><author>geng4512</author><pubDate>Wed, 18 May 2016 21:42:12 +0800</pubDate><description><![CDATA[传送门 
题意:给出n个字符串,对于每一个字符串,输出以他为后缀的串中编号第k小串的编号. 
不是很懂为什么网上这道题都是什么主席树,这题明明可以O(N)O(N)来实现啊.只需要Hash一下就好了. 
对于每一个串的每一个后缀都存一下这个后缀的所在串的编号,因为所有的串的后缀的个数是字符串的总长的,所以,我们只要用Hash表,就能在现行时间内完成整个题目啦!#include <cstdio>
#in]]></description><category></category></item><item><title><![CDATA[POJ2947 Widget Factory（高斯消元模板题）]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/51438857</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/51438857</guid><author>geng4512</author><pubDate>Tue, 17 May 2016 19:51:24 +0800</pubDate><description><![CDATA[传送门 
大意：有n个变量，m个等式，求在 模7 意义下的解。 
其实就是模板题，消完元之后如果有自由元就是有多个解，如果消完元之后有等式两边不等的情况，就是无解，否则有解。 
代码：#include <cstdio>
#include <cstring>
#include <algorithm>
#include <assert.h>
using namespace std;
#define MA]]></description><category></category></item><item><title><![CDATA[BZOJ1787: [Ahoi2008]Meet 紧急集合(LCA)]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/51123981</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/51123981</guid><author>geng4512</author><pubDate>Mon, 11 Apr 2016 18:19:29 +0800</pubDate><description><![CDATA[这一道题中，每一次询问的答案就是这三个点，两两的LCA的异或和。至于这样为什么是对的呢？ 
我们先考虑是否一定有重复的LCA呢？ 
如果三个点在根节点的不同子树中，那么LCA都是根节点，三个都重复。 
如果有两个在一个子树中，那么这两个与另外一个的LCA都是根节点。 
如果三个都在一个子树中，可以归纳到以上两种情况。然后考虑为什么是异或和。 
如果三个LCA相同，那么一定是这个点无疑，等于异或和]]></description><category></category></item><item><title><![CDATA[BZOJ2705: [SDOI2012]Longge的问题]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/51123792</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/51123792</guid><author>geng4512</author><pubDate>Mon, 11 Apr 2016 17:55:17 +0800</pubDate><description><![CDATA[给定一个整数N，你需要求出∑gcd(i,N)(1<=i<=N)∑gcd(i, N)(1<=i <=N)。不难想到（连我这个SB都想到了）,最后的答案一定和Σd|nd∗(d在n中出现的次数)\Sigma_{d|n}d *(d在n中出现的次数)有关系，所以考虑这个关系。显然我们希望一个数只被计算一次，那么就要考虑到底有几个数和n的gcd等于d。有一个很常用的转换就是同时将n和那些数除以d，问题转化成了有]]></description><category></category></item><item><title><![CDATA[Codeforces Zip-line 650D 345Div1D(LIS)]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/50855662</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/50855662</guid><author>geng4512</author><pubDate>Fri, 11 Mar 2016 14:06:10 +0800</pubDate><description><![CDATA[传送门 
大意：给出一个序列，求修改一个数过后的最长上升子序列。 
思路：可以用主席树在线搞，也可以用树状数组离线搞，明显后者好写得多。我们首先读取所有的询问，然后就把询问绑在给出的位置，然后我们正向做一遍LIS，反向做一遍LDS，然后就可以解决这个问题了。#include <cstdio>
#include <algorithm>
#include <vector>
#define MAXN 40]]></description><category></category></item><item><title><![CDATA[BZOJ2888 资源运输（LCT启发式合并）]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/50840901</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/50840901</guid><author>geng4512</author><pubDate>Thu, 10 Mar 2016 00:26:17 +0800</pubDate><description><![CDATA[这道题目太神啦！ 
我们考虑他的每一次合并操作，为了维护两棵树合并后树的重心，我们只好一个一个的把节点加进去。那么这样一来看上去似乎就是一次操作O(nlogn)O(nlogn)，但是我们拥有数据结构的合并利器——启发式合并，那么我们就可以在均摊O(log2n)O(log^2n)的时间内合并一颗树，这题就可以完美的AC啦！ 
什么，你问怎么维护重心？我们可以记录一个值sb表示子树的大小。怎么维护sb呢]]></description><category></category></item><item><title><![CDATA[BZOJ1188 [HNOI2007]分裂游戏(SG函数)]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/50816660</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/50816660</guid><author>geng4512</author><pubDate>Mon, 07 Mar 2016 01:15:01 +0800</pubDate><description><![CDATA[传送门 
拿到这道题就知道是典型的博弈论，但是却不知道怎么设计它的SG函数。看了解析一类组合游戏这篇论文之后才知道这道题应该怎么做。 
这道题需要奇特的模型转换。即把每一个石子当做一堆石子，且原来在第i堆的石子（从0开始标号）的石子个数为n-i-1，这样题目就转化成了每次取一堆石子，并放回两个比这一堆的石子个数少的石堆。这样，我们就可以有序的递推sg函数值了。 
即：sg(i)=mex({sg[j]]]></description><category></category></item><item><title><![CDATA[BZOJ4170 极光（CDQ分治 或 树套树）]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/50813770</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/50813770</guid><author>geng4512</author><pubDate>Sun, 06 Mar 2016 15:56:38 +0800</pubDate><description><![CDATA[传送门 
BZOJ上的题目没有题面…… 
 
【样例输入】 
3 5 
2 4 3 
Query 2 2 
Modify 1 3 
Query 2 2 
Modify 1 2 
Query 1 1 
【样例输出】 
2 
3 
3这道题稍微分析一下就知道是求一个一个点曼哈顿距离小于k的的范围内的点的个数（把下标看做x，把值看做y）。然后我们只需要旋转一下坐标轴就变成了和“Mokia”或“简单题”一样]]></description><category></category></item><item><title><![CDATA[BZOJ2683 简单题（CDQ分治）]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/50811713</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/50811713</guid><author>geng4512</author><pubDate>Sun, 06 Mar 2016 01:13:02 +0800</pubDate><description><![CDATA[传送门 
之前听别人说CDQ分治不难学，今天才知道果真如此。之前一直为自己想不到CDQ的方法二很不爽，今天终于是想出来了一道了，太弱…… 
cdq分治主要就是把整段区间分成两半，然后用左区间的值去更新右区间的答案，每次把区间折半。对于本题来说时间复杂度T(N)=T(N/2)+O(NlogN)T(N) = T(N/2)+O(NlogN) 
T(N)=O(Nlog2N)T(N) = O(Nlog^2N)]]></description><category></category></item><item><title><![CDATA[51NOD算法马拉松11 B君的竞技场]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/50772408</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/50772408</guid><author>geng4512</author><pubDate>Tue, 01 Mar 2016 14:38:22 +0800</pubDate><description><![CDATA[传送门 
这题我在比赛的时候竟然没有想出来，真是…… 
这道题我们可以想一想怎么搞定获胜的概率p。 
我们发现再怎么这个p都是搞不了的。所以我们可以积一下分，然后就可以不用去管p了。我们要做的就是求出一个关于p的多项式。 
我们又发现，对于整体的期望，并不好直接表示出来（是可以表示出来的）。所以我们就想一想怎么去递推吧。 
设f(i,j)f(i, j)表示赢了i场，输了j场的概率（一个关于p的多项式]]></description><category></category></item><item><title><![CDATA[UOJ#34 FFT模板题]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/50762820</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/50762820</guid><author>geng4512</author><pubDate>Mon, 29 Feb 2016 00:20:40 +0800</pubDate><description><![CDATA[写完上一道题才意识到自己没有在博客里丢过FFT的模板…… 
这道题就是裸的多项式乘法，可以FFT，可以NTT，也可以用Karasuba（好像有人这么写没有T），也可以各种其他分治乘法乱搞…… 
所以我就直接给板子了#include <cstdio>
#include <cmath>
#define MAXN 300005
#define DB double
#define pi 3.14159265]]></description><category></category></item><item><title><![CDATA[BNUOJ 51279[组队活动 Large](cdq分治+FFT)]]></title><link>https://blog.youkuaiyun.com/geng4512/article/details/50762789</link><guid>https://blog.youkuaiyun.com/geng4512/article/details/50762789</guid><author>geng4512</author><pubDate>Mon, 29 Feb 2016 00:15:19 +0800</pubDate><description><![CDATA[传送门 
大意：ACM校队一共有n名队员，从1到n标号，现在n名队员要组成若干支队伍，每支队伍至多有m名队员，求一共有多少种不同的组队方案。两个组队方案被视为不同的，当且仅当存在至少一名队员在两种方案中有不同的队友。 
这年头真是……分治FFT都开始烂大街了…… 
我们来推一推吧 
这显然是一个1d1d的DP，用f[i]f[i]表示ii名队员的方案数 
f[i]=∑j=0i−1f[i−j−1]∗Cj]]></description><category></category></item></channel></rss>