- 博客(283)
- 收藏
- 关注
原创 Step1
import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] arr = new int[n]; for (int i = 0; i ...
2018-08-19 20:37:57 1176
原创 最大流 ISAP
const int MAXN = 2010;//点数const int MAXM = 400010;//正向弧和反向弧的数量struct Edge{ int to,next,cap,flow;} edge[MAXM];int Top;int head[MAXN];int gap[MAXN],dep[MAXN],cur[MAXN];void Init(){
2015-06-26 20:04:15 835
原创 组合数取余(Mod 可以不为质数)
using namespace std;const int MAXN = 200005;bool ispri[MAXN];int prime[MAXN];int priCnt;void CalPrime(){ priCnt = 0; memset(ispri,false,sizeof(ispri)); for(int i = 2;i < MAXN; ++
2015-06-24 16:56:29 1753
原创 POJ 1987 Distance Statistics 树上点分治
算是入门题了,详见《分治算法在树的路径问题中的应用》(by 漆子超)。#include #include #include #include #include #include #include #include #include #define LL long long#define INF 0x3f3f3f3f#define Mod 1000000007#def
2015-05-16 10:51:51 689
原创 树的重心
拿掉重心后,最大的联通分量的点的个数最少。using namespace std;const int MAXE = 80010;const int MAXP = 40010;struct EDGE{ int v,next;}edge[MAXE];int head[MAXP];int Top;void Link(int u,int v){ edge[Top
2015-05-16 08:53:23 723
原创 无向图求桥,允许重复边
#include #include #include #include #include #include #include #include #include #define LL long long#define INF 0x3f3f3f3f#define Mod 1000000007#define Seed1 31#define Seed2 37#define
2015-05-15 16:03:17 1481
原创 无向图求割点
using namespace std;const int MAXE = 300010;const int MAXP = 1010;struct N{ int v,next;}edge[MAXE*2];int head[MAXP];int Top;int high[MAXP];int low[MAXP];int subnet[MAXP];int dfsClock;
2015-05-15 15:04:13 1035
原创 有向图的强联通分量 tarjan
多与DAG上的DP之类的问题一起出现。using namespace std;const int MAXE = 300010;const int MAXP = 100010;struct N{ int v,next;}edge[MAXE];int head[MAXP];int Top;int ty[MAXP];int high[MAXP];int low
2015-05-15 10:38:45 1006
原创 Codeforce 487B Strip 动归+二分+线段树
写完之后的第一感觉就是我又写麻烦了。。。写了两棵线段树维护信息。。。dp[i] 表示[1,i]这段前缀的最优解,若dp[i] = INF,表示无解。特殊的,dp[0] = 0。那么,有一个思路就是我们有一些长度为设dp[i]已知且dp[i] != INF,那么设我们知道一个位置R,满足[i+1,R]这一段区间可以划分到一段,i+1 = l。那么我们将dp[i+1],dp[i+2].
2015-05-04 17:44:32 1057
原创 SPOJ DQUERY 区间内不同数的个数 主席树
#include #include #include #include #include using namespace std;const int MAXN = 30010,MAXLOG = 20;struct ChairTree{ int l,r; int ans;}ct[MAXN*MAXLOG];int ctRoot[MAXN];int ctTop
2015-04-28 14:56:15 941
原创 二分图匹配
using namespace std;const LL MAXN = 9000001;struct N{ unsigned int v,next;}edge[MAXN*2];int head[MAXN];int Top;void Link(unsigned int u,unsigned int v){ edge[Top].v = v; edge
2015-04-23 21:35:19 732
原创 最小费用最大流模板
const int MAXN = 10000;const int MAXM = 100000;struct Edge{ int to,next,cap,flow,cost;}edge[MAXM];int head[MAXM],tol;int pre[MAXN],dis[MAXN];bool vis[MAXN];int N;void Init(int n){ N
2015-04-22 21:42:45 619
原创 树链剖分模板
#include #include #include #include #include #include #include #include #define LL long long#define EPS (1e-8)#define INF 0x3f3f3f#pragma comment(linker, "/STACK:1024000000,1024000000")
2015-04-22 20:46:19 579
原创 SPOJ TTM To The Moon 主席树的区间更新与查询
首先要吐槽一下,区间更新的主席树的内存开销已经瞬间爆炸了。。n,m 首先主席树所需要的lazy与普通线段树的lazy无差。主席树需要另开一个标记来判断当前节点是否是前一层的节点,如果是就在pushdown的时候分配一个新的。HDU已经MLE成狗了。不过可持久化的BIT 貌似可过,线段树被卡系数了OTZ。。。#include #include #include #include
2015-04-22 13:32:53 995
原创 ZOJ 2112 Dynamic Rankings BIT套ChairTree
劳资就是想单纯的测个模板,怎么就特喵的这么难。首先说一下自己对主席树的理解。作用:确定区间[L,R]内的第K大数,或者区间内有多少个不同个元素。主席树的另一个名字叫做函数式线段树,然后我查了一下函数式的特点,其中之一就是不修改状态。从主席树上来看这个特点就是:在向主席树插入第 i 个元素之后,我们仍能查询到没插入 i 之前的状态。主席树的构造:对于有n个元素,s个不同元
2015-04-21 14:27:00 721
原创 URAL 1752 Tree 2 树的直径与倍增
假设树的直径的两个端点为p0,p1。如果对于一次询问(v,k)存在点q满足要求,那么q必然在v到p0或v到p1的路径上。剩下的就是在树上寻找p了。倍增就好了。#include #include #include #include #include #include #include #include #include #define LL long long#defi
2015-04-16 16:14:49 1013
原创 原根
定理:如果m有原根,那么它一定有φ(φ(m))个原根。求模素数P原根的方法:对p-1素因子分解,得到top个素因子,若有(g^((P-1)/FACi))%P != 1%P (1
2015-04-09 12:26:35 967
原创 大素数判断和素因子分解(miller-rabin,Pollard_rho算法)
#include #include #include #include #include #include #include #include #pragma comment(linker, "/STACK:1024000000")#define LL long long int#define INF 0x3f3f3f3fusing namespace std;con
2015-04-09 11:14:50 935
原创 欧拉素数筛
const int MAXN = 1000;//上限bool mark[MAXN];int phi[MAXN];//欧拉函数值int prime[MAXN];//素数int Top;//素数个数void GetPhiandPrimeTable(int n){ memset(mark,false,sizeof(mark)); phi[1] = 1; Top =
2015-04-09 11:06:16 759
原创 在线LCA
const int MAXN = 10010; const int MAXM = 10010; struct N { int v,w,next; }edge[MAXM*2]; int Top; int head[MAXN]; int MAXSIZE; int dep[MAXN]; int seq[MAXN*2]; int R[MAXN];
2015-04-08 16:52:31 722
原创 允许重复数字的划分树
const int MAXN = 50010,MAXM = 20;int num[MAXN],tmp[MAXN],pre[MAXN];int ans[MAXM][MAXN],val[MAXM][MAXN];void Init(int l,int r,int h){ if(l == r) return ; //printf("l = %2d r = %2
2015-04-08 16:49:02 645
原创 HDU 2784 Connections between cities 并查集+Online_LCA
模板攒起来#include #include #include #include #include #include #include #pragma comment(linker, "/STACK:1024000000");#define LL long long intusing namespace std;const int MAXN = 10010;const
2015-04-03 20:36:48 957
原创 POJ 1637 Sightseeing tour混合欧拉图的判定
网络流简直爆炸了。以下解释转自kuangbin博客,爆炸了。【混合图】混合图(既有有向边又有无向边的图)中欧拉环、欧拉路径的判定需要借助网络流!(1)欧拉环的判定:一开始当然是判断原图的基图是否连通,若不连通则一定不存在欧拉环或欧拉路径(不考虑度数为0的点)。其实,难点在于图中的无向边,需要对所有的无向边定向(指定一个方向,使之变为有向边),使整个图变成一个有向欧拉
2015-04-03 19:29:52 715
原创 2011 Asia Dalian Regional Contest _ Rescue the Rabbit AC自动机+状压DP
很直白,很实在,很炫酷的一道题。dp[i][j][k] 表示长度为 i 时,最后一位在自动机的第 j 个状态点,已经包含了状态 k 的字符串的最优解。然后dp[i][j][k] 可以转移到 四个位置 即在i+1位放置‘A’,‘G’,'C','T',j显然会在自动机走,k根据 j 的变化而变化。最后答案为 dp[ l ][ j ][ k ]的最大值。内存卡的比较厉害,可以用滚动数组。
2015-03-20 15:31:57 891
原创 HDU 2243 考研路茫茫――单词情结 AC自动机 + 矩阵快速幂
根据AC自动机构造矩阵,然后丢到模板里跑一跑就好了。设所有情况的总数为 sum,不合法数为 non,则答案anw = sum - non。首先sum = sigma(26^i) (1 然后non 为 所有不含词根的情况。对于所有的AC自动机上的节点 i 枚举下一个可能的字符,即‘a’ - ‘z’,然后根据自动机的规则肯定会转移到某个节点 j ,如果 j 及 j 通过fail指针
2015-03-20 10:43:53 820
原创 ZOJ 3228 Searching the String AC自动机的不重复匹配
这个判断方法真的没想到。。。对于在S中匹配M,如果M上一次的匹配位置pre与这一次的匹配位置now满足now-pre >= M.length,则加1。这个判断太跳了233 。#include #include#include#include#include#include#include#include#include #include #include #
2015-03-20 10:33:32 869
原创 AC自动机 + 二维最短路 HDU 4511 小明系列故事――女友的考验
这个题还是比较好想的。首先将所有不可行方案建立AC自动机,然后跑最短路。首先将小明放在(sta = 0,pos = 0)处,sta表示AC自动机上点的编号,pos表示坐标点的编号。根据pos枚举下一次可以到达的地方[pos+1,n],然后sta在自动机上移动,如果某一步会使sta位于有标记的节点,那么这一步是不可行。#include #include#include#incl
2015-03-20 10:29:19 821
原创 HDU 5072 Coprime 同色三角形问题
好吧,我承认就算当时再给我五个小时我也做不出来。首先解释同色三角形问题:给出n(n >= 3)个点,这些点中的一些被涂上了红色,剩下的被涂上了黑色。然后将这些点两两相连,于是每三个点都会组成一个三角形,即总共有sum = C(3,n)个三角形。对于一个三角形,如果三个点颜色一样则称其为同色三角形。那么一个很直观的思路就是容斥,sum - 非同色三角形个数ans。ans =
2015-03-13 21:21:54 970
原创 HDU 4291 A Short problem 又是一道神奇的矩阵
首先要知道一个姿势,对于Fib数列这类的东西,只要取余就一定会出现循环节。所以上来就直接暴力打表找规律就好了。MOD = 1000000007 发现循环节是 222222224。MOD = 2222222227 发现循环节是 183120然后这个问题就解决了。不要问我为啥会出现循环节,我也不会证明。。。#include #include #include #include
2015-03-11 17:11:49 875
原创 HDU 2855 Fibonacci Check-up 构造矩阵
不得不承认智商真的被压制了。。其实开始的时候试过用二项式定理避开组合数的计算,不过没想到单位矩阵这个神奇的东西233。设有矩阵A,B,EE为单位矩阵。设新得到的矩阵为C,那么矩阵C的第一行第一列即为答案。#include #include #include #include #include #include #include #include #inc
2015-03-11 15:32:06 866
原创 2014级第一次选拔赛题解
A回 完全背包转01背包,01背包的二进制优化。对于N种商品,每种Mi件,收益为Pi,体积为Vi。可以看做有sigma(M)件这样的商品,每种商品只有要或不要两种状态,于是完全背包转化为01背包。此时的时间复杂度为O( sigma(Mi)*V ),二进制可以优化到O(sigma(log(Mi) )*V );对于[1,n]区间内的所有整数可以有2^0,2^1,.,2^i, 以
2015-03-08 15:18:21 939
原创 HDU 4565 So Easy! 矩阵快速幂
设(a+sqrt(b))^n为(Xn + Yn*sqrt(b)),那么显然有(a+sqrt(b))^(n+1) 为 (a*Xn + b*Yn + (aYn+Xn)*sqrt(b))。那么显然有(a+sqrt(b))的Xn,Yn可以表示为 :然后又会发现,(a-sqrt(6))^n可以表示为:那么会发现(a+sqrt(b))^n = (a+sqrt(b))^n + (a-
2015-03-04 10:45:32 885
原创 又见矩阵快速幂 模板贴起来
#include #include #include #include #include #include #include #include #include #pragma comment(linker, "/STACK:1024000000")#define EPS (1e-8)#define LL long long#define ULL unsigned lon
2015-03-03 16:18:48 691
原创 可重复覆盖的DLX
在精确覆盖的基础上只修改remove() 和resume() 就好了,每次选中一行,只把这一行对应的列以及这一行删除即可。很显然的,这样降低了矩阵缩小的速度,但是出现A*优化的补救方法,H()是在VJ上扒下来的,233。#include #include #include #include #include #include #include #include #inclu
2015-01-26 08:33:52 1186
原创 初涉关于精确覆盖的DLX
Dancing Links,跳动的舞者,的确是很飘的一种数据结构。DL是双向循环十字链表,其作用大体就是对精确覆盖算法的一种优化,在递归搜索的过程中利用链表容易删增的特性提高了精确覆盖算法的效率。强烈推一篇博客,讲述的很详细,弱就不多说了。http://www.cnblogs.com/grenet/p/3145800.html模板贴起来,自己写的有点挫。#i
2015-01-25 13:31:45 1025
原创 Codeforces 506D Mr. Kitayuta's Colorful Graph 并查集+水水的分类讨论+水水的离线预处理
首先读入所有的边与询问。将边按颜色分类。按颜色进行并查集,若此并查集内的点若此并查集内的点 > 100,则将与这些点相关的所有询问查一遍。那么时间复杂度为100*100/2*(M/100),或者为M/100*Q。极限的时候两种方法都在一亿左右了,而且每次还需要在map里搞一搞,还要查询是否联通,不知道为啥没有超时。。#include #include #include
2015-01-21 09:32:05 1067
原创 Codeforce 505D - Mr. Kitayuta's Technology 弱联通分量+拓扑排序
对于有向图M,若将其所有的边转化为无向边,则得到其基图M‘,若M’是联通的,则称有向图M是弱联通。对于有向图M,若图中任意两点u,v(u != v)均满足u到v可达,v到u可达,则称此图为强联通。根据以上定义显然可知,强联通图一定也满足弱联通。此题首先我们需要找到其所有的弱联通分量。对于每一个弱联通分量,设此弱联通分量内点的个数为ans,如果此联通分量无环,则需要的边数为ans
2015-01-20 17:14:01 1755
原创 Codeforces 55D Beautiful numbers 数位DP
自从去年4月份学姐教完我数位DP,还是第一次写出这么漂亮的代码,也是醉了。首先你要知道sum%(x*n) %x == sum%x,这样就可以在dfs的时候记录2到9的最小公倍数2540取余了。#include #include #include #include #include #include #include #include #include #pragma c
2015-01-19 20:47:42 755
原创 498C - Array and Operations 质因子分解+最大流
题目中说每一个good pair 都满足(u+v)%2 == 1,即一个奇数,一个偶数。首先我们要拿出一原点S,汇点T,S联到所有的num[odd]的质因子上,T联到所有的num[even]的质因子上,边的流量为num[i]中相应质因子的个数。再根据给出的,假设u为奇数,则从u的质因子上联到相等的v的质因子上,流量为INF。丢到模板里跑一遍就好了。#include #includ
2015-01-17 15:30:14 953
原创 Codefoeces 387E - George and Cards 贪心+线段树
首先要知道每次拿走最小才会达到最优,因为最小的不会给其他的提供任何加分,只有可能减小加分。删除卡片的次序确定了,剩下的就是确定每段区间的左右端点。pos[i] 表示数字 i 在初始序列中的位置。首先枚举i (i = 1 -> n),如果不需删除,则将pos[i]放入set S中,如果不需删除,则在S中二分查找上下界。总的时间复杂度为o( (n-k)*log(k) )
2015-01-17 08:31:33 822
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人