随笔分类 - ACM
摘要:双连通分量题意:给一个无向图,问要添加多少条边形成边双连通分量。注意图一开始是连通的,所以只要从一个点开始dfs一次就行了,另外这图有重边,(1,2)(2,1)这样,则1,2就形成了一个边双连通分量。之前写的求边双连通分量的代码不能处理重边,但是要修改过来其实挺简单的。重边无非是遇到一个问题,从u走到v,按一般的做法,是不能从v回到u的,即不能马上就回到它父亲节点去(其实指的是不能重复走这条边,这条边虽然是无向边但是只能走一次),但是有了重边后,是可以马上回到它父亲处的,只不过走的是另一条边。所以我们可以标记哪些边用过了,每条边只能用一次,用过一次后不能再用。而且别忘了,建图的时候,无向边是分
阅读全文
摘要:双连通分量题意:一个无向图要添加多少条边才能使其变为边双连通分量,和 poj 3352 Road Construction 几乎一样的题目,不同的是,poj这题,原图是保证连通的,这题是不连通的,过程完全一样,只是最后计算答案的公式不同.所以题目分析就不写了,直接看poj那题吧,其实这题也是模板题,懂双连通分量的知识的话,并不需要看分析poj那题,缩点后不会出现孤立点,因为整个图连通的,所以只要找到缩点后的叶子个数就可以了,所以是(leaf+1)/2对于这题,因为图不连通,可能出现缩点后的孤立点。首先看缩点后的图,可能是一块一块的,对于点数超过1的块,和poj那题是一样的,只要找到叶子,所以没
阅读全文
摘要:推荐技术公众号:不爱睡觉的大猪 双连通分量 题意:比较裸的题意,就是给一个无向图,问添加多少条边后能使整个图变成双连通分量 分析:建议先学了双连通分量的相关知识,因为这题是算是个模板题(我自己写了模板,过了这题,但是还没有充分测试),如果没学好相关知识即便这个模板题也不好懂 双连通分量分为【点双连通
阅读全文
摘要:线段树 + DP题意:一个游戏(做题前可以先玩一下帮助理解)。题意比游戏简易:每个木板都有一个权值,可正可负或0,人在上面,自身能量要加上这个权值(即能量会发生增减)。人一开始有100能量,站在最高的木板上(要加上这个能量的权,所以其实起始能量应该为100+该板能量)。然后人往下跳,跳法有讲究并不像真实游戏那样可以移动,人下落,只能从一块木板的端点垂直下落,中途不能移动,这和实际游戏有区别,但是也使问题简化了。问这个人怎么跳,使在它落到地面的时候,能量最大,如果中途或者到地面能量<=0,或者跳到一个木板上,下面没有木板可以接住自己了,那么游戏结束,输出-1分析:既然只能垂直下落,而且是落
阅读全文
摘要:继续复习二分图题意:比较裸的二分图,输入n,表示n个不同的课程,下面n行,每行首先是m,表示后面跟着m对信息,每对信息为(p,q),表示在星期p的第q节上这节课,(一周7天,一天12节课)。问你怎么匹配,可以让这个人一周上最多的课。建立二分图,X为时间,[0,83],Y为课程,[0,n-1],然后有向边Y--->X,进行匈牙利一次即可#include <cstdio>#include <cstring>#define N 410#define M 50500int n,tot;int match[N];int head[N];struct edge{ int u,
阅读全文
摘要:/*题意:给一个有向图,问有多少个点,是其他点都可以到达的其他点都可以到达该点,那么将图转置,就变为该点可以到达其他所有的点要找这样的点方法有很多,仿照Floyd的DP方法就是最容易写,但是点太多达到10000,会超时这里用SCC来做将转置后的图进行缩点,得到一个DAG,这个DAG每个大点内的小点(即原来的点)都是相互可达,关键是看这些大点能不能去到其他大点,如果一个大点能去到其他所有的大点,那么里面的小点也可以所以就是要找,有多少个大点,可以去到所有其他的大点,可知这样的大点,最多1个!!,而且是入度为0的点(这个不难理解,可以思考一下)找到了这个大点,那么里面包含的小点就都是可以的,所以扫
阅读全文
摘要:强连通分量 + 最短路题意:城市间通信,给出n,n个城市,m,m条边,分别是端点和权,如果两个城市属于同一个国家,那么他们的通信时间为0,否则则按边权算一次的通信时间。两个城市被认为在一个国家,是从A能到B,从B也能到A。下面给出K个查询,能从u到v传递信息,需要多少时间,如果从u无法传递到v,输出那个长长的英文句子其实就是一个最短路,但是最短路的边权有讲究,虽然给出了u,v,w,但是u和v可能是同一个国家的,那么w应该是0而不是原来的值,所以要怎么判断u和v是不是在同一个国家,也就是他们可以互达,很明显不能查询一次判断一次,而是应该先搞出强连通分量,属于同一个强连通分量的两点间的边权为0这题
阅读全文
摘要:强连通分量 缩点题意:这个题意比较难懂,题意读懂了,转化过来也不容易输入n,表示n个学校(1到n编号),下面n行,分别是对应每个学校的信息。每个学校可以给其他学校共享一些软件接而共享下去,要让所有学校用上软件,需要多少个学校带头共享软件;另外要让每个学校共享的软件都能被其他所有学校用上,那么要在原来的共享计划中,另外加入那些具体的共享呢(例如原来A学校不向B学校共享的,为了达到目的,A学校需要向B学校共享,因而增加了1)首先建立有向图,A向B共享软件,则有向边A--->B所有第1个问题,问的就是要多少次才能遍历完整个有向图,因为有这么多的学校带头共享软件了,沿着路径延伸,可以到达他们子树
阅读全文
摘要:线段树题意:1到n的线段,m个操作Reset 将所有内存清空New x 申请一段长度为x的最左的未被占用的区间,返回它的位置,并占用它。找不到输出Reject NewFree x 找到x单元内存所在的连续的单元块,返回这个单元块的左右端点,并且清空这个单元块,如果这个单元x根本没被占用,则输出Reject FreeGet x 找到第x个单元块(而不是第x单元),返回这个单元块的起始位置即左端点这题还是和 poj 3667 Hotel 是一样的,查询一个最左的合法区间,修改一段区间这题使用vector按顺序来保存单元块,方便查找(可以使用二分)而线段树主要的query和updata函数是一样的#
阅读全文
摘要:线段树题意:一个长度为n的线段,下面m个操作D x 表示将单元x毁掉R 表示修复最后毁坏的那个单元Q x 询问这个单元以及它周围有多少个连续的单元,如果它本身已经被毁坏了就是0要记录单元被损坏的顺序,用一个栈就好了,毁坏就入栈,修复就出栈说说思路,最难的是查询一个点附近有那些的连接着的区间这需要在线段树记录三个信息,tlen,llen,rlen,这个记录和poj 3667 Hotel记录的意义是相同的 , tlen表示该节点内最长的可用区间的长度,llen表示最左端数起的区间长度,rlen表示从最右端数起的区间长度对于一个点,看它是在当前区间的左半还是右半在左半的话,看看是不是在右端的连续区间
阅读全文
摘要:几何题题意:题意不详说了,易懂,就是算面积,比较简单的题目分四种情况讨论即可1.不会碰到木板2.不会饶过木板,但是碰到(相当于一个圆被切掉了下面一小部分)3.绕过木板,在下方形成一个两个小圆4.两个小圆会重叠,减去重叠的部分匆匆忙忙写的代码,很乱,懒得修改了#include <cstdio>#include <cstring>#include <cmath>const double PI = acos(-1);const double E = 1e-9;double L,D,S,SS;double a,b,oo;double v1,v2,v3,v4;int
阅读全文
摘要:推荐技术公众号:不爱睡觉的大猪 线段树 题意:有一个线段,从1到n,下面m个操作,操作分两个类型,以1开头的是查询操作,以2开头的是更新操作 1 w 表示在总区间内查询一个长度为w的可用区间,并且要最靠左,能找到的话返回这个区间的左端点并占用了这个区间,找不到返回0 好像n=10 , 1 3 查到的
阅读全文
摘要:最短路题意:比较懒有点难描述,所以不说了,看Hint可以看懂的本题的巧妙之处是其实无论怎么走,从起点(固定的)走到任何一个点,到达那个点的时候速度都是确定的因为 速度为spa ,a--->b---->c , b点速度为 spb = spa * 2^(ha-hb) , c点速度为 spc = spb * 2^(hb - hc)式子一合并,就是 spc = spa * 2^(ha - hc) ,可见从点a走到点c,无论中间经过什么点,最后计算速度,之和点a和点c的高度差有关,当然和点a的速度也有关而起点是固定的(1,1),而起始速度是知道的,那么从点(1,1)走到任何一个点时的速度也就
阅读全文
摘要:最短路题意:给n个点从1到n标号,下面一行是每个点的权,另外给出m条边,下面是每条边的信息,两个端点+权值,边是无向边。你的任务是选出一些边,使这个图变成一棵树。这棵树的花费是这样算的,1号固定为树根,树中每个双亲节点下面的边都有个单价(即边权),然后单价乘上这条边的下面所有的子孙后代的点权和(看sample2,只要除掉边 1 5 9 按照这个方法就能算出1210)分析:把sample2用式子列一下就能发现,每个点的权都要乘上好几条边的权,是哪几条边呢,就是这个点回到点1的路径上的那些边所以最后的树的花费可以写成 res = sum{ (点权) * (该点回到点1的路径的边权和) } ,这些点
阅读全文
摘要:继续复习Dij变形,可用DP题意:求点1到点n,最大的载重量。转化为 ,1到n有多条路径,每条路径都有一个最小的边,求这些最小的边中的最大值定义d[v] 表示到点v的最小边最大值 , 从u到v,边权为w,那么首先选出 temp = min( d[u] , w) , d[v] = max(d[v] , temp)这是显然的,由u到v,边权为w,要经过这条边,必须流量不能比w大,否则流不过溜过去之后,选最大的用优先队列+dij变形来做,改变的只是松弛的条件而这中问题,用dp来解也是显而易见的,不写了,以前写过#include <cstdio>#include <cstring&g
阅读全文
摘要:基础搜索中文题意不解释,这题没看sample直接看完题目就打,发现不对,才看到数据可能各种无聊的坑1.可能出现相同位置的点,直接判NO2.两个点中,可能一个点是空白点,直接判NO3.两个点的值不同,直接判NO剩下的情况才是值得去搜索的,即两点值相同且都不是空白同BFS去搜定义状态,包括信息有1.x,y即该点在盘中的坐标2.c,从起点走到这里,转弯次数,为0,1,2。 3或以上的已经不行了,直接抛弃掉3.n,方向,从什么方向来到这个点,有0,1,2,3表示上,左,右,下,这样排序方便计算然后每次从当前点往4个方向搜索,并且开一个标记数组来标记哪些状态在队列中,inq[x][y][c][n],耗时
阅读全文
摘要:几何题题意:给出n个圆的圆心坐标和半径,给出一个单位方格,在(0,0),(0,1),问这些圆覆盖的面积占方格的百分比,圆超出方格的部分不计算。另外算百分比,答案精确到1%即可,即整数部分正确即可,小数部分不要求这题,可以想按照题意直接下手,未免太难了,另外注意到答案的输出,其实对精度的要求很低(对小数都没要求)。我们可以用一直近似的算法来解决将方格分割为一个一个的小格子,当分割得很小的时候,格子可以看做是一个点,然后看这个点在不在圆上或圆内,在的话相当于圆覆盖了这个点,覆盖了这个格子。所以我们将1*1方格分割为1000*1000的格子,然后逐一去判断,很暴力的方法,但就是这样过了#includ
阅读全文
摘要:最短路题意: 强调是有向图 , n个点(1到n标号)m条边,求出点1到所有点的最短路之和 + 所有点到点1的最短路之和什么?求一次最短路,然后 x 2 就是答案? 这样是错的,如果是无向图的话可以这样,因为可以逆回去走。但是有向图显然不是,点1到点a的最短路,和点a到点1的最短路是完全不同的,值不同走过的路径也不同.要求点1到所有点的最短路,直接运行一次最短路即可。但是要求所有点到点1的最短路,难道要对所有点运行一次最短路吗?一看点数就可以否定这个想法。可以这样想,如果点a到点1存在最短路,那么把这条路径的边全部取反,就是点1到点a的最短路了。所有在求了第1次最短路后,将 整个图的边取反,再求
阅读全文
摘要:差束约分题意:有n个屋子,超人从最矮的屋子开始,依次跳下比当前屋子高且最接近当前高度的屋子(即按照屋子高度增序来跳),但超人跳跃还有一个水平距离限制D,他每次跳的水平距离<=D。现在给你每个屋子的高度是它们的相对位置,你不能改变屋子的相对位置,但是可以水平移动屋子,使得最矮的屋子和最高的屋子的水平距离最大。如果无论怎样移动,超人都无法跳到最后那个屋子则输出-1这题是个差束约分看sample说明问题sample34 2 10 20 16 13 超人从10开始,跳到13,但是10和13的水平距离至少为3,但超人的水平限制距离是2,所以无论怎么移动都无法跳过去,输出-1看sample14 4
阅读全文
摘要:继续复习DP,图论题意:有向图,n个点,m条边,t个查询。从点u到点v可能有多条路径,找出一条,使这条路径的权值最大的那条边的值在所有路径中是最小的,即最大值最小状态转移方程:dp[i][j]表示从i到j的最小的最大值。dp[i][j] = min{ dp[i][j] , max(dp[i][k] , dp[k][j]) }#include <cstdio>#include <cstring>#define N 310#define INF 0x3f3f3f3f#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) (
阅读全文