自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

转载 grep命令详解

转自:http://www.cnblogs.com/kuyuecs/archive/2012/07/13/2589988.html首先创建我们练习grep命令时需要用到的demo文件demo_file。$ cat demo_fileTHIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.this line is the 1st l

2015-07-31 21:54:18 414

转载 C++ set map list的正确删除元素方法

转自:点击打开链接STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。      在使用 list、set 或 map遍历删除某些元素时可以这样使用:正确使用方法1      std::list List

2015-07-29 10:00:36 6060

转载 命令行执行程序时int argc,char *argv[ ]的意义

转自:http://blog.csdn.net/sircarfield/article/details/6969840argc,argv 用命令行编译程序时有用。  主函数main中变量(int argc,char *argv[ ])的含义  我们平时定义主函数时通常的写法为:int main( )或void main( )  其实,int main( ) 只是 UNIX 及 Li

2015-07-28 23:12:07 771

转载 数字输入输出挂

int Scan(){ int res=0,ch,flag=0; ch=getchar(); while(ch=='\n'||ch==' ') ch=getchar(); if(ch=='-') flag=1; else if(ch>='0'&&ch<='9') res=ch-'0'; while((ch=getch

2015-07-28 11:31:15 404

原创 Codeforces 555C. Case of Chocolate (SET应用)

对于U的操作,能到达的y的上界和x值大于它最接近的操作的y的上界是一样的:1.如果是L的操作,上界就是那个L操作的y值。2.如果是U的操作,上界就是这次U操作所能到达的上界。对于L的操作,则是找y值大于它最近的操作。所以建立两个map U,L,一个key值是x,一个是y,因为map的lower_bound是按照key值查找的。对于U操作,结束后U要插入pair(

2015-07-28 10:17:27 639

原创 Codeforces 557D - Vitaly and Cycle (DFS染色)

很容易想到最多只需要添加3条边。1.如果M==0,那么任选三个点连接3条边2.如果所有连通分量大小均小于等于2,那么任选一个连通分量和一个点连2条边3.如果本身存在奇圈(DFS过程中父节点和子节点颜色一样),那么答案是0 14.除此以外所有情况均可以只连一条边。把图在DFS的过程中按照一黑一白染色,那么同一连通分量中的相同颜色的点连线均可构成奇圈。所以DFS时维护一下黑

2015-07-27 10:31:02 491

原创 557C - Arthur and Table (前缀和)

如果选择L为最后的最长长度,那么大于L的桌腿必须全去除。然后假如此时剩下M条桌腿,长度L的桌腿有num[L]条,如果tmp=num[L]*2-1-M0,就需要在小于L的腿中选择tmp条花费最小的桌腿。首先把桌腿按长度排序然后预处理前缀和,这样后可以O(1)得到大于L的桌腿的总代价。然后因为代价的最大值才200,那么维护小于L的每种代价桌腿的数量,按照计数排序的方法选择桌腿去除,再维

2015-07-26 13:35:22 913

原创 Codeforces 558D - Guess Your Way Out! II (求区间交,并)

题中给出的每一个区间都可以转化为叶子那层的一个区间,所以步骤就是:1.对于所有ans=1的区间求区间交,方法很简单就是两个l取最大值,r取最小值,最后答案一定在这里面。2.对于ans=0的区间,求区间并的补集。方法是用一个pair,对每个区间的左端点附加信息-1,右端点附加信息1,排序后从左往右扫,累加这个附加信息,当累加和等于0时,说明在该点前的所有区间都结束了,那么从这个点到下一个区间

2015-07-26 11:29:07 640

原创 Codeforces 558C - Amr and Chemistry (枚举)

枚举每个数乘二和除二过程中所能到达的所有数,并记录到达时的步数,最后统计在所有数都能到达的数字中步数和最小的数字。因为只有*2和/2的操作,所以往大往小都是log级的。注意,如果一个数是奇数,那么它本身一直乘二所能到达的数字,和它除2向下取整再一直乘二所能到达的数字是完全不相同的。因为在二进制下除二后相当于左移把末尾的1弄没了,以后再右移时前缀都不一样了。所以在向下除的过程中每次遇到奇数都

2015-07-24 12:21:12 844

原创 Codeforces 559C Gerald and Giant Chess(DP+乘法逆元求大组合数)

先把黑块按坐标排序。dp[i]表示到第i个黑块且之前没有经过黑块的方案数,那么每一个dp[i]中的方案都是完全不相同的。递推的方法是dp[i]=C(xi+yi,xi)-sum(dp[j]*C(xi-xj+yi-yj,xi-xj))  (jdp[j]*C(xi-xj+yi-yj,xi-xj)就是从1,1经过第j个黑块到i的路径数,用总路径数减去所有的这些不合法的路径数就是dp[i],(剪去的

2015-07-24 10:30:25 1244

原创 minisat 安装指南

以下操作均需要在linux环境下执行。首先到http://www.minisat.se/MiniSat.html下载minisat-2.2.0.tar.gz这个安装包,并解压缩,可以看到压缩包中有一个README,其中就包含了安装方法:1.进入解压缩后的文件夹2.export MROOT=文件夹所在路径    //这句的意义是声明一个环境变量保存文件夹路径,下面的make命令会调用这个

2015-07-23 23:07:52 5241 2

原创 POJ 2112 Optimal Milking (网络流+二分)

首先floyd求出任意两点间最短路。然后二分路径长度的最大值。 每次二分中:1对于所有长度小于等于这个最大值的 从奶牛到机器的路径,建一条流量为无限的边。2.再从源点到每头牛建一条流量为1的边。3.从每个机器到汇点建一条流量为M的边最后看看最大流是否等于C,等于则这个最大值合法。注意: 若输入数据中不同两点间距离为0,表示的是到达不了。代码:#inc

2015-07-23 11:49:09 397

原创 HDU 5294 Tricks Device (最短路上的最小割) 2015多校训练1007

首先要求出1到N的所有最短路,第一问等于至少去掉多少条边使所有最短路断掉,第二问就是M-最短路中边数最短的路径边数。求最短路用Dijkstra即可,维护每个节点的父节点(用vector)。然后dfs对于每条边在网络流中建一条流量为1的边,最后跑一个最大流(即最小割)即可。注意:1.向函数里传对象时要加&(引用)2.dfs时要用记忆化,保证每条边走一次,否则会重复添加网络流中的边!!

2015-07-22 20:55:38 498

原创 POJ 2823 Sliding Window(单调队列)

单调队列模板题。单调队列有两个性质:1.数值大小单调     2.队列元素位置单调插入查询的规则是,如果要求最小值,那么队列要从小到大排序,结果在队头。求最大值则相反。这是因为插入时要满足性质2,所以只能插在队尾,那么新元素要替换的值应该是比它大的,所以队列整体要从小到大排,才能保证大的数都在队尾一侧,实现查询最小值。插入时替换比它大的数的理由是,对于新的数,因为位置大于老的数,从

2015-07-22 13:28:14 428

转载 单调队列详解

转自Jason Damon点击打开链接  他的分析非常到位,顺便把单调队列给学了。很好,所以转了他的这篇文章。程序是我后来理解之后自己写的。看这个问题:An array of size n ≤ 106 is given to you. There is a sliding window of size k which is moving from the ver

2015-07-22 12:10:55 1593

原创 POJ 3250 Bad Hair Day(单调栈)

用一个栈来维护当前的递减序列,从左到右遍历,对于每个数cur,从栈顶开始把所有小于等于cur的数字都出栈,然后剩下的就都是可以看到cur的牛,并且保证了栈中的单调性。每次遍历对弹栈后的长度求和即可。代码:#include #include #include #include #include using namespace std;#define LL long lon

2015-07-22 12:09:50 427

原创 HDU 5289 Assignment (二分+RMQ) 2015多校训练一 1002

假设右端点r固定,那么如果能找到离得最远的一个l,使l到r满足要求,那么[l+1~r],[l+2~r].....都满足要求。所以可以枚举右端点,去找最远的满足条件的左端点,使满足条件,答案就是把这些长度求和。因为序列是静态的,所以可以用ST算法在log n时间求出任意区间内的最大,最小值,然后用这些值二分求解最远的l。代码:#include #include #includ

2015-07-22 11:19:13 447

原创 HDU 5288 OO’s Sequence (二分)2015多校训练一

本题可以转化为对于每个数,求它向左向右分别能延伸多远直到遇到它的第一个因子,这个数的贡献就是这两个数相乘。数字最大只有10000,用10000个vector记录每个数字的位置。然后遍历原始序列,对于第i个数,枚举它的所有因数(这个预处理),二分分别搜索这个因子在i左边最近的和右边最近的两个位置lp,rp。然后对于所有因子产生的这些lp,rp,求一个最小的区间交,就是第i个数左右能延

2015-07-22 11:10:55 485

转载 LCA(最近公共祖先)离线算法Tarjan

转自ACer_FInd点击打开链接LCA(最近公共祖先)离线算法Tarjan+并查集LCA问题:给出一棵有根树T,对于任意两个结点u,v求出LCA(T, u, v),即离根最远的结点x,使得x同时是u和v的祖先。    把LCA问题看成询问式的:给出一系列询问,程序应当对每一个询问尽快做出反应。对于这类问题有两种解决方法;

2015-07-21 10:51:38 914 1

转载 scanf格式化输入详解

转自点击打开链接scanf函数,与printf函数一样,都被定义在stdio.h里,因此在使用scanf函数时要加上#include。它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中,其关键字最末一个字母f即为“格式”(format)之意。[编辑本段]scanf函数的一般形式  scanf(格式控制,地址表列)  int scanf(char *for

2015-07-20 13:11:09 3558

原创 HDU 3836 Equivalent Sets(强连通分量 Tarjan缩点)

Tarjan求强连通分量详解在前一篇文章把一个有向图变为强连通分量至少要加几条边?Tarjan缩点后,设a为入度为0的点数,b为出度为0的点数,答案max(a,b)。注意:如果图本来是强连通的,要特判为0,否则输入会为1代码:#include #include #include using namespace std;#include #include

2015-07-19 11:56:58 474

转载 有向图的强连通分量 Tarjan算法

转自BYVoid点击打开链接[有向图强连通分量]在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。下图中,子图{1,2,3,4}为一个强连通分量

2015-07-19 11:55:02 517

原创 POJ 3352 Road Construction (边双连通分量 Tarjan缩点)

本题详解在前面一篇文章Tarjan缩点的含义:low值相等的点在一个双连通分量中,把一个分量看成一个点,重构成一棵树定理:对于一棵叶子节点数为n的树,需要加(n+1)/2 条边把它变成双连通的。因此本题缩完点之后求一下这个值就是答案。对于有重边的边双连通分量,如果从u点有两条边到它的father,那么dfn[fa]也可以用来更新lowu。下面这个模板可以处理有重边的情况。

2015-07-19 10:59:23 504

转载 Tarjan算法求至少要添加几条边才能使无向连通图变为边双连通图。

转自:点击打开链接给定一个连通的无向图G,至少要添加几条边,才能使其变为双连通图。        模型很简单,正在施工的道路我们可以认为那条边被删除了。那么一个图G能够在删除任意一条边后,仍然是连通的,当且仅当图G至少为双连通的。       PS:不要问我为什么不是3-连通、4-连通...人家题目问“至少添加几条边”好不...        显然,

2015-07-18 12:18:36 1482

原创 HDU 3123 GCC(递推)

注意如果n>=m,那么n!%m=0,所以n如果大于m了就直接等于m。然后n!%m到(n+1)!%m是可以线性递推的。atoi把字符串转为数字,在中。代码:#include #include #include using namespace std;#include #include int main(){ int T; scanf("%d

2015-07-18 09:51:53 482

原创 POJ 2406 Power String(KMP)

len-f[len]为最小覆盖子串长度。如果能整除len答案就是商,否则答案是1。代码:#include #include #include using namespace std;char s[1000005];int f[1000005];void getfail(){ int len=strlen(s); f[0]=f[1]=0; f

2015-07-17 15:09:57 372

原创 HDU 4763 Theme Section (KMP)

先KMP求出f数组。然后令j等于f[len],在j沿着失配边走到0的路径上(即一直j=f[j]),每个节点都代表了一对相同的前后缀,且长度为f[j]。这些对前后缀都可能是答案子串,再用kmp算法在中间找这个子串存不存在即可。注意,子串长度会越来越小,而且一定包含于之前判断过的子串中(因为起点一样)。所以若前一个子串在l到r区间不存在,那么下一个子串也一定不存在。这样记录已扫描区

2015-07-17 14:16:28 403

原创 HDU 3336 Count the string(KMP)

KMP中的f数组相当于一个状态机。我们如果能求出处理到第i个字符时,有多少从第1个字符开始的前缀和以i为结尾的后缀完全相同,那么扫一遍这个串然后求和就行了。从第1个字符开始的前缀和以i为结尾的后缀和f数组意义很像,当沿着失配边一直走(j=f[j]),到0之前,经过多少个节点就是有多少个前缀等于后缀。所以递推维护每个f[i]到0之间有多少节点。然后扫一遍。代码:#incl

2015-07-17 12:23:38 334

原创 HDU 3746 Cyclic Nacklace(KMP最小覆盖子串)

KMP求出f数组后,最小覆盖子串为长度为len-f[len]的前缀。证明在前面的文章里。代码:#include #include #include using namespace std;char c[100005];int T;int f[100005];int main(){ scanf("%d",&T); while(T--){

2015-07-17 10:56:45 458

原创 HDU 2594 Simpsons’ Hidden Talents (KMP的F数组应用)

KMP中f数组意义:对于模式串的前i个字母构成的子串,这个子串会有一些前缀和后缀完全相同(包括长度),f[i]表示的就是这个最大的长度,而长度确定了前缀后缀就确定了。对于这个题,如果将s1,s2连接成一个串c,c的长度为lc,那么f[lc]就是题目中要求的最大长度。注意如果f[lc]大于la或lb,那么要修改成la和lb中的最小值lmin,至于为什么一定存在长度为lmin的相同前后

2015-07-17 10:38:23 363

原创 POJ 2815 Milking Grid(KMP)

一个字符串的最小覆盖子串长度等于len-next[len]证明:http://blog.csdn.net/fjsd155/article/details/6866991 先算出每一行的最小覆盖长度,然后所有行的最小覆盖长度就是这些数的最小公倍数,设为r。因为列和行相互独立,所以同样处理。最后结果就是l*r注意:如果r>R 那么将r设为R,

2015-07-16 08:43:13 589

转载 为什么KMP算法中n-next[n]的前缀为最小覆盖子串

转自:点击打开链接 我对KMP的一些理解(lyp点拨的):pre[i](或next[i])的实质是串str[1..i]的最长且小于i的“相等前、后缀”分别为str[1..pre[i]](前缀)与str[(i-pre[i]+1)..i](后缀),通俗讲就是:使str[1..i]前k个字母与后k个字母相等的最大k值。KMP算法详解可见:http://blog.csdn.net/fjsd15

2015-07-15 16:50:31 628

转载 Matrix67的KMP讲解

转自:Matrix67如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段。    我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP算法是拿来处理字符串匹配的。换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串)。比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串。

2015-07-15 16:07:32 1100

转载 非常系统的KMP\MP算法讲解

包含KMP和MP算法的区别,解决了大白书上的问题点击打开链接

2015-07-14 13:19:37 1853

原创 HDU 1724 Ellipse (自适应辛普森公式)

自适应simpson裸题自适应辛普森:simpson公式这样估计一段积分的值:对于F函数,a到b这一段的积分近似等于S(period)=(F(a)+F(b)+4*F(mid))/6*(b-a),即认为近似为一个常数积分,常数等于(F(a)+F(b)+4*F(mid))/6,其中mid=(b-a)/2。如果F函数波动剧烈,这个估计方法会很不准。所以自适应辛普森会自动在波动

2015-07-14 11:03:33 1342

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除