随笔 - 386
文章 - 0
评论 - 21
阅读 -
21万
02 2014 档案
HDU 1176 免费馅饼(DP)
摘要:点我看题目题意 : 中文题。在直线上接馅饼,能接的最多是多少。思路 :这个题其实以前做过。。。。。你将这个接馅饼看成一个矩阵,也不能说是一个矩阵,反正就是一个行列俱全的形状,然后秒当行,坐标当列,这也就是转化成了数字三角形问题,从下往上找最大路径。下边这个图正好是某位大神的,让我不厚道的截过来了。。。。注意一下边界。第0秒5(这里的数字指的是第N秒可能到达的位置坐标)第1秒4 5 6第2秒3 4 5 6 7第3秒23 4 5 6 7 8第4秒1 2 3 4 5 6 7 8 9第5秒0 1 2 3 4 5 6 7 8 9 10第6秒0 1 2 3 4 5 6 7 8 9 10第7秒.......
阅读全文
HDU 1059 Dividing(多重背包)
摘要:点我看题目题意: 将大理石的重量分为六个等级,每个等级所在的数字代表这个等级的大理石的数量,如果是0说明这个重量的大理石没有。将其按重量分成两份,看能否分成。思路 :一开始以为是简单的01背包,结果写出来之后不对,因为以为从头开始往上加就行了,看能不能满足那个标准,后开才反应过来,还可以跳着加呢,让YN美女给我讲了一下,然后不小心手残了一下交了两遍WA之后终于AC了,其实就是用一个数组c来标记状态,c[i]表示 i 这个重量是可以用目前的石头表示出来的。而b数组表示的是这种石头的使用次数,也代表着用了几个了。#include #include #include using namespace
阅读全文
HDU 1058 Humble Numbers
摘要:点我看题目题意 : 定义Humble Numbers为因子中除2,3,5,7外没有别的因子了(当然因子1不包括在这里边),然后给你一个数,让你求出第n个Humble Numbers是什么。思路 :这个主要是求Humble Numbers麻烦点,你要一点点的往上乘,因为反正这些数都是只由2 3 5 7相乘而成,你就从头开始往上乘2,3,5,7就行了。。。。其实我一点没看出来这个和DP什么关系。。。。////HDU 1025////#include //#include //#include ////using namespace std;////int dp[505000] ;//int B[5
阅读全文
HDU 1025 Constructing Roads In JGShining's Kingdom(DP+二分)
摘要:点我看题目题意 :两条平行线上分别有两种城市的生存,一条线上是贫穷城市,他们每一座城市都刚好只缺乏一种物资,而另一条线上是富有城市,他们每一座城市刚好只富有一种物资,所以要从富有城市出口到贫穷城市,所以要修路,但是不能从富有的修到富有的也不能从贫穷的修到贫穷的,只能从富有的修到贫穷的,但是不允许修交叉路,所以问你最多能修多少条路。题意 :这个题一开始我瞅了好久都没觉得是DP,后来二师兄给讲了一下才恍然大悟。其实就是用到了DP中的那个最长上升子序列,把题中贫穷城市的坐标当成数组的下标,跟其相连的富有城市的坐标当作数组的值,这样的话,因为不能有交叉,所以只能一直往右,这就好比找最长上升子序列,因为
阅读全文
HDU 1003 Max Sum(DP)
摘要:点我看题目题意 : 就是让你从一个数列中找连续的数字要求他们的和最大。思路 : 往前加然后再判断一下就行。#include #includeusing namespace std;int main(){ int n,start,end; cin>>n; int m ; for(int k = 1 ; k >m; int max = -1001,sum = 0,flag = 1; for(int i = 0 ; i >ch ; sum += ch; if(sum > max) {...
阅读全文
POJ 3368 Frequent values(RMQ)
摘要:点我看题目题意 : 给你一个非递减数列,然后给你一个范围x到y,让你找出从x位置到y位置上,某个数字出现次数最多的那个数字的次数。。。。。思路 :其实我一开始没觉得用RMQ简单,而且我也没想到怎么用RMQ。。。。。听会神讲了才会了。就是找一个数组保存从前边到这个数为止这个数出现的次数,然后再用RMQ,最后判断的时候要把这个范围一上来的那个数字先给去掉,因为你不知道他前边还有没有,所以容易多算上,最后再判断这区间跟后边那些谁多就OK了。#include #include #include #include const int maxn = 101000 ;int a[maxn],data[max
阅读全文
POJ 3264 Balanced Lineup(RMQ)
摘要:点我看题目题意 :N头奶牛,Q次询问,然后给你每一头奶牛的身高,每一次询问都给你两个数,x y,代表着从x位置上的奶牛到y位置上的奶牛身高最高的和最矮的相差多少。思路 : 刚好符合RMQ的那个求区间最大最小值,所以用RMQ还是很方便的。就是一个RMQ的模板题,基本上书上网上都有。RMQ基础知识RMQ...
阅读全文
POJ 1195 Mobile phones(二维树状数组)
摘要:点我看题目题意 : 4条命令,0代表开始,在整组样例里肯定只有第一条是0,0后边的数字代表的矩阵的大小为n*n,1 x y z代表着将z加到(x,y)这个格子上去,2 l b r t代表着,让你求出从(l,b)到(b,r)所包含的矩形中包含的移动电话的数量。思路 :当时看书的时候我就看到二维数组了,一看这个题我就想到了用二维,二维其实和一维差不多,这个就是个模板题。不过依然要注意的是树状数组是从1开始的,所以输入之后要+1以防从0开始。#include #include #include using namespace std;const int maxn = 4123 ;int tree[1
阅读全文
POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)
摘要:点我看题目题意 :N个村子连成一条线,相邻的村子都有直接的地道进行相连,不相连的都由地道间接相连,三个命令,D x,表示x村庄被摧毁,R ,表示最后被摧毁的村庄已经重建了,Q x表示,与x直接或间接相连的村庄有多少个,当然包括他自己。思路 :这是一道用线段树,树状数组,还有STL都可以做的题。。。。...
阅读全文
POJ 2750 Potted Flower(线段树的区间合并)
摘要:点我看题目链接题意 : 很多花盆组成的圆圈,每个花盆都有一个值,给你两个数a,b代表a位置原来的数换成b,然后让你从圈里找出连续的各花盆之和,要求最大的。思路 :这个题比较那啥,差不多可以用DP的思想来解决这个问题,你在某个地方将这个环断开,因为线段树无法建成环形的。然后再去找那个最大值。将这个序列分成两部分,先求左边的最大连续和a,再求右边连续和b,但是由于他们中间相连的那部分,就是左部分的最右边的连续最大和x加上右部分的最左边的连续最大和y加起来可能比ab都大,但分开的话可能并没有a或b大。所以要进行区间合并,将y并到左边去,或者将x并到右边去,但本身那个边界不变#include #inc
阅读全文
POJ 2886 Who Gets the Most Candies?(反素数+线段树)
摘要:点我看题目题意 :n个小盆友从1到n编号按顺时针编号,然后从第k个开始出圈,他出去之后如果他手里的牌是x,如果x是正数,那下一个出圈的左手第x个,如果x是负数,那出圈的是右手第-x个,游戏中第p个离开的孩子得到的糖果是f(p)个,f(p)是p的约数的个数。思路 : 因为f(p)是p的约数的个数,所以,要用到反素数,反素数的定义及求法。反素数s的约数个数比小于它的数的约数个数都多,最大反素数就是要找到的那个得到糖果最多的人。线段树记录的是还剩多少 人未出列。#include #include #include using namespace std;const int maxn = 506000
阅读全文
POJ 2409 Let it Bead(Polya定理)
摘要:点我看题目题意 :给你c种颜色的n个珠子,问你可以组成多少种形式。思路 :polya定理的应用,与1286差不多一样,代码一改就可以交。。。。POJ 1286题解#include #include #include #include #include using namespace std;int gcd(int a,int b){ return b > 0 ? gcd(b,a%b) : a ;}int main(){ int c,s ; while (scanf("%d %d", &c, &s) != EOF) { if(c == 0 &&a
阅读全文
POJ 1286 Necklace of Beads(Polya定理)
摘要:点我看题目题意 :给你3个颜色的n个珠子,能组成多少不同形式的项链。思路 :这个题分类就是polya定理,这个定理看起来真的是很麻烦啊T_T.......看了有个人写的不错:Polya定理:(1)设G是p个对象的一个置换群,用k种颜色突然这p个对象,若一种染色方案在群G的作用下变为另一种方案,则这 两个方案当作是同一种方案,这样的不同染色方案数为:;(2)置换及循环节数的计算方法:对于有n个位置的手镯,有n种旋转置换和n种翻转置换.对于旋转置换: c(fi) = gcd(n,i) i为一次转过i颗宝石(i = 0 时 c=n;);对 于翻转置换:如果n为偶数:c(f) = n/2 的置换有n/
阅读全文
HDU 1394 Minimum Inversion Number(线段树的单点更新)
摘要:点我看题目题意 :给你一个数列,a1,a2,a3,a4.......an,然后可以求出逆序数,再把a1放到an后,可以得到一个新的逆序数,再把a2放到a1后边,,,,,,,依次下去,输出最小的那个逆序数。思路 :用线段树就是查找比当前这个数大的已存入线段树中的个数。比如求a[i],那么就查找当前线段树(a[i]+1,n)中的个数。。然后把a[i]更新到线段树中。。求逆序数的时候法,当把x放入数组的后面,此时的逆序数应该为x没放入最后面之前的逆序总数加上(n-x)再减去(x-1);sum = sum+(n-x[i])-(x[i]-1)。这个破题让我很晕的地方,一开始我没注意的是,输入的数据大小是
阅读全文
POJ 1778 All Discs Considered(拓扑排序)
摘要:点我看题目题意 :其实题意我也说不清楚,因为比赛的时候我盯着看了1个小时也没看懂。。。。就是两个磁盘,第一个有n1的安装包,编号为1~n1,第二个有n2个安装包,编号为n1~n2。给你d对关系,(x,y)代表着安装x之前要先安装y。然后让你往里插入这两个磁盘,因为一次只能插一次,所以要满足他给的条件的时候要频繁的来回换。还有,要注意的一点是,无论先往里边插第一个还是第2个,第一次插的时候算一次,最后一次拔的时候算一次。思路 :其实我真不知道这是拓扑排序,,,,,后来才知道的。。。。。//#include //#include //#include //#include ////const in
阅读全文
SDUT 2351 In Danger
摘要:点我看题目题意 : 有n个兵想要自杀,所以他们决定围成一个圈,从1开始一直环到n,然后每第2个开始自杀,但是有一个兵不想死,所以让你编程求出最后一个应该死的人的位置,这样的话就剩他自己他可以不自杀了,也就是说如果是5个人的话,第2个位置的人自杀,然后再第2个,就是第4个位置的人自杀,然后再第2个,应该是第一个位置的人自杀,然后是5,最后剩了第三个位置的人。思路 : 好像约瑟夫环问题,不过这个有点小难,就是找规律,一开始不知道,后来YN美女说让我自己画画,然后我就从5画到14,这结果是3 5 7 1 3 5 7 9 11 13 。我就没再画下去,我也没找出规律来,刚巧前几天做CF的时候有一道题可
阅读全文
SDUT 2352 Run Length Encoding
摘要:点我看题目题意 :将给定的字符串编码,编码的规则根据两条,1.如果字符串里有连续相等的字符,就变为两个字符,一个是这些连续相同的字符的个数,另一个是这个字符,但是如果数量超过了9个,那就输出9再输出这个字符,剩下的重新按照规则进行,例如AAAA,就输出4A,AAAAAAAAAAA输出9A2A,2.如果字符串里有连续不相等的字符,就将这些字符原样输出并且在前后各加一个1,如果字符串里有刚好有个1,就将这个1变为11,AAAABCCC输出4A1B13C,123444输出11123134,1111111111输出911111。思路 :就是一道顶麻烦的题,如果不好好读题的话,就很难办,因为有很多细节问
阅读全文
POJ 2528 Mayor's posters(线段树)
摘要:点我看题目题意 :建一堵墙粘贴海报,每个候选人只能贴一张海报,海报的高度与墙一样高,一张海报的宽度是整数个单位,墙被划分为若干个部分,每个部分的宽度为一个单位,每张海报完全的覆盖一段连续的墙体,墙体的宽度占整数个单位。因为候选人将海报贴到墙上的时候可能会将别人的覆盖或覆盖一部分,给出海报的大小,选举墙上张贴的位置,和张贴的次序,然后问你最后还能看到几张海报。思路 : 这个墙因为有10000000单位长,而n最大有10000,所以要先进行离散化,但是离散化之前要先将数字存起来,排序之后再将每相邻的两个数之间一个数加入离散的数组,离散化的处理 :先将n张海报的左边界,右边界中间位置存储在数组x里,
阅读全文
CF Codeforces Round #231 (Div. 2)
摘要:http://codeforces.com/contest/394话说这次CF做的超级不爽,A题一开始交过了,我就没再管,B题还没看完呢,就死困死困的,后来觉得B题枚举一下估计能行,当时是觉得可以从后往前乘,但是细节什么的都没想好,所以干在纸上画也没写出什么来。没想到我A题竟然忘了一种情况,就是+前就一根的时候,郁闷死我了。A Counting Sticks#include #include #include #include using namespace std ;int main(){ char sh[5200] ; while(~scanf("%s",sh)) {
阅读全文
POJ 3321 Apple Tree(树状数组)
摘要:点我看题目题意 : 大概是说一颗树有n个分岔,然后给你n-1对关系,标明分岔u和分岔v是有边连着的,然后给你两个指令,让你在Q出现的时候按照要求输出。思路 :典型的树状数组。但是因为没有弄好数组,所以要用DFS先映射一下,好吧我承认我说不下去了,六级没过,CF又掉了100多分,脑子完全不转转了。。。。。。#include #include #include using namespace std;const int maxn = 500004 ;int head[maxn],start[maxn] ,num[maxn],data[maxn];int m,n,cnt ,cntt;bool vis
阅读全文
POJ 3468 A Simple Problem with Integers(线段树)
摘要:点我看题目题意 :N个数Q条命令,Q a b代表输入Aa,Aa+1, ... ,Ab的和。Cabc代表让你把c加给Aa,Aa+1, ... ,Ab的每一个数。思路 :这个题分类好像不是线段树。。不过我硬是按线段树的方法做了,总觉得和HDU1166和1754差不多,反正要注意数据范围很大不能用int,我还因为用了intWA了一次。反正比平时那些模板的更新啊加减什么的都比较麻烦。#include #include #include using namespace std;const int maxn = 5000004 ;typedef long long LL;struct node{ ...
阅读全文
HDU 1754 I Hate It(线段树)
摘要:点我看题目题意 :又是一道中问题,我就不说题意了。。。。思路 : 线段树,这道题跟1166差不多,改一些地方就差不多了。#include #include #include #include using namespace std;const int maxn = 500005 ;int a[maxn] ;int ans ;struct node{ int l,r,value ;} Node[4*maxn] ;void build(int v ,int l,int r){ Node[v].l = l ; Node[v].r = r ; Node[v].value = 0...
阅读全文
HDU 1166 敌兵布阵(线段树 单点更新)
摘要:点我看题目题意 :HDU的中文题也不常见。。。。这道题我就不详述了。。。。。思路 :这个题用线段树用树状数组都可以,用线段树的时候要注意输入那个地方,输入一个字符串的时候不要紧接着输入两个数字,因为我就是这样贡献了好几个RE。。。。不要用cin,cout,因为也是这样我又贡献了好几个TLE。。。。血...
阅读全文
POJ 2828 Buy Tickets(线段树)
摘要:点我看题目题意 :说实话,看题的时候根本没怎么看懂,每个单词我倒是认识,但是拼一块儿我觉得就有点拗口了,一开始我以为的站右边是以为队伍如果画出来应该是上下的,谁知看了底下的那个样例解释才知道原来队伍时左右的,,,难怪说插到右边呢。。。。大概题意就是,队列中的每个人都被赋一个特定的值,给出所有插队的人及他们插队后他们所站的位置信息,然后输出队列中的人的最终的排列顺序。思路 :首先处理数据,不要从前往后处理,从后往前处理,因为后边的人是会影响前边的人的位置的。用线段树的每个结点记录这个区间中的空位置数,每次插入的时候将这个人放在第pos[i]个空格的地方,因为后边的人如果排在前面人的前面,那么我们
阅读全文
POJ 2352 Stars(树状数组)
摘要:点我看题目题意 : 给你若干个星星,然后给出你每个星星的坐标(按照y递增的顺序给出,若是y相同就按照x递增的顺序给出),定义所谓的星星级别为横纵坐标不超过自己的星星的个数。问级别0到n-1的星星各有多少个。思路 :因为当前的星星与后面的星星没有关系,所以只要把x之前的横坐标加起来就行,树状数组模板题,但是树状数组下标是从1开始的,所以x要加1。#include #include #include using namespace std;const int maxn = 100000 ;int tree[maxn+10] ;//树状数组inline int lowbit(int x)//lowb
阅读全文
Codeforces Round #230 (Div. 2) C Blocked Points
摘要:题目链接题意 : 给你一个半径为n的圆,圆里边还有圆上都有很多整点,让你找出与圆外的任意一个整点距离等于1的点。思路 :这个题可以用枚举,画个图就发现了,比如说先数第一象限的,往下往右找,还可以找规律,看到神代码就4行,我十分佩服数学学的特别好的人。。。。大神博客地址下边这个是枚举的代码,也很简单。#include#include#includeusing namespace std;#define LL __int64LL dis(LL x,LL y){ return x*x+y*y;}int main(){ LL n; LL i,s; while(~scanf("%...
阅读全文
POJ 3308 Paratroopers(最小割EK)
摘要:题目链接题意 : 有一个n*m的矩阵,L个伞兵可能落在某些点上,这些点的坐标已知,需要在某些位置安上一些枪,然后每个枪可以将一行或者一列的伞兵击毙。把这种枪安装到不同行的行首、或者不同列的列首,费用都不同。现在已知把激光枪安装到任意位置的费用,总的花费为这些安装了激光枪的行列花费的乘积。思路 :就是一个最大流问题。Dinic我不会,用的白皮书上的EK算法,嗯,还行,这个建图比较麻烦,就是把行列分开,成为m+n+1个点。嗯,不废话了,还是把大神博客链接弄过来吧,各方面都讲得很详细。#include #include #include #include #include using namespa
阅读全文
POJ 3352 Road Construction (边双连通分量)
摘要:题目链接题意 :有一个景点要修路,但是有些景点只有一条路可达,若是修路的话则有些景点就到不了,所以要临时搭一些路,以保证无论哪条路在修都能让游客到达任何一个景点思路 :把景点看成点,路看成边,看要加几条边使这个图变成双连通图。一开始我以为只要求出桥的个数,然后在每个桥的地方加一条边就行了,后来发现不是。例如:这个图中,桥有4条,但实际上只需要在1跟10,10跟9中间加两条边就行了。所以,实际上这个题是先进行缩点,然后求缩点后的图至少增加几条变能够变成双连通图。缩点之后构建成一颗树,所有的边都是桥,根据定理,任意一颗树,要想成为双连通图,则需要增加的边数为(这棵树上所有度数为1的结点的个数+1)
阅读全文
POJ 3114 Countries in War(强联通分量+Tarjan)
摘要:题目链接题意 : n个城市,给出你m个关系,代表这城市x到城市y需要h小时,但如果两个城市是联通的,则耗时变为0,给你两个城市的编号,问你从前一个城市到后一个城市需要花费多长时间。思路 :我能说这个代码我直接将3592的代码一改就是这个了,那个求最长路,这个求最短路,把松弛那块儿改一下就行。反正先建...
阅读全文
POJ 3592 Instantaneous Transference(强联通分量 Tarjan)
摘要:http://poj.org/problem?id=3592题意 :给你一个n*m的矩阵,每个位置上都有一个字符,如果是数字代表这个地方有该数量的金矿,如果是*代表这个地方有传送带并且没有金矿,可以传送到指定的位置,如果是#代表该位置不可走,初始位置在左上角,只能向下或向右走,并且走到传送带的时候可选择是否传送。问当走出去的时候能获得的最大近况数是多少。思路 :先将二维矩阵转化成一维的点建图,可以向下向右建图,而且传送带也可以建边,缩点之后再建边,最后用spfa求最长路。#include #include #include #include using namespace std;const
阅读全文
POJ 2186 Popular Cows(Tarjan)
摘要:http://poj.org/problem?id=2186题意 :给你n头牛,m对关系,每对关系由两个编号组成,u和v代表着u认为v是受欢迎的,如果1认为2是受欢迎的,2认为3是受欢迎的,那1认为3也是受欢迎的。思路 :强联通分量的Tarjan做法,将这些牛之间的关系看成一个有向图,最受欢迎的那个牛的那个点一定是出度为0的点。Tarjan的基本资料:http://hi.baidu.com/lydrainbowcat/item/1c664b662b1a1692c4d2491c#include #include #include #include #include #include using
阅读全文
POJ 1404 I-Keyboard (DP)
摘要:http://poj.org/problem?id=1404题意 :手机上的要发短信的话,“我”字需要先按一下9键,再按3下6键,所以,现在想要重新布局每个键上的字母数,让最后的那个值最小,也就是说给你L个字母出现频率,让你将其分布在K个键上,字母顺序不可以变,每个字母出现的频率乘上他所在键的位置,再加总和最小即可。如果有多个解,尽量将字母往后边的键安排。思路 :表示比赛的时候根本没看出这是DP,没反应过来,比完了才知道。。。这道DP不太好想,正好看了一个大神的博客,http://www.cnblogs.com/skyivben/archive/2011/11/09/2243068.html
阅读全文
SDUT 1646 Complicated Expressions
摘要:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1646题意 : 话说我根本没读题,,,因为实在是太长了,我去看了输入输出才知道题讲的什么,大意是说给你一串运算式,里边包含了很多的多余的括号,让你去掉那些多余的括号,但是不能改变原来的式子中字母和运算符的位置。思路 :比赛的时候根本没做出来,当时并没有什么思路,一开始是单纯的以为模拟,但是想了想又不太是,所以没敢去做,这个题最重要的就是找到运算符的优先级,然后才能进行操作,所以可以先去掉所有的括号,然后再在合适的位置往上填括号即可。先将题目中的
阅读全文
C语言中随机数的生成
摘要:刚好在找这方面的资料,看到了一片不错的,就全文转过来了,省的我以后再找找不到。 在C语言中,可以通过rand函数得到一个“伪随机数”。这个数是一个整数,其值大于等于0且小于等于RAND_MAX。rand函数和常量RAND_MAX都定义在库stdlib.h之中,这意味着必须在头文件中包含库stdlib
阅读全文
POJ 3007 Organize Your Train part II(哈希链地址法)
摘要:http://poj.org/problem?id=3007题意 :给你一个字符串,让你无论从什么地方分割,把这个字符串分成两部分s1和s2,然后再求出s3和s4,让你进行组合,看能出来多少种不同的形式。思路 :记得以前的时候就听他们讨论这道题,说是用map做会超时,所以我直接就没用map。。。。但是做这道题实在是太波折了,昨天晚上改了一晚上都不对,就是不知道哪里出了问题,今早上又改,改来改去才知道原来我new node后边缺了个括号,我很懵懂,我记得不用括号也行啊,而且我看到一个AC的代码就是没用括号,但是不加就不对,终于用了链地址法改对了能运行了,交上去因为数组开小了就越界了.......
阅读全文
POJ 2406 Power Strings
摘要:http://poj.org/problem?id=2406题意 :求最小的重复子串的个数。思路 :KMP。#include #include #include using namespace std ;const int maxn = 10000000 ;char ch[maxn] ;int next[maxn] ;int main(){ while(scanf("%s",ch)!=EOF) { if(ch[0] == '.') break ; int len = strlen(ch) ; int i = 0 , j =...
阅读全文
POJ 1961 Period(KMP)
摘要:http://poj.org/problem?id=1961题意 :给你一个字符串,让你输出到第几个字符时,循环结的个数。思路 :这个题和2409差不多,稍微修改一下,加一个循环就行了,用的也是KMP。#include #include #include using namespace std ;const int maxn = 1000010 ;char ch[maxn] ;int next[maxn] ;int main(){ int n ; int test = 1 ; while(scanf("%d%*c",&n)!=EOF) { if(n == ...
阅读全文
POJ 2492 A Bug's Life(并查集)
摘要:http://poj.org/problem?id=2492题意 :就是给你n条虫子,m对关系,每一对关系的双方都是异性的,让你找出有没有是同性恋的。思路 :这个题跟POJ1703其实差不多,也是需要一个数组来存跟父亲节点的关系,需要两个集合来存是否有关系,在最后稍微变一下形就OK了。#include#include#include#includeusing namespace std;int pre[100010];//代表着父亲结点,如果D后边是a b,则pre[b]=a ;int father[100010] ;//代表着这个点和父亲结点的关系,是属于同一类还是不同团伙int m,n ;
阅读全文
POJ 1703 Find them, Catch them(并查集)
摘要:http://poj.org/problem?id=1703题意 :有两个黑帮团伙。有n个团伙成员,现在并不知道他们分别属于哪个团伙。给你一些信息,信息中包含两个人的编号,表示这两个人分属不同团伙,然后给你两个人的编号,问你他们俩是不是属于同一个团伙。思路 : 并查集。因为这个题给出的每个关系都代表着两个人属于不同的团伙,所以没办法像普通的并查集那样,只用两个集合就行,例如,给你(1,2)(5,6)(1,5),根据关系我们可以知道2,5属于一个团伙,1,6属于一个团伙,但是你并没有办法表示。书上介绍了一种常用的做法:只要两者关系确定了,就将他们放入同一集合中,再另外增加一个关系数组father
阅读全文
POJ 3422 Kaka's Matrix Travels(最小费用最大流)
摘要:http://poj.org/problem?id=3422题意 : 给你一个N*N的方格,每个格子有一个数字,让你从左上角开始走,只能往下往右走,走过的数字变为0,走K次,问最大能是多大,累加的。思路 :http://blog.csdn.net/qq172108805/article/detail...
阅读全文
POJ 2195 Going Home(最小费用最大流)
摘要:http://poj.org/problem?id=2195题意 : N*M的点阵中,有N个人,N个房子。让x个人走到这x个房子中,只能上下左右走,每个人每走一步就花1美元,问当所有的人都归位了之后,需要花多少美元。思路 :最小费用最大流。把人作为一个顶点集合U,房子作为另一个顶点集合V,把U中所有点到V中所有点连线,费用cost[u][v]为abs(△x)+abs(△y),反向弧费用cost[v][u]= -cost[u][v],容量cap[u][v]=1,构成一个多源多汇的二分图。由于每一个多源多汇的网络流都必有一个与之对应的单源单汇的网络流,为了便于解题,由此构造一个超级源s和超级汇t,
阅读全文
POJ 3694 Network(双连通分量)
摘要:http://poj.org/problem?id=3694题意 : N个点,M条边,构成一个连通图,将图中加入特定的一些边,每加一条边就输出加入这条边后图中剩的桥的个数。思路 :双连通分量,用LCA#include #include #include #include #include #include using namespace std;const int maxn = 100005 ;const int maxm = 555555 ;const int INF = 1000000000 ;struct Edge{ int v, next;}map[maxm];int low[m...
阅读全文
POJ 2942 Knights of the Round Table(双连通分量)
摘要:http://poj.org/problem?id=2942题意 :n个骑士举行圆桌会议,每次会议应至少3个骑士参加,且相互憎恨的骑士不能坐在圆桌旁的相邻位置。如果意见发生分歧,则需要举手表决,因此参加会议的骑士数目必须是奇数,以防止赞同和反对的票一样多,知道哪些骑士相互憎恨之后,你的任务是统计有多少个骑士不可能参加任何一个会议。思路 :这个题牵扯的知识点挺多的,具体的可以参考白书上解释的蛮详细的。#include #include #include #include #include #include using namespace std;const int maxn = 1100 ;st
阅读全文
POJ 1275 Cashier Employment(差分约束)
摘要:http://poj.org/problem?id=1275题意 : 一家24小时营业的超市,要雇出纳员,需要求出超市每天不同时段需要的出纳员数,午夜只需一小批,下午需要多些,希望雇最少的人,给出每小时需要的出纳员的最少数量,R(0),R(1),...,R(23)。R(0)表示从午夜到凌晨1:00所需要出纳员的最少数目;R(1)表示凌晨1:00到2:00之间需要的;以此类推。这些数据每一天都是相同的。有N人申请这工作,申请者 i ,从一个特定的时刻开始连续工作恰好8小时。定义ti(0#include #include #include using namespace std;const int
阅读全文