随笔分类 - ACM
摘要:求解无向图的点连通度,转化为网络流详细的解释明天再写了#include <cstdio>#include <cstring>#include <queue>using namespace std;#define N 60#define min(a,b) a<b?a:b#define max(a,b) a>b?a:b#define INF 0x3f3f3f3fint first[10*N];struct edge{ int u,v,cap,flow,next;}e[N*N*N];int nume;int n,m;void EK(int s ,int
阅读全文
摘要:线段树求体积并题意来自网上,懒得写了。。。。有一块田,上面有n个矩阵,每个矩阵对应一个权值,矩阵相交的部分取权值大的,问最后能获得多少值我们可以转换一下模型,将权值看成矩阵的高,那么题目就成了n个长方体求并,由于m只有3,所以我们可以枚举高度,在每个高度用扫描线做一次矩阵面积并,最后求和即可,最多只有3次扫描线(想象一下长方体,交错在一次,有高有低,怎么求出整个立体形的体积)注意一点,这题数据还是比较大的,用int很危险,不旦最终答案要__int64,中间的一些乘法是会溢出的,我就是用int,WA了好几次,后来把所有改为__int64就过了#include <cstdio>#inc
阅读全文
摘要:暴力+模拟题意:一行字符串没有空格,是一个加法或减法算术表达式。数字中有大写字母,大写字母代表了某个数字,一个字母只能代表1种数字,不同字母代表的数字不同,另外允许存在前导0,另外字母总数最多10个。另外题目中说第1个数字要大于等于第2个数字,所以我做了判断,然后wa了一个早上+一个晚上,注释掉就AC了很无语。。。。另外答案可能有多种,任意一种都可以的,至少我的代码是这样,并且保证是有解的。另外这题网上找不到题解的,确实我也觉得这题很无聊。。。但是选拔赛的时候,居然想成了拓扑排序(因为做过类似的,又一次被驴舔了)说说做法吧因为字母最多十个,所以就暴力枚举,可想而知枚举量最大是10!,枚举后就把
阅读全文
摘要:在朱全民的PPT介绍的一个树型DP经典题,《选课》,中文题目,不结束找了很久找到了可以提交的OJ,重庆八中http://www.cqoi.net:2012/JudgeOnline/problem.php?id=1376简单分析一下:1.建树,不要用一般的孩子表示法,这里要讲森林转为二叉树处理才能强劲有力,所以用(左)孩子(右)兄弟法建树2.建树之后就可以DP,DP的策略写在代码中了,不多说对于树型DP的初步感觉1.建树很重要(跟图论里面构图很重要,构图失败基本上整个算法失败了)2.树这种结构比较特殊,要找到特殊型入手,一是从属关系,即孩子是属于某个双亲的,二是平行关系,兄弟之间是平行的。因而一
阅读全文
摘要:动态规划黑书的例题,老题了,2000年的国赛题,题意看黑书吧,太长了。。。比较典型的按阶段性决策,整个dp还是不难想的,1A分析在代码中/*按时间决策的DP,或者说按阶段性决策当前要跳的格子出现了,那么怎么跳其实只有两种选择,用左脚去踩或者右脚去踩所以要枚举前一个格子结束的时候,左右脚在什么地方,如果用左脚踩会产生多少花费,用右脚踩会产生多少花费dp[i][l][r]表示踩完第i次,左脚在l这个格子上,右脚在r这个格子上的最小花费那么最终要找的答案在dp[n][l][r]中,所以要扫描一次dp[n]找到最大值由题目的性质就知道可以使用滚动数组,而且题目也没提到序列的长度,所以用滚动数组也更为保
阅读全文
摘要:选拔赛的题目,关键路径继续延续着比赛的时候做不出,一回宿舍就1A的悲惨命运。这题题意还是很易懂的,不说题意了,然后一看就是一个关键路径。一个例子就是造汽车,造各种零件的时间不同,要凑齐一些零件后才能造另一些零件,问最后汽车最早什么时候造完。有个关键就是,如果一些零件还没有造完,而你手头上有事情可做,那么就去做,千万不要等那个零件,这样就是最优的。如果手头上没有事情可做,都是在等待的,那么只好等待了,而等待到某一个事情能开始做了,那么就做去做,就变回了上面的那种情况,但是要记得把刚才等待的时间算上去这个其实算是模板题,关键路径大家都学过,但是不一样都做过题,我细想才发现原来我没做过这类题只是知道
阅读全文
摘要:最小路径覆盖先把相同的数字去掉即去重,按整除或者被整除关系建立有向图,可知这个有向图一定是无环的(DAG),转化为最小路径覆盖模型#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define MAX 1010bool vis[MAX];int mat[MAX];long long a[MAX];int first[MAX];struct edge{ int u,v,next;}e[MAX*MAX];int nume;void add(int u , int
阅读全文
摘要:线段树求矩形面积和,模板题(数据全部为整数)#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define MAX 10010#define LCH(n) ((n)<<1)#define RCH(n) ((n)<<1|1)struct segment{ int l,r,h,f;}ss[2*MAX];struct node{ int l,r,cnt,len; int mid() { return (l+r)>>1; }}tt
阅读全文
摘要:线段树求矩形面积并经典题目,poj 1151 是相同的题目。终于学了求矩形面积并,详细说一下。首先是看小hh的线段树专题,因为找不到什么论文来看所以只好啃他的代码,啃了一个晚上,有感觉,但是不确定,只能轻轻体会到扫描线的意义。后来啃不下去了,就自己想,给想了出来,但是想出来居然是跟原始的方法不同的。所以下面说的是原始的方法(或者说是小hh代码中的方法),以及我自己想出来的一种方法,两种虽然不同,但是个人感觉本质还是差不多的,不过从效率上看,小hh的那种代码应该效率更高。另外下面给出的代码都是用线段树来模拟扫描法,其实还有更好的方法就是用DP的思想去优化,据说效率提高不是一点两点而是很多,但是还
阅读全文
摘要:树型DP入门题题目链接:http://acm.sjtu.edu.cn/OnlineJudge/problem/1077•设f(i,j)中序遍历为i,i+1,…,j的二叉树的最大加分,则有: f(i,j)=max{f[i,k-1]*f[k+1,j] +d[k]}•显然 f(i,i)=d[i]•答案为f(1,n)•1<=i<=k=<=j<=n•时间复杂度 O(n3)•要构造这个树,只需记录每次的决策值,令b(i,j)=k,表示中序遍历为i,i+1,…,j的二叉树的取最优决策时的根结点为k最后前序遍历这个树即可。/*树型DP*/#include <cstdio>#
阅读全文
摘要:推荐技术公众号:不爱睡觉的大猪 容斥原理 题意:给n*m的矩阵有点,左下角的点为(1,1),右上角的点(n,m),(其实转回来也是没影响的即m*n),一个人站在(0,0)看这些点,在一条直线的视线上,它只能看到最前面的那个点,后面的点将会被档住他看不到,问你,这个人一共能看到多少个点。 这个问题只要
阅读全文
摘要:枚举子集+模拟2012国赛简单题。题意有n*n的点,有一些点是空地可以放稻草人保护稻草,稻草人有保护范围,就是距离为r的曼哈顿距离。问要保护所以的草最少要多少个稻草人,输出最少个数,如果全部放入都不能全部保护则输出-1这题有坑,不过代码写得好的话,坑是可以避免的,不需要特判。1.可以能一个空地都没有即不能放稻草人,所有稻草都无法收到保护,输出-1。2.所有点都是空地,全部放稻草人,这样的话答案是0,因为根本没有草不需要保护。2.注意一点,我就是为此WA了好多次,空地是不需要保护的!比如枚举了放置的稻草人并把受保护的点染色为1,如果有些点为0,并不一定是失败,可能那个点是空地,虽然它没有放稻草人
阅读全文
摘要:最大流最小割分析都在代码注释中/*题意:对于一个有向图的最大流,在每条流路中,只能修改一条边,使得修改后,整个网络的最大流可以增大,问有多少条这样的边注意一点,在一条流路中只能修改一条,好像s->1->2->t,假设每条边的容量都是2,那么最大流的流路只有一条,但是这条流路中,要想增大一条边的容量而使整个网络的最大流增加是不行的,一定要把所有边容量都增大,这与题意不符,所以这个case输出是0,表示1条都没有首先我们运行一次最大流,得到最终的残余网络,那么我们怎么找到我们要的割边呢?首先割边一定已经是满流的了,假设我们得到一条满流的边u->v如果源点s可以到达点u,且点
阅读全文
摘要:最小费用最大流2010的国赛题,题意很易懂不解释了。分析部分参考了别人博客:一般的最小费用最大流是给出每个单位流量的费用,计算费用的时候是单位费用*流量,但是这里是单位费用*流量*流量,并不能单纯地计算,要巧妙地拆容量,每条边的原容量为cap,拆成cap条,每条容量都是1,第一次取这条路时是单位费用a,第二次是3*a,依次为5*a,7*a,9*a,这样你会发现,这条路走容量2的话刚好是4a,3为9a,4为16a,5为25a,接下来做一最小费用最大流即可另外注意一点,题中说明边数最大为5000,而每条边的容量最大为5,所以在开数组的时候应该开到 2*5*50000,原来的一条边要拆成cap条边,
阅读全文
摘要:树状数组经典入门题,只要搜索数星星就能在各个OJ找到这个题目,不过不同OJ的输入和输出可能不同,但是题意是一样的,就是统计每个星星的等级入门题详细说一下。首先对输入的星星进行排序,先按x坐标升序排序,x坐标相同的按y坐标升序排序,这样做是后面能使用树状数组的根本保证。由于这题,输入数据中就已经保证了是按y坐标升序输入若y坐标相同则按x坐标升序输入,所以不需要排序,注意,两种排序方法是一样的。下面就按本题的来讲树状数组中是由原数组变化得到的,a是原数组,c是树状数组,并且数组是从下标1开始的,为什么从1开始是因为位运算和二进制的一些问题。在这里我们已经知道0<=x,y<=32000,
阅读全文
摘要:状态压缩DP经典覆盖问题,输入n和m表示一个n*m的矩形,用1*2的方块进行覆盖,不能重叠,不能越出矩形边界,问完全覆盖完整个矩形有多少种不同的方案其中n和m均为奇数的话,矩形面积就是奇数,可知是不可能完全覆盖的。接着我们来看n*m为偶数的情况DP前先处理一下,交换n和m使n较大m较小,这样能减少状态数另外数据中是有重复的,所以开辟一个ans数组来记录每组数据的结果,如果遇到相同的数据则不要计算直接输出答案不用这个ans数组的话也不会超时,这个代码是跑出了950ms,加了这个记录答案的数组时间变为600ms接着就看注释部分的讲解即可/*最上面的为第1行,最下面为第n行从上到下按行DP其中一行的
阅读全文
摘要:状态压缩DP多数也把这题分类在图论中,算是状态压缩在图论中的一个应用题意:有n只牛和m个场,下面n行给出每只牛喜欢去的场的个数,再给出每个场的编号(而且每只牛只能去他们喜欢的场)。然后要你安排好这些牛去他们喜欢的场,一个场只能有一只牛,问有多少种分配方案状态压缩,定义一个m位长的二进制数,从右到左依次代表第1,第2,第3个场,1表示这个场已经被占用,0表示没有。最后我们是要把n个牛都安排进去,那么这个二进制数将有n个1,这些就是我们要的目标状态。显然我们是按照牛的个数进行DP,先放第1只牛,再放第2只……最后放第n只。所以状态转移可以表示为 s'--->s , 其中s‘有k-1个
阅读全文
摘要:并查集选拔赛的题目。题意:如图所示是一些六边形的单元,一开始初始化所有的单元都是海洋,然后给你一个序列,就是一个单元坐标的序列。如果这个单元是个海洋,看能不能把它变成陆地,能变成陆地的条件是,如果它周围(也就是和它直接相连的那六个单元)已经是陆地,加入这块会使总陆地面积变大,但是面积有个限制值s,一块陆地的总面积不能超过s,如果加入这块不超过限制那么就加入,并且这个块海洋变成了陆地,如果超过了限制值那么这块单元要忽略,依然是海洋。如果是这块单元已经是陆地了,那么直接跳过。一整块陆地的总面积就是它拥有的单元数要你输出最后有多少块大陆地,每一块的面积是多少,面积按升序输出这里要注意,好像(1,1)
阅读全文
摘要:暴力题选拔赛的题目当时想歪了也不敢下手做题意:三国杀,我方和敌方都有n人,会给出我方武将的全部名字。然后下面n行,第i行先输入一个m,后面跟着m个名字,表示敌方第i个武将能克制我方的这m个武将,没有列出名字的武将则会克制敌方的第i个武将。两方对战,一方武将死了下一位补上,直到一方武将全部死亡则该方输掉了游戏。问你是否能构建出一种无敌的出场方式,无论敌方怎么派出武将,我方都必将取得胜利,如果不能输出No,能的话,输出Yes,另外如果有多种无敌序列,要按名字字典序输出(是指单个单个名字比较,而不是把全部名字压成一个字符串再比较)由于数据规模很小n最大为6,所以其实是个水题,只要暴力枚举两方的全排列
阅读全文
摘要:动态规划(递推)选拔赛的题目,也是2012国赛的题目。题意:给n个节点,构建一棵树,使到同一层的节点所拥有的子节点数相等,问能构建出多少个这句话,“使到同一层的节点所拥有的子节点数相等”,并没有把话说得很白,但是细想就可以发现,这句话是等同于说,这棵树是对称,而且非常对称,甚至可以想象到,以树根为轴,把树劈成两份,两边是对称的,取其中一边,再以树根劈开,两边还是对称的(这样强的对称性才满足题目说的那句话)所以基于这点,我们可以想到,除开树根外,下面的子树(可能一棵子树,或者两棵,多棵),一定要完全相同的,为什么?哪怕每棵子树是对称的,但是子树与子树之间不同,那么都挂在树根上的时候,是不能满足
阅读全文