- 博客(139)
- 收藏
- 关注
原创 HDU 1698 Just a Hook(线段树:区间set,区间查询)
思路:线段树区间set,区间查询模板//HDU 1698 线段树 区间set 区间查询#include#include#includeusing namespace std;#define lson i*2,l,m#define rson i*2+1,m+1,rconst int MAXN=100000+100;int sum[MAXN*4];int setv[MA
2016-02-25 20:56:36 472
原创 POJ 3468 A Simple Problemwith Integers(线段树:区间add,区间查询)
思路:线段树的区间add和区间查询模板#include#include#includeusing namespace std;#define LL long long#define lson i*2,l,m#define rson i*2+1,m+1,rconst int maxn = 100000+100;LL sum[maxn*4];LL addv[maxn*4
2016-02-25 20:54:49 364
原创 POJ 2828 Buy Tickets(线段树)
题意:火车站有n个人排队,他们是按顺序到达的,但是他们乱插队。每个人有两个值pos[i]和val[i]。比如现在第5个人来了,他的pos[5]值为3,那么他就会插队到当前第3个人位置的后面(第0个人是售票窗口)。依次给出所有人的pos和val值,要你最终按所有人的位置顺序输出val值。思路:维护一颗线段树,该树的叶子结点初始值为1,表示这个位置可以占用,当确定一个人的位置的时候就把那个值变成0
2016-02-24 21:08:06 422
原创 HDU 2795 Billboard(线段树)
题意:中文题思路:建立一颗线段树,线段树维护的每个元素代表广告牌的一行的当前剩余最大空间。 最多只有n(nw),直接输出-1即可。所以我们线段树最多只需要维护20W个元素。就算h有10亿,后面那些行根本是浪费。在输入的时候取最小就好了。 现在我们依次读入wi,找到能放下wi的序号最小的线段树叶节点,然后更新线段树即可。这个查询过程我们可以
2016-02-24 15:47:42 330
原创 HDU 1394 Minimum Inversion Number(线段树:单点更新,区间求和)
思路:之前用的树状数组做,现在尝试用线段树来做,维护一棵线段树,树中的每个叶子节点表示的是这个节点是否出现过,比如叶子节点i控制的范围是[2,2],那么sum[i]=1表示2这个数已经出现了,如果sum[i]=0表2这个数还没出现.如果j节点控制范围[4,8],那么sum[j]=3表示[4,8]区间有3个数出现了. 如果当前处理的是a[i],那么用query(a[i]+1
2016-02-23 23:41:05 316
原创 HDU 1754 I Hate It(线段树:单点替换,区间最值)
题意:中文题思路:线段树基本应用,单点替换区间最值#include#include#includeusing namespace std;const int maxn = 200000+5;const int INF = 1e9;//线段树需要维护的信息int sum[maxn*4];#define lson i*2,l,m#define rson i*2+1,m
2016-02-23 23:26:03 350
原创 HDU 1166 敌兵布阵(线段树入门题)
题意:中文题思路:单点更新,区间求和的线段树入门题#include#include#includeusing namespace std;const int maxn = 50000+5; //线段树需要维护的信息int sum[maxn*4];#define lson i*2,l,m#define rson i*2+1,m+1,r//i结点收集子结点的统计结
2016-02-23 22:49:58 343
原创 HDU 1556 Color the ball(树状数组区间更新)
题意:中文题思路:一道区间更新,单点查询的裸题,用线段树做更好,因为还没看到所以这里用树状数组做。树状数组标记区间的方法很特别,比如给区间[a,b]内的气球涂颜色时,我们add(a,1),add(b+1,-1),单点查询的时候sum(x)就是x这个气球被涂色的总次数。建议先在纸上自己试一下看看,有点抽象,可以这样理解,如果更新区间[3,5],那么我等于在3这个点+1,代表从3之后所有的点都增加
2016-02-22 22:17:45 339
原创 HDU 2838 Cow Sorting(树状数组)
题意:首先每次只能交换相邻的两头牛,并且最后要求升序排列,所以最后整个序列的逆序是0,每次交换只可以消除1个逆序。(令a[i]的逆序是从1到i-1比它大的数的个数。)思路:对于某个数,要把它变成有序的,那么很容易可以推算出公式就是它自身的逆序数乘自身的值再加上它的逆序数的和,自己算算看看。吐槽:一开始没想清楚树状数组下标的问题,后来没注意会爆int搞了好久...#include
2016-02-22 21:02:12 314
原创 HDU 3743 Frosh Week(树状数组+离散化)
题意和思路:和POJ2299几乎一样...离散化+树状数组#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;#define maxn 1
2016-02-22 13:21:57 522
原创 HDU 1394 Minimum Inversion Number(树状数组)
题意:有一个n个整数的排列,这n个整数就是0,1,2,3...n-1这n个数(但不一定按这个顺序给出)。现在先计算一下初始排列的逆序数,然后把第一个元素a1放到an后面去,形成新排列a2 a3 a4...an a1,然后再求这个排列的逆序数。继续执行类似操作(一共要执行n-1次)直到产生排列an a1 a2...an-1为止。计算上述所有排列的逆序数,输出最小逆序数。思路:首先由于给出的序
2016-02-22 13:16:35 310
原创 POJ 3067 Japan(树状数组:求逆序)
题意:水平方向有2n个城市点,他们分别按顺序分布在平行的两条直线上,编号都是从1到n。然后现在在上直线与下直线的两个城市点之间建公路,一共建k条公路。问你这k条公路一共有多少个交点(保证最多只有两条公路会交于同一点)?思路:这题画个图就一目了然了,我们将获得所有边以y坐标从小到大排序,如果y坐标相同,则x坐标小的排在前面。那么我们当前扫描到的xi,yi边有多少个交点?只要看xi前面有多少个xj
2016-02-21 22:51:05 916
原创 POJ 2481 Cows(树状数组)
题意:有n头牛,每头牛对应一个区间[Si,Ei],如果牛j 的区间是牛i 的区间的真子集(即Si Ej - Sj),那么就说牛i 比牛j 强壮。要你依次输出比第i头牛强壮的牛数目。思路:如果将所有牛的E区间按从大到小排序(如果E相同,则S小的排在前面)的话,那当前读取到第i个牛的Si和Ei,那么之前(假设任意牛的区间不会完全相同)的牛的Sj(jTrick:这里有可能有两个区间一模
2016-02-21 15:41:40 673
原创 POJ 2352 HDU1541 Stars(树状数组)
题意:二维平面给定n个点的坐标,然后要你输出每个点的“等级“。每个点的等级是它的左下放的点个数(包括正下放和正左方的点)。即要你输出对于每个点(x,y)来说,有多少点的坐标(xi, yi)满足xi思路:题目给出的坐标中已经是按y升序排列,那么其实只用考虑x轴,那么显然就是在前面的点中找比自己小的。Trick:注意的是累加的时候while循环的条件要改一下,因为我们这里是用x轴坐标的值作
2016-02-20 22:23:29 305
原创 POJ 2299 Ultra-QuickSort(树状数组+离散化)
题意:给你一个n个整数组成的序列,每次只能交换相邻的两个元素,问你最少要进行多少次交换才能使得整个整数序列上升有序。思路:首先要知道怎么求逆序数,从左往右看每个数字,该元素左边值比他大的元素个数就是这个元素的逆序数。所有逆序相加就是整个序列的逆序.统计元素左边比它大的元素个数,是不是和UVA1428很像了,只不过之前求小的,现在求比它大的那么就是sum(n)-sum(a[i])就是了。题目还有
2016-02-20 15:51:11 369
原创 UVA1428 Ping pong(树状数组)
题意:一条大街上住着n个乒乓球爱好者,他们经常组织乒乓球比赛且每个人的能力值ai都不同.每次比赛需要2个比赛者和一个裁判,他们有一个奇怪的规定:当裁判的那个人必须住在这两个比赛者之间,且裁判的能力值也必须在这两个人之间.问一共有多少种比赛组织方式.其实就是一个数列(不一定有序)要你找任意三个数递增或递减的组合数思路:一个有点像经典滑窗的题目。 对于某个位置i,我
2016-02-19 21:47:27 315
原创 HDU 1166 敌兵布阵(简单树状数组)
题意:中文题思路:简单树状数组应用#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;#define maxn 50000+100
2016-02-19 16:34:52 245
原创 HDU 2448 Mining Station on the Sea(Floyd+最优匹配)
题意:给你一个由N个港口和M个海上油田构成的连通无向图(给出了图中所有的边和权值),现在给你N个船所在的油田编号,问你让这N条船,每条都回到1个港口去(每个港口最多只能容纳一条船),问你这N条船行走的总距离最短是多少?思路:其实每条船回到任意一个港口去都有一个距离(用Floyd算法算出的最短距离). 建立二分图: 我们把二分图左边放N个港口,右边放N条船,如果第j条船到第i个港口的距离为x,那
2016-02-19 14:17:11 439
原创 HDU 3395 Special Fish(二分图中最优匹配)
题意:有N条鱼(不分性别),每条鱼有一个价值vi.且给出一个N*N的矩阵,矩阵中(i,j)格为1表示,第i条鱼会攻击第j条鱼并产下卵.产卵的数量= vi XOR vj. 现在每条鱼只能被攻击1次(一条鱼只能攻击1次且被攻击1次),且每条鱼只会攻击它可能会攻击的所有鱼中的一条(哪些其他鱼它会攻击已经在N*N矩阵中给出).现在要你求这N条鱼产卵数目的最大值.思路:简单的建图然后二分最优匹配即可
2016-02-19 14:03:25 345
原创 HDU 3722 Card Game(二分图最优匹配)
题意:给出n个字符串,其中任意两个字符串(包括同一字符串)可以进行互相拼接起来,例如s1="abcd"……s2="dcab",表示将s1拼接在s2后面,所得的值就是将s1反转得"dcba",该字符串与s2同有的前缀为"dc",所以值就是2.现在求解在n个字符串给定的情况下,将这些字符串拼接成1个或多个不相交的环所得到的最大值.思路:建立二分图:左右点集都是1到n个数字,代表1到n的字符串编号.
2016-02-19 13:53:54 538
原创 HDU 3729 I'm Telling the Truth(二分图最大匹配)
题意:一位老师想问N位同学他们大学入学考试的成绩. 每位同学只告诉老师他在全省的排名区间,比如[5006,5008]. 最终老师发现有一些人在说谎,比如区间[5006,5008]中有4个同学都说自己排名在这个范围内,那肯定是不可能的.现在老师要你找出最多有多少个同学没有说谎,且输出字典序最大的同学序号结果.思路:二分图的左边点集和右边点集分别是什么? 左边点集是学生序号,右边点集是1到1000
2016-02-18 22:06:30 397
原创 POJ 2724 Purifying Machine(二分图最大匹配)
题意:给出m串长度为n的01串。有些串中可能包含*,这样的串可以表示两个串,*为1 和*为0。重复的算一种。现在我们需要消灭掉所有的01串,消灭方式有两种: 1:一次消灭一个串。 2:如果两个串的差别只有一位的话可以同时消灭这两个串。 问最少多少次操作可以消灭所有的01串思路:也就是给你一些不同的(判重之后
2016-02-18 20:02:40 354
原创 POJ 2446 Chessboard(二分图最大匹配)
题意:给出一个矩形N*M棋盘,有K个格子是空洞,然后用2*1的矩形,对所有非空洞的格子进行覆盖,如果可以全部覆盖,就输出YES;思路:和HDU1507差不多,而且还简单点不用输出组合,见代码#include#include#includeusing namespace std;const int maxn=1000+5;struct Max_Match{ in
2016-02-18 15:27:41 308
原创 HDU 1498 50 years, 50 colors(二分图最小覆盖数)
题意:给你一个n*n的矩阵,在矩阵中分布着s种颜色的气球,给你k次扎破气球的操作,每次操作可以扎破一行,或一列的同一颜色的气球。问在k次操作后有那几种颜色的气球是不能被完全扎破的.思路:只需要对于每种颜色判断一下该颜色的气球最少需要多少次才能全部扎破即可. 假设当前处理颜色为1的气球(注意气球颜色最多有50种). 我们把行标号放左点集,列标号放右点集合. 如果(i,
2016-02-18 14:35:10 414
原创 HDU 1528 Card Game Cheater(二分图最大匹配)
题意:Adam和Eve打牌,Eve可以看到Adam的牌.现在Adam已经把牌按顺序摆好了,Eve知道Adam所有的牌,所以Eve可以最优化自己牌的摆放顺序,使得自己每个位置上的牌赢Adam对应位置上的牌的个数最多. 其中每张牌由值+类型构成,值是2, 3, 4, 5, 6, 7, 8 ,9, T, J, Q, K, A,这些值依次增加其中2最小,A最大.类型为: C, D, S
2016-02-17 21:38:35 342
原创 HDU 2426 Interesting Housing Problem(二分图最优匹配)
题意:有N个学生和M个房间,每个学生可能会给多个房间打分.如果分数>=0,表示他可以选择这个房间.(如果分数 现在问你是否存在一个匹配使得每个学生分得一个单独的房间且每个房间最多1个学生.且这些房间都是学生打了分的且分数>0的房间? 如果存在输出分数和的最大值,如果不存在输出-1.思路:首先明显当输出N>M的时候直接输出-1.下面的情况就是N=0的房间.由于我们
2016-02-17 20:33:01 286
原创 HDU 3435 A new Graph Game(二分图最优匹配:有向环覆盖)
题意:给你一个N个节点M条边的无向图,要你求该图有1个或多个不相交有向环(哈密顿回路)构成时,所有这些有向环的最小权值.思路:和HDU1853差不多,这里是无向边改成插入两条有向边就行。这道题居然用网络流比二分图最优匹配快多了#include#include#include#define INF 1e9using namespace std;const int maxn=
2016-02-16 22:42:29 322
原创 HDU 3488 Tour(二分图最优匹配:有向环覆盖)
题意:给你一个N个顶点M条边的带权有向图,要你把该图分成1个或多个不相交的有向环.且所有定点都被有向环覆盖.问你该有向环所有权值的总和最小是多少?(保证有解)思路:参照HDU1853#include#include#include#define INF 1e9using namespace std;const int maxn=200+5;struct Max_Mat
2016-02-16 22:33:51 386
原创 HDU 1853 Cyclic Tour(二分图最优匹配:有向环覆盖)
题意:给你一个N个点M条边的带权有向图,现在要你求这样一个值:该有向图中的所有顶点正好被1个或多个不相交的有向环覆盖.这个值就是 所有这些有向环的权值和. 要求该值越小越好.思路:我们把任意一个顶点i都分成两个,即i和i’. 如果原图存在i->j的边,那么二分图有i->j’的边,费用小把权值取负#include#include#include#define INF
2016-02-16 22:30:44 226
原创 HDU 2119 Matrix(二分图最小边覆盖)
题意:给你一个N*M的0/1矩阵,你每次可以选特定的某行或某列,然后删除该行/列的所有1,问你最少需要几次操作能删除矩阵的所有1.思路:二分图简单题,前面好像有几道都与本题类似. 建图:把行号放在二分图左边点集,列号放在右边点集.如果(i,j)格子是1,那么就连左i与右j的无向边. 本题的问题就是求该二分图的最小边覆盖点集.使得每条边都被
2016-02-16 20:38:06 411
原创 HDU 3315 My Brute(二分图最优匹配)
题意:有S1到Sn这n个勇士要和X1到Xn这n个勇士决斗,初始时,Si的决斗对象是Xi. 如果Si赢了Xi,那么你将获得Vi分,否则你将获得-Vi分. Si和Xi对决时,Si有初始生命Hi,初始攻击Ai, Xi有初始生命Pi,初始攻击Bi. 且Si先出手,然后Xi失去Ai生命,之后如果Xi没死,那么Xi出手,Si失去Bi生命. 直到有一方的生命值 现在要你重新安排S和X的决斗顺
2016-02-16 20:24:42 368
原创 HDU 2853 Assignment(二分图最优匹配)
题意:给定一个二分图,N个点对应M个点,两两之间存在一组关系,每组关系一个权值。题目中了给定了一个匹配方案,现在要求满足这组关系中的最大的匹配权值在原方案上增长了多少?并且还要求出在原匹配方案上改变(最少)多少条边才能够得到这个最大匹配?思路:最优权值匹配很好求,直接用KM模板,但是要在原匹配边的基础上使得改变的边最少,这里需要特殊处理: 以下转自网上,写得很好。
2016-02-16 20:16:35 309
原创 HDU 1054 Strategic Game(二分图最小覆盖集)
题意:给你一颗具有N个节点的树的所有边信息.现在问你最少需要多少个点放到树的节点上,使得树的任意一条边都至少有一个端点被覆盖.(其实就是最小覆盖集)思路:明显的最小覆盖集. 且由于树天然就是二分的,所以我们只需要求该树的最小覆盖集点数即可. #include#include#includeusing namespace std;const int maxn=15
2016-02-15 22:00:28 248
原创 POJ 2195 Going Home(二分图最优匹配)
题意:给定一个N*M的地图,地图上有若干个man和house,且man与house的数量一致。man每移动一格需花费$1(即单位费用=单位距离),一间house只能入住一个man。现在要求所有的man都入住house,求最小费用。思路:之前用的网络流做的,现在用KM算法做。 每个人对应二分图左边的点,每个房间对应二分图右边的点.每个人与每个房间都有一条带权值的边,表
2016-02-15 20:31:54 356
原创 HDU 2255 奔小康赚大钱(二分图最优匹配:模板题)
思路:二分图最优匹配模板题#include#include#includeusing namespace std;const int maxn=300+10;struct Max_Match{ int n,W[maxn][maxn]; int Lx[maxn],Ly[maxn]; bool S[maxn],T[maxn]; int left
2016-02-15 17:09:03 289
原创 HDU 3991 Harry Potter and the Present II(Floyd+DAG最小路径覆盖)
题意:一幅图上有N个点,M条边,边的权值表示通过这条边所需要的时间。有Q个任务,每次任务以Ci,Ti的形式给出Ci表示城市编号,Ti表示任务需要在Ti这个时间点完成.现在你拥有一个人,问至少还需要几个人才能完成所有城市给定时间上的任务。每个人都可以在任何时间点出现在任何城市思路:和POJ3216一样的做法..#include#include#includeusing name
2016-02-15 16:39:36 256
原创 HDU 4160 Dolls(DAG最小路径覆盖)
题意:有N个木偶,木偶有3项指标,w,i,h. 如果第i个木偶的3项指标对应小于第j个木偶的3项指标,那么i木偶可以放到j木偶中. 且一个木偶里面只能直接的放一个别的木偶.问你这N个木偶最优嵌套的方案下,最多有几个木偶不能被任何木偶嵌套?思路:如果i木偶能放在j木偶中,那么连一条i->j的有向边. 那么最终我们能得到一个DAG图. 现在我们的问题是要在该DAG图中找最少的简单路径,这些路径没有
2016-02-15 15:48:59 338
原创 POJ 3216 Repairing Company(FLOYD+DAG最小路径覆盖)
题意:给出Q的街道和M个任务 然后给出i*j的矩阵..表示第i个地点到第j个地点的距离 其中-1表示不可到达. 然后接下来M行有 p t d 表示 任务在p地点, 开始时间是t, 完成工作花费时间是d. 问最少派出多少人可以完成M个任务思路:容易想到的是如果一个工人做完第一个任务时,还有任务没人做的话且他能及时赶
2016-02-15 15:39:52 299
原创 POJ 3020 Antenna Placement(二分图的最大匹配)
题意:一个矩形中,有N个城市’*’,其余网格都为'o'表示空地。现在这n个城市都要覆盖无线,若放置一个基站,那么它至多可以覆盖相邻的两个城市。 问至少放置多少个基站才能使得所有的城市都覆盖无线?这个基站的位置可以任意放,不管当前位置是’*’还是’o’.思路:跟POJ1507做的网格用1*2小矩阵覆盖的题目类似。 我们把图中的每个’*’都标号,分别放到二分图的左右
2016-02-15 14:59:33 447
原创 HDU 1507 Uncle Tom's Inherited Land*(二分图最大匹配:输出一组解)
题意:N*M的矩形,向其中填充1*2的小块矩形,黑色的部分不能填充,白色部分需要填充且1*2矩形不能重叠。问最多可以填充多少块。输出任意一组填充解即可.思路:首先同样将原图的所有可填充部分小方格编号,然后将这些合法小方格(可填充)按照他们的行号+列号是奇数还是偶数分为两个点集.(有一个重要的结论,矩阵或者棋盘中,根据行号+列号的奇偶性可以分成一个二分图) 对于两个相
2016-02-14 23:46:19 320
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人