随笔分类 - POJ
摘要:【题目大意】给定一个无向图,点i处有Ai头牛,点i处的牛棚能容纳Bi头牛,求一个最短时间T使得在T时间内所有的牛都能进到某一牛棚里去。(1 #include #include #include #include #include #define LL long long#define INF 1LL...
阅读全文
摘要:求一个平面内可见的点,其实就是坐标互质即可,很容易看出来或者证明所以求对应的欧拉函数即可#include #include #include #include using namespace std;int phi[1010];int n;void calc(int x){ for (int ...
阅读全文
摘要:求一串序列里面的4个数互质 的个数依然是反向考虑,求序列里面四个数不互质的个数,最后用总数减去即可求四个数不互质的个数,直接求不好求,不如求公因子为2的,为3的,为。。。的有多少个,然后用容斥原理,先求出为2的,为3的。。再减去为2和3的,为3和5的。。。再加上公因子为3个的。。。即可#includ...
阅读全文
摘要:咋一看确实想到的是树形DP,但是我一开始也马上想到环的情况,这样应该是不可以进行树形DP的,然后我自以为是地想用有向图代替无向图,而且总是从能量高的指向能量低的,这样自以为消除了环,但是其实是不对滴,这样的话在树形DP的过程中就会出问题。然后实在没想到好的方法,去看 了下这题的discuss,结果大...
阅读全文
摘要:题意要求一棵树上,两个点的最近公共祖先 即LCA现学了一下LCA-Tarjan算法,还挺好理解的,这是个离线的算法,先把询问存贮起来,在一遍dfs过程中,找到了对应的询问点,即可输出原理用了并查集和dfs染色,先dfs到底层开始往上回溯,边并查集合并 一边染色,这样只要询问的两个点均被染色了,就可以...
阅读全文
摘要:求n个图矩形放下来,有的重合有些重合一部分有些没重合,求最后总的不规则图型的轮廓长度。我的做法是对x进行一遍扫描线,再对y做一遍同样的扫描线,相加即可。因为最后的轮廓必定是由不重合的线段长度组成的,这样理论上是对的要注意处理高度相同的线段,把底边优先处理(在代码里就是f标记为1的线段),因为若是一个...
阅读全文
摘要:本来是想找一个二维线段树涉及懒惰标记的,一看这个题,区间修改,单点查询,以为是懒惰标记,敲到一半发现这二维线段树就不适合懒惰标记,你更新了某段的某列,但其实其他段的相应列也要打标记,但因为区间不一样,又不好打。。。也可能是我这是在套用一维线段树的思想,还有更好的二维线段树懒惰标记方法反正到现在我还没...
阅读全文
摘要:求无向图中能覆盖每个点的最小覆盖数 单独的点也算一条路径这个还是可以扯到最大匹配数来,原因跟上面的最大独立集一样,如果某个二分图(注意不是DAG上的)的边是最大匹配边,那说明只要取两个端点只要一条边即可。故最小覆盖数还是 顶点数-最大匹配数根据DAG建图的时候,就是DAG有边就给对应的端点建边#in...
阅读全文
摘要:这是经典的最大点独立集还是可以转化成最大匹配数,为什么呢,因为求出最大匹配数之和,匹配的边的两个端点互斥,只能去一个,所以最后结果就用总点数-最大匹配数即可#include #include #include #include using namespace std;int h[600],sex[6...
阅读全文
摘要:这个最小覆盖但不同于 POJ 3041,只有横或者竖方向连通的点能用一块板子覆盖,非连续的,就要用多块所以用类似并查集方法,分别横向与竖向缩点,有交集的地方就连通,再走一遍最大匹配即可一开始还有点没想清楚缩点怎么写,其实就是横向和竖向分别缩一下,不要混在一起,否则很麻烦,要注意一下#include ...
阅读全文
摘要:最大匹配数就等于最大点覆盖,因为在图里面,凡是要覆盖的点必定是连通的,而最大匹配之后,若还有点没有覆盖到,则必定有新的匹配,与最大匹配数矛盾,如果去掉一些匹配,则必定有点没有覆盖到。POJ 1469比较简单,用的经典的二分图匹配算法。#include #include #include #inclu...
阅读全文
摘要:这个题目我敲了一个简单的EK,这不是难点难点在于建图,按题目的要求 每个猪圈和顾客都建点的话,那也太多了。。。我看了Edelweiss里面的缩点方法才建好的图,哎,惭愧啊实际那些猪圈根本不需要单独建点,猪圈无非就是向顾客输送流量 以及向同时开着的猪圈输送流量,这一步可以直接缩为,当某个猪圈被第一次打...
阅读全文
摘要:擦,真不应该让这个题目弄这么久就是一个比较简单的状态DP,先预处理出每一行的可行情况,然后因为当前行是和前两行有关系的,果断不能只用个两维啊,我一开始Dp数组开个两维,只记录当前行的状态,结果在枚举前面行的时候果断就不行啊,因为你枚举了上一行那上一行的前两行又要枚举,果断不行啊,我居然还照着这个思路全部写完并且过了样例,还提交WA了很久都没反应过来至少开三维,dp[i][j][k]记录当前行为j状态,i-1行为k状态时的最大值,那么dp[i][j][k]=max(本身,dp[i-1][k][w]+cot[j]),其中状态和某个状态的含1的个数都预处理好了,j,k,w都是状态编号,w为i-2行的
阅读全文
摘要:这个题目是个挺难表示的状态DP,因为不但要考虑上下还要考虑左右,在DP里面就没有什么下了咯,但也至少除了考虑左右还要考虑上所以先枚举出在同一行满足条件的状态 即 某状态 若 s&(s#include #include #include #define N 11using namespace std;int dp[105][1<<N-3][1<<N-3];int A[105],m,n,calc[1<<N],num,state[1<<N];void init(){ num=0; for (int i=0;i<(1<<m);i
阅读全文
摘要:第一次做树状数组,这个东西还是蛮神奇的,通过一个简单的C数组就可以表示出整个序列的值,并且可以用logN的复杂度进行改值与求和。这道题目我根本不知道怎么和树状数组扯上的关系,刚开始我想直接按图来遍历来做,后来用树状数组做完都跑了600+MS,那样估计是TLE了。做法就是用DFS把整个图重建一遍,代号小的点在叶子,代号大的点为根。记录每个根的起始点号为 idl,根点号为 idh,则求某个根的苹果和就直接调用树状数组的sum即可。不过前提是要建好树,我一开始不明白为什么要建一颗标准树,即就是按1 2 3 4。。。。,每个点有一个苹果的递增的标准树,因为整个图并不是按这个标准来建得,2号点C值为1号
阅读全文
摘要:第一次做状态压缩DP,是因为按照DP清单里面碰到了状态不确定的DP,我当时只能用回溯做,但是时间卡得想死啊,后来又连续碰到几个题目都需要用状态压缩,所以好好学了一下,说到这里,必须要检讨一下昨天的自己,其实这道题目本应该昨天完成的,自己磨磨蹭蹭昨天非常地心不在焉,弄得昨天完全没完成训练任务。加上这个位运算这里确实有点难懂,我之前很少接触位运算,但是用状态压缩的时候位运算贯穿整个代码,所以理解起来比较难还好找到了一个讲解非常详细的博文,这才理解了http://www.2cto.com/kf/201208/146894.html这个博文写的非常好还有这个题目跑了900+MS,在学校的VJ上有100
阅读全文
摘要:又几天没写博客了,大二的生活实在好忙碌啊,开了五门专业课,每周都是实验啊实验啊实验啊。。。。我说要本月刷够60题,但好像完不成了,也就每天1题的样子。如今写动规还是挺有条理的,包括这道需要打印轨迹,其实就是在POJ 2955的基础上进行下修改,记录下动规的方向,再用递归逆向输出即可!是个区间DP,如果 括号i和括号k匹配了,则 dp[i][j]=max(dp[i][j],dp[i][k]+1+dp[k+1][j])这个转移方程挺重要的,我一开始就是这个方程没写好。。弄得思路混乱了还有就是一开始不知道为什么总是OLE,说我输出太多,我看了下POJ的discuss,说这道题的数据里面有一些空行或者
阅读全文
摘要:给一块最大为10^8单位宽的墙面,贴poster,每个poster都会给出数据 a,b,表示该poster将从第a单位占据到b单位,新贴的poster会覆盖旧的,最多有10^4张poster,求最后贴完,会看到几张poster (哪怕只露出一个单位,也算该poster可见);我一看这么大数据,又看了下时间限制只有1s,不科学啊,如果真的按10^8建树不可能过时间啊,而且根据它的空间限制,大概只能建10^7这么大的数组。后来搜博客发现大家的标题都写着离散化,原来用离散化做这个题目,但是我不会离散化,我想找一篇纯讲离散化的博文来好好研究下,。。。没找到,所以原谅我,这个题目是仔仔细细的分析了别人的
阅读全文
摘要:题目大意:给定一个n个节点的树,1是信号发射塔,1到n-m是中继发射塔,n-m+1 到n是用户,每个用户都会交钱,任意两个节点传输信号都是需要钱的,每个用户最多上交的钱已给定,问在不亏本的情况下,最多有多少用户。初看题目,研究了下样例,发现每个用户上交的钱在满足自身需求同时还有可能用到其他线路上。所以我一开始的DP方法是这样打算的,记录下所有用户上交的总钱数 sum,用dp[rt][j]表示以rt为根的树,在分配了j这么多钱之后,最多能有几个用户,写着写着发现不对劲,这样是初始就认为有sum的钱,然后把sum的钱统一分配,明显错了,因为能收到用户的钱,前提是一定要接通它这条线路,。。又试想了改
阅读全文
摘要:题意:输入N,P,求一棵N个节点的树最多砍多少次边,能得到一个节点数为P的树。这个题目还真是一时间考住我了,我怎么都没想通怎么DP,甚至后来没办法去找博客看了一下,还是觉得无法理解。今天上午,翘着水课来刷题,总算是弄懂了。用dp[rt][j]表示在以rt为根节点的树上,要保留j个节点,(每次j从p递减到1)需要的最小割边数,首先我们来考虑边界,如果是叶子,则dp[rt][1]=0是显而易见的,除此外,它无法构成任何其他数目节点的树,所以dp[rt][i](i为除1外的数)全部置为INF,以此来表示不存在。dp[rt][j]=min(dp[rt][j]+1,dp[rt][j-k]+dp[nx][
阅读全文

浙公网安备 33010602011771号