摘要:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3145给一个森林,每条边有一种颜色,有3种操作,A、将以x于其父亲断开并连到y上;B、将x到y路上的边染成颜色c;C、询问x到y的路的长度以及路上有多少种颜色。比较赤裸的动态树问题,强烈推荐杨哲的《QTREE解法的一些研究》,其上对于link_cut tree 的介绍通俗易懂。这里我稍微讲一下题目中要注意的地方,其中这里每条边都有自己独立的属性,颜色。而标准的link_cut tr 阅读全文
摘要:
http://www.codeforces.com/contest/273/problem/D 给去一个 n*m的矩阵,让我们在其中去若干个块,使得其满足一下两个条件,A所有块连成一个整体,B.取出的块中任意两个(x1,y1),(x2,y2),可以通过其他块到达且最短路长度是abs(x1-x2)+abs(y1-y2),问一共有多少种取法。 稍微画一下可以发现对于某行,其被取的块必然是连在一起的,否则条件B显然不成立。所以用dp[i][j][k]表示状态,代表第i行取 第j~k块。 之后再考虑到要满足如果某行相对上一行j坐标出现向右偏移的情况,则以后j不能再向左偏移,否则B条件不成立。同理k坐标 阅读全文
摘要:
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2332 题意模拟一部电梯运行情形,运行方法与正常理解的电梯运行一致,详见题面。 比较复杂的一道模拟题,一开始感觉很容易产生错误,仔细考虑后通过将电梯状态划分成7种状态来实现程序,分别是 0:无任务的停止状态。 1、-1:移动状态(上/下)。 2、-2:带任务的停止状态(上/下)-注此时电梯门未打开。3、-3:电梯门打开的停止状态。 列出状态之后,可以发现我们只需要考 阅读全文
摘要:
http://poj.org/problem?id=3921 题目给出一个有向图,询问从2~n-1这些点中最少删除几个使得新图中1到n的不存在长度小于等于K的路径。 首先对原图先进行一遍预处理,删除对答案没有影响的边,对于边s->t,如果1到s的最短路长度 dis[0][s] + t到n的最短路长度dis[1][t] >= K , 则s-->t这条边不会对答案造成任何影响,因为经过这条边的联通1和n的路径长度最短为K+1. 我们首先将这类边删除。 再对新图进行讨论可以发现,显然有新图中存在1~n的联通路径 与原问题是等价的。到这里我们得到最终算法,将新图中每个点拆成两个一个入 阅读全文
摘要:
http://www.codeforces.com/problemset/problem/132/E 给定两种操作A,给变量赋值, B打印某个变量,其中A操作代价为赋值数字2进制表示中1的个数,要求使用这两种操作按顺序打印n个数字,最多使用m个变量,使得总代价最小。 非常经典的一类费用流问题。其中对于每个要打印的操作我们将拆成费用流图中的三个点,我们设为Ai,Bi,Ci. Ai连向Bi,权为该数字赋值到变量代价,Bi连向Ci,权为负无穷,表示一定要执行一次该打印操作。。Ci连向Ai+1表示该变量用完之后可以回收等以后其他值使用,Ci连向Bj,数字j是下一个等于数字i的打印要求,表示改变量不进行 阅读全文
摘要:
今天遇到一个题,有两种操作,A添加新顶点,B,询问某个点是否在当前点的凸包内。。简单来说就是只有添加操作的凸包维护,做法也不难想,可以从我们正常的水平序求凸包中得到启发,即动态维护一条上凸折线,以及一条下凸折线,用STL可以得到一个O(nlogn)的做法。。切完顺便把程序当场模板留了下来,感觉这个思路用来做模板挺好用的,不停的insert操作就可以了。代码也短View Code 1 //By Lin 2 #include<cstdio> 3 #include<cstring> 4 #include<map> 5 #define mp(x,y) make_pa 阅读全文
摘要:
http://codeforces.com/contest/257/problem/E 闲来无事切一下div2的比赛,增强一下自信心,弱暴了=。=,最近卡题卡得要靠div2来涨信心了。 E题题面很长,但是实际很好读,读完题发现就是一个纯粹的模拟题,不过规模比较大需要用数据结构来维护,一开始觉得平衡树挺方面的,后来发现楼层之后10^5离散化都不用就写成线段树了。 由于电梯运行时间可能很大,所以不能以秒为单位模拟,但是显然可以以请求电梯以及下电梯的事件来模拟,用线段树判断当前向下的请求以及向上请求总数,判断电梯运行方向,同时顺便求出以该方向运行多久可以满足第一个请求,再于新增加请求时间比较看看哪个 阅读全文
摘要:
http://codeforces.com/problemset/problem/70/E 给一棵树,让你在树上建立若干个区域中心(每建立一个需花费一定代价),最终每个节点到最近区域中心距离为Li, 则会产生d[Li]的代价,求一个方案使得最终总代价最小。 神级树形dp,看完题解才会的,感觉是我之前完全没有见识过的一类树形dp思路,太孤陋寡闻了! 如图,dp[T,g]作为一个状态,T是原图中截断某条边剩下的子数,容得T数目是O(n)级别的,g是树上某个顶点(dp[T,g]表示T这棵子树的根v,以g为中心最小代价,同时树上其他顶点可以以其他结点作为中心。原题解中g限定为T上的节点,显然这样定义状 阅读全文
摘要:
http://codeforces.com/problemset/problem/173/E 好久没写题解了,在家木有咖啡木有战斗力啊,写什么卡什么=。=,还好最拿手的数据结构顺利一点。。 题意是这样的有n个人,每个人有两个属性年龄a和支持率b,有个闲得蛋疼的人要在其中选若干人组成一个小组,必须满足以下两个条件,A.必须有一个leader,且leader必须是其中支持率最搞的一个人;B.小组中每个人与leader的年龄差距不得超过K。。。之后有若干个询问,问每次询问如果将i,j两个人弄到一个小组里,那这个小组最多能包含多少个人? 赤裸裸的数据结构,首先预处理每个人当leader的时候,小组人数 阅读全文
摘要:
http://codeforces.com/contest/260/problem/E 木有想到好办法,只会暴力处理=。=。。 先将所有坐标离散化,之后将9个块全排列枚举,知道每个位置最终含有节点数有可以通过2分求出x坐标已经y坐标上各自的两条分隔线,但是这样分隔并不一定是一个答案,剩下的判断即转化成求某个[xi,xj]内[yi,yj]的节点数量,这个问题可以用树套树logn^2来解决,最后200行代码ac,还好不怎么debug就通过了,但看着tourist超短的代码就知道我又太暴力了。。View Code 1 //By Lin 2 #include<cstdio> 3 #incl 阅读全文