09 2015 档案

摘要:一个区间一个区间的考虑,当前区间的决策只和上一次的末尾有关,考虑转移的时候先统计当前区间出现过的字母以及种数ct枚举上一个区间的末尾标号j,规定小于INF为合法状态,确定j之后看j有没有在当前的区间出现,如果出现则贪心选块数+ct-1,枚举当前的结尾。为了方便处理,增加一个0区间,初始为0,这样所有... 阅读全文
posted @ 2015-09-30 23:46 瑞宇 阅读(195) 评论(0) 推荐(0)
摘要:n的规模可以状压,f[x][y][S]表示x行,y列,S集合的巧克力能否被切割。预处理出每个状态S对应的面积和sum(S),对于一个合法的状态一定满足x*y=sum(S),实际上只有两个变量是独立的。而且有x,y等效与y,x,那么这里取max(x,y)。转移的时候枚举S的非空真子集,横着切或者竖着切... 阅读全文
posted @ 2015-09-29 18:48 瑞宇 阅读(488) 评论(0) 推荐(0)
摘要:如果状态定义为序号和重量的话,决策就是下一个垃圾捡或者不减,但是状态数太多了。如果只定义序号作为状态的话,决策就变成从前面的某个j一直捡到i才送回垃圾。这就变成了一个区间选最小值的问题,用单调队列维护。复杂度O(n)#includeusing namespace std;const int maxn... 阅读全文
posted @ 2015-09-29 17:59 瑞宇 阅读(227) 评论(0) 推荐(0)
摘要:这是一个零和博弈,最高得分只和序列以及谁先手有关。d[i][j],表示i到j的序列当前取的这个人的最高得分,转移以后状态是新的区间和另一个人取,从中取最小值。决策的最小值也可递推。#includeusing namespace std;const int MX = 101;int d[MX][MX]... 阅读全文
posted @ 2015-09-29 17:47 瑞宇 阅读(203) 评论(0) 推荐(0)
摘要:直接LCS是时间复杂度是O(p*q)的,但是序列元素各不相同,只要把其中一个序列映射成有序的,另外一个序列再做相同的映射,没有的直接删掉,就变成了求另一个序列LIS。#includeusing namespace std;int read(){ char c; while(c=getchar(... 阅读全文
posted @ 2015-09-29 17:40 瑞宇 阅读(267) 评论(0) 推荐(0)
摘要:先枚举两个矩形,每个矩形横着放或竖着放,把一边拼起来,如果不是拼起来有缺口就尝试用第三个矩形去补。如果没有缺口就横着竖着枚举一下第三个矩形和合并的矩形x或y拼接。#includeusing namespace std;const int N = 300+5;int ax[3][2],ay[3][2]... 阅读全文
posted @ 2015-09-28 21:41 瑞宇 阅读(214) 评论(0) 推荐(0)
摘要:按身高排序,每个人前面最高的人数有上限,如果超出上限说明impossible,每次考虑最小的人,把他放在在当前的从左往右第k+1个空位因为要求字典序最小,所以每次k和(上限-k)取min值。没有修改操作,只有删除,可用线段树维护空位数量s,每次类似名次树判断一下第k个空位在哪颗子树上(原来这叫划分树... 阅读全文
posted @ 2015-09-27 20:45 瑞宇 阅读(390) 评论(0) 推荐(0)
摘要:定义f[i]表示以i为开头往后的最长上升子序列,d[i]表示以i为结尾的最长上升子序列。先nlogn算出f[i],从i-L开始枚举f[i],表示假设i在最终的LIS中,往[0,i-L)里找到满足ai>aj中dj值最大的。用dj+f[i]更新。但是这样会少考虑一种情况,即i-L以后都不在最终的LIS里... 阅读全文
posted @ 2015-09-27 18:18 瑞宇 阅读(342) 评论(5) 推荐(0)
摘要:从D+1开始,对于一个数x,区间[x,x+lowbit(x))内的数字的二进制位上1的数量整体来说是单调不减的,因此可快速得出1在这个区间的取值范围。每次判断一下有没有和[s1,s2]有没有交集,一旦发现解就贪心最小的一个。复杂度是O(T*log(ans-D))#includeusing names... 阅读全文
posted @ 2015-09-27 18:12 瑞宇 阅读(411) 评论(0) 推荐(0)
摘要:每次操作是独立的,而且顺序并不影响,作用在同一个结点上的d可以叠加,所以令x(u) = sigma(dui).最后就是要确定所有的x(u)。因为m越大,满足条件的边就越少,二分答案m。对于一条边a->b,可以列出一个不等式d(a,b) +x(a)-x(b)>=m,移项可得x(b)-x(a)0,意味着... 阅读全文
posted @ 2015-09-26 19:01 瑞宇 阅读(440) 评论(0) 推荐(0)
摘要:Hold Your HandTime Limit: 1500/1000 MS (Java/Others)Memory Limit: 65535/102400 K (Java/Others)Total Submission(s): 169Accepted Submission(s): 38Proble... 阅读全文
posted @ 2015-09-25 00:18 瑞宇 阅读(326) 评论(0) 推荐(0)
摘要:E. Kefa and Watchtime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputOne day Kefa the parrot was walk... 阅读全文
posted @ 2015-09-24 00:13 瑞宇 阅读(269) 评论(0) 推荐(0)
摘要:用spfa,和dp是一样的。转移只和最后一个吃的dish和吃了哪些有关。把松弛改成变长。因为是DAG,所以一定没环。操作最多有84934656,514ms跑过,实际远远没这么多。脑补过一下费用流,但是限制流量不能保证吃到m个菜#includeusing namespace std;typedef p... 阅读全文
posted @ 2015-09-23 09:41 瑞宇 阅读(247) 评论(0) 推荐(0)
摘要:dfs一遍,维护当前连续遇到的喵的数量,然后剪枝,每个统计孩子数量判断是不是叶子结点。#includeusing namespace std;const int maxn = 2e5+5;int a[maxn];int head[maxn],nxt[maxnm) return; int ch ... 阅读全文
posted @ 2015-09-23 09:36 瑞宇 阅读(204) 评论(0) 推荐(0)
摘要:排序以后枚举尾部。尺取,头部单调,维护一下就好。排序O(nlogn),枚举O(n)#includeusing namespace std;typedef long long ll;//#define LOCALconst int maxn = 1e5+5;struct Node{ int m,... 阅读全文
posted @ 2015-09-23 09:34 瑞宇 阅读(181) 评论(0) 推荐(0)
摘要:有点麻烦的递推,递推的原则:向小的问题方向分解,注意边界。字符串的递推式为定义f为Si中的总方案数首先可以得到fi=fi-1+fi-2+组合(si-2,si-1)然后考虑Si-2和Si-1之间的组合为了得到小的问题,进行拆分为了以后表示的方便和逻辑上的清晰,把Si~Si之间的组合总长度定义出来因为这... 阅读全文
posted @ 2015-09-22 22:23 瑞宇 阅读(426) 评论(0) 推荐(0)
摘要:生成树的上的一个非根结点对应一条生成树上的边,然后这个结点的子树上连出去的边就对应去掉这条边的割,然后就可以对树外的边求LCA,在LCA上标记,利用这个信息可以算出有多少条边在子树上,以及有多少条边不再子树上。其实可以更进一步,非叶子结点一定不会比叶子结点更优,连的边只不会减少。所以只要统一叶子结点... 阅读全文
posted @ 2015-09-22 20:35 瑞宇 阅读(488) 评论(1) 推荐(0)
摘要:感谢这道题让我复习了一遍线代,还学习了一些奇奇怪怪的数论。令二项展开以后根号部分抵消了显然有所以要求的答案是如果n比较小的话,可以直接对二项式快速幂,但是这题n很大这个问题和矩阵的特征值以及数列递推有奇怪的联系广义的fibonacci数列的形式如下写成矩阵形式就是有一个奇怪的结论:其中lambda1... 阅读全文
posted @ 2015-09-22 20:27 瑞宇 阅读(593) 评论(2) 推荐(0)
摘要:今天第二次做BC,不习惯hdu的oj,CE过2次。。。1002 Clarke and problem和Codeforces Round #319 (Div. 2) B Modulo Sum思路差不多,将a[i]对p取余数,最后得到0的方案总数即使答案,dp转移,一个状态方案总数等于能转移过来的状态方... 阅读全文
posted @ 2015-09-19 23:16 瑞宇 阅读(220) 评论(0) 推荐(0)
摘要:平衡树的题,Treap破之,比较难搞的出现相同题数罚时的情况,解决方法是在每个结点用一个set,保证结点值的时候可以把题数和罚时保存到一个int里,令v = n*MaxPenaltySum-penalty。这样就可以很方便地做比较了。初始化有一定技巧。细节很多容易出错。 写静态版,如果有合并操作要内... 阅读全文
posted @ 2015-09-19 10:51 瑞宇 阅读(361) 评论(0) 推荐(0)
摘要:显然f(x)是个凹函数,三分即可,计算方案的时候dp一下。eps取大了会挂精度,指定循环次数才是正解。#includeusing namespace std;const double eps = 1e-11;const int maxn = 2e5+5;double a[maxn];double d... 阅读全文
posted @ 2015-09-17 09:53 瑞宇 阅读(211) 评论(0) 推荐(0)
摘要:首先应该保证二进制最高位尽量高,而位数最高的数乘x以后位数任然是最高的,所以一定一个数是连续k次乘x。当出现多个最高位的相同的数就枚举一下,先预处理一下前缀后缀即可。#includeusing namespace std;const int maxn = 2e5+5;int a[maxn];int ... 阅读全文
posted @ 2015-09-17 09:49 瑞宇 阅读(210) 评论(0) 推荐(0)
摘要:题目中给出的函数具有周期性,总可以移动到第一个周期内,当然,ausing namespace std;int main(){ int a,b; scanf("%d%d",&a,&b); if(a<b) puts("-1"); else { int t1 = a+b, ... 阅读全文
posted @ 2015-09-17 09:44 瑞宇 阅读(174) 评论(0) 推荐(0)
摘要:以前听过,不知道是什么,其实就是字符串首尾相连成一个环,n种切法求一个字典序最小的表示。朴素算法大家都懂。O(n)的算法代码非常简单,最主要的思想是失配的时候尽可能大的移动指针。另外附上一个不错的字符串算法总结:http://duanple.blog.163.com/blog/static/7097... 阅读全文
posted @ 2015-09-15 20:29 瑞宇 阅读(287) 评论(0) 推荐(0)
摘要:二分,判断的时候,一个点一个点的考虑肯定是不行啦,考虑的单位是一个区间,每次左端点尽量向左边移动,右端点尽量向右,得到下次可以达到的范围,检查一下和下一个区间有没有交集。#includeusing namespace std;const int maxn = 1e5+5, maxns = 1e6+5... 阅读全文
posted @ 2015-09-15 13:20 瑞宇 阅读(318) 评论(0) 推荐(0)
摘要:很容易想到二分,问题在与判断一个解的可行性。贪心,时间点最多两万,可以模拟每个时间点,将事件按开始时间排序,每次优先选已经开始了的且结束时间最早的任务来做,如果某个任务在deadline之前还没有结束说明当前解不可行。R的上界不太好估计,(远远达不到总和,但是比maxw大,因为任务在时间上有重叠),... 阅读全文
posted @ 2015-09-15 13:14 瑞宇 阅读(450) 评论(0) 推荐(0)
摘要:贪心,假如任意给出一个序列,如果两两交换了以后会变大,那么就交换,直到不能交换为止。#includeusing namespace std;const int maxn = 51;string s[maxn];int rk[maxn];bool cmp(int x,int y){ int i ... 阅读全文
posted @ 2015-09-15 13:01 瑞宇 阅读(202) 评论(0) 推荐(0)
摘要:问题可以转化为草坪的边界被完全覆盖。这样一个圆形就换成一条线段。贪心,从中选尽量少的线段把区间覆盖,按照把线段按左端点排序,记录一个当前已经覆盖区间的位置cur,从左端点小于等于cur选一个右端点最大的作为这次选的区间,如果没有符合条件的,说明不可能完全覆盖。r*r会爆int...#includeu... 阅读全文
posted @ 2015-09-15 12:54 瑞宇 阅读(233) 评论(0) 推荐(0)
摘要:UVA 11636 Hello World二的幂答案就是二进制长度减1,不是二的幂答案就是是二进制长度。#includeint main(){ int n,kas = 0; while(scanf("%d",&n),n>0){ int r = 0; for(n... 阅读全文
posted @ 2015-09-15 08:01 瑞宇 阅读(223) 评论(0) 推荐(0)
摘要:把一个人看出一个二维的点,优势的点就是就原点为左下角,这个点为右上角的矩形,包含除了右上角以外边界,其他任意地方不存在点。那么所有有优势的点将会形成一条下凹的曲线。因为可能有重点,用multiset,按照x优先,相同时再比较y的顺序排序,动态维护满足条件的总人数。当新加的P点的y坐标大于左边的点的时... 阅读全文
posted @ 2015-09-13 18:12 瑞宇 阅读(225) 评论(0) 推荐(0)
摘要:删除边的操作不容易实现,那么就先离线然后逆序来做。逆序就变成了合并,用并存集判断连通,用Treap树来维护一个连通分量里的名次。Treap = Tree + Heap。用一个随机的优先级来平衡搜索树。名次查询需要维护树的结点数量,假设当前在u点,u的左子树有n个结点,那么u的就是以u为根的树上第n+... 阅读全文
posted @ 2015-09-13 18:12 瑞宇 阅读(171) 评论(2) 推荐(0)
摘要:Elven PostmanTime Limit: 1500/1000 MS (Java/Others)Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 0Accepted Submission(s): 0Problem D... 阅读全文
posted @ 2015-09-13 14:36 瑞宇 阅读(271) 评论(0) 推荐(0)
摘要:TravelTime Limit: 1500/1000 MS (Java/Others)Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 46Accepted Submission(s): 20Problem Descri... 阅读全文
posted @ 2015-09-13 14:24 瑞宇 阅读(219) 评论(0) 推荐(0)
摘要:PondsTime Limit: 1500/1000 MS (Java/Others)Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 0Accepted Submission(s): 0Problem Descripti... 阅读全文
posted @ 2015-09-13 14:15 瑞宇 阅读(174) 评论(0) 推荐(0)
摘要:直接O(n*m)的dp也可以直接跑过。因为上最多跑到m就终止了,因为前缀sum[i]取余数,i = 0,1,2,3...,m,有m+1个余数,m的余数只有m种必然有两个相同。#includeusing namespace std;const int maxn = 1e3+5;int cnt[maxn... 阅读全文
posted @ 2015-09-11 09:35 瑞宇 阅读(181) 评论(0) 推荐(0)
摘要:因为所有整数都能被唯一分解,p1^a1*p2^a2*...*pi^ai,而一次询问的数可以分解为p1^a1k*p2^a2k*...*pi^aik,这次询问会把所有a1>=a1k && a2 >= a2k &&...a3 >= a3k的数从原来的集合中分开。ai表示pi的幂。那么只有当这个数的素因子的... 阅读全文
posted @ 2015-09-11 03:57 瑞宇 阅读(224) 评论(3) 推荐(0)
摘要:用把失配边也加到正常边以后AC自动机,状态是长度递减的DAG,每次选一个不会匹配字符的转移。dp[u][L]表示当前在tire树上u结点长度还剩L时候不匹配的概率,根据全概率公式跑记忆化搜索。#includeusing namespace std;typedef double ld;const in... 阅读全文
posted @ 2015-09-10 16:47 瑞宇 阅读(193) 评论(0) 推荐(0)
摘要:二维的矩阵匹配,把模式矩阵按列拆开构造AC自动机,记录行号(为了缩点判断)。把T矩阵按行匹配,一旦匹配成功,在假想的子矩阵左上角位置加一。最后统计总数。因为所有模式串长度一样,不用维护last数组。模式串可能有重复,结点要用vector来存。HASH出奇迹,快得不行。。。#includeusing ... 阅读全文
posted @ 2015-09-10 16:35 瑞宇 阅读(307) 评论(0) 推荐(0)
摘要:AC自动机的裸题。学了kmp和Trie以后不难看懂。有一些变化,比如0的定义和f的指向,和建立失配边,以及多了后缀连接数组last。没有试过把失配边直接当成普通边(一开始还是先这样写吧)。#includeusing namespace std;const int maxlen = 1e6+5, ma... 阅读全文
posted @ 2015-09-09 21:24 瑞宇 阅读(292) 评论(0) 推荐(0)
摘要:kmp的代码很短,但是不太容易理解,还是先说明一下这个算法过程吧。朴素的字符串匹配大家都懂,但是效率不高,原因在哪里?匹配过程没有充分利用已经匹配好的模版的信息,比如说,i是文本串当前字符的下标,j是要匹配的模版串当前正在匹配的字符的下标。(下标都从零开始,j同时可以表示已经匹配的字符长度)当匹配到... 阅读全文
posted @ 2015-09-09 15:57 瑞宇 阅读(308) 评论(1) 推荐(0)
摘要:先两两比较,比较次数是两者相同的最长前缀长度*2+1,比较特殊的情况是两者完全相同时候比较次数是单词长度*2+2,两个单词'末尾\0'和'\0'比较一次,s尾部'\0'和循环内'\0'比较一次。因此,对于一个单词,只要知道和它某个相同的最长前缀的单词数就可以计算出方案数了。用tire,记录一颗子树上... 阅读全文
posted @ 2015-09-09 08:48 瑞宇 阅读(289) 评论(4) 推荐(0)
摘要:状态是DAG,因此方案用dp统计,dp[i] = sum(dp[i+len(x)]),x是以i开头的前缀且是单词,关键在于快速判断一个前缀是不是单词,可用Trie。每一次转移的复杂度是O(maxlen),maxlen是单词的最长长度。#includeusing namespace std;const... 阅读全文
posted @ 2015-09-09 08:32 瑞宇 阅读(245) 评论(0) 推荐(0)
摘要:题意:求一个动态区间的最大连续和。静态版本的O(n)算法显示不适用了,但是可以用线段树分治,因为一个连续和要在两边的区间,要么跨越两边,对于一个结点维护最大前缀和,后缀和,子区间连续和。题目要求输出区间,所以还要保存连续和最大的区间,以及前缀和,后缀和的位置。为了维护最大前缀和以及后缀和还需要一个区... 阅读全文
posted @ 2015-09-08 18:05 瑞宇 阅读(460) 评论(0) 推荐(0)
摘要:询问静态区间最值的Sparse—Table(Tarjan提出)的算法。这个算法的思想是一个dp,dp[i][j]表示i开头长度为2^j的区间内的最值,然后倍增转移。这道题询问的是出现次数,相同的数字是连续出现的,先把连续出现的数字按段编号,记录出现的次数。因为题目询问给的是原来的数字的下标,记录一下... 阅读全文
posted @ 2015-09-08 17:49 瑞宇 阅读(417) 评论(0) 推荐(0)
摘要:枚举中间的人,只要知道在这个人前面的技能值比他小的人数和后面技能值比他小的人数就能计算方案数了,技能值大的可有小的推出。因此可以利用树状数组,从左到右往树上插点,每个点询问sum(a[i]-1)就是前面的技能值比它小的人数,然后再从右边往左重复一遍就可以算出答案。#includeusing name... 阅读全文
posted @ 2015-09-08 17:17 瑞宇 阅读(186) 评论(0) 推荐(0)
摘要:简单题,题目要求显然是很多次插入,所以是链表。插入两个语句,nxt[i] = nxt[u] 表示 i结点指向u的后继, nxt[u] = i表示把u的后继设成i。设置一个头结点,指向一个不存在的结点,维护一下最后一个结点tail。#includeusing namespace std;const i... 阅读全文
posted @ 2015-09-07 23:19 瑞宇 阅读(158) 评论(0) 推荐(0)
摘要:题意:对一个矩阵进行子矩阵操作。元素最多有1e6个,树套树不好开(我不会),把二维坐标化成一维的,一个子矩阵操作分解成多条线段的操作。一次操作的复杂度是RlogC,很容易找到极端的数据(OJ上实测没有),如果判断一下然后启发式建树复杂度是min(RlogC,ClogR)。代码中结点没有保存l和r,而... 阅读全文
posted @ 2015-09-07 23:02 瑞宇 阅读(215) 评论(0) 推荐(0)
摘要:此题最难处理的操作就是将一个单点改变集合,而普通的并查集是不支持这种操作的。当结点p是叶子结点的时候,直接pa[p] = root(q)是可以的,p没有子结点,这个操作对其它结点不会造成任何影响,而当p是父结点的时候这种操作会破坏子节点的路径,因此必须保留原来的路径。我们希望pa[p] = root... 阅读全文
posted @ 2015-09-07 22:49 瑞宇 阅读(159) 评论(0) 推荐(0)
摘要:从包含k个整数的k个数组中各选一个求和,在所有的和中选最小的k个值。思路是多路归并,对于两个长度为k的有序表按一定顺序选两个数字组成和,(B表已经有序)会形成n个有序表A1+B1比较,而现在需要同时合并n个有序表,优先队列(堆)就派上用场了。类似归并排序用i和j维护有序表当前考虑元素,合并的时候,每... 阅读全文
posted @ 2015-09-07 22:20 瑞宇 阅读(202) 评论(0) 推荐(0)
摘要:一个叫差分约束系统的东西。如果每个点定义一个顶标x(v),x(t)-x(s)将对应着s-t的最短路径。比如说w+a≤b,那么可以画一条a到b的有向边,权值为w,同样地给出b+w2≤c,a+w3≤c。那么a到c的最大差就受这些不等式约束,对应着图中的最短路。这个边多,不要用vector存,满了以后重新... 阅读全文
posted @ 2015-09-06 09:45 瑞宇 阅读(220) 评论(2) 推荐(0)
摘要:不错的树形dp。一个结点能走多次,树形的最大特点是到达后继的路径是唯一的,那个如果一个结点无法往子结点走,那么子结点就不用考虑了。有的结点不能走完它的子结点,而有的可能走完他的子节点以后还会剩下一些点数。影响走的次数的是当前结点的点数,因为往子结点走是一定要回来的,进入这个结点要花费这个结点一个点数... 阅读全文
posted @ 2015-09-06 08:51 瑞宇 阅读(237) 评论(0) 推荐(0)
摘要:模拟题,map搞一搞。要想清楚一个结点应该是要通过一个字符串找到下一个结点,题目保证所以文件夹非空,所以只要判断一个结点是不是叶子结点就可以判断它是不是文件,用了点c11的特性。#includeusing namespace std;typedef map Node;map::iterator it... 阅读全文
posted @ 2015-09-05 23:09 瑞宇 阅读(252) 评论(0) 推荐(0)
摘要:线段树区间更新维护最小值。。。记得下放标记。。。如果线段树上的一个完整区间被修改,那么最小值和最大值增加相应的值后不变,会改变是因为一部分改变而另外一部分没有改变所以维护一下就好。询问的时候也要记得下放标记。。。数据结构快忘了,贴个板。#includeusing namespace std;type... 阅读全文
posted @ 2015-09-05 19:55 瑞宇 阅读(236) 评论(0) 推荐(0)
摘要:每个加油的站可以确定一个alpha的上下界,比如,第i次加油站a[i],前面加了i次油,a[i]*10≤ alpha*i using namespace std;typedef long long ll;ll gcd(ll a,ll b) { return b?gcd(b,a%b):a; }stru... 阅读全文
posted @ 2015-09-05 17:47 瑞宇 阅读(323) 评论(0) 推荐(0)
摘要:问题是求一个方案,实际隐含一个dp。法力是递减的,所以状态是DAG,对于一个确定的状态,我们贪心地希望英雄的血量尽量大。分析:定义状态dp[i][p][h]表示是已经用了i的法力值,怪兽的位置在p,怪兽的总血量为h时候英雄所具有的最大血量,采用刷表法,决策有:使用雷击,h变成h-L[p],p变成ma... 阅读全文
posted @ 2015-09-04 23:03 瑞宇 阅读(275) 评论(0) 推荐(0)
摘要:其实挺简单的。先直接算出之前已经排在k这个数前面的数字。比如543是三位的,那么100~543都是可以的,两位的10~54。如果还需要往前面补的话,那么依次考虑1000~5430,5430是上界不能选,10000~54300。有一种情况样例4是10000~10000,,这样是不会增加的应该输出'0'... 阅读全文
posted @ 2015-09-04 21:35 瑞宇 阅读(433) 评论(0) 推荐(0)
摘要:二分法+spfa判负环。如果存在一个环sum(wi)using namespace std;const int maxn = 51;struct Edge{ int v,nxt; double w;};vector edges;int head[maxn];#define PB push... 阅读全文
posted @ 2015-09-04 10:37 瑞宇 阅读(164) 评论(0) 推荐(0)
摘要:从终点逆推,d[u]表示进入u以后剩下的货物,那么进入u之前的货物数量设为y,d[u] = x,那么y-x=ceil(y/20.0)=(y-1)/20+1=(y+19)/20。(y-x)*20+r=y+19,0≤r≤19,即19*y=20*x+r,根据题意y应该尽量小,x的部分是不能变动的,所以y=... 阅读全文
posted @ 2015-09-03 21:41 瑞宇 阅读(228) 评论(0) 推荐(0)
摘要:题意:在连通图中,求一条边使得加入这条边以后的消除的桥尽量多。在同一个边双连通分量内加边肯定不会消除桥的,求边双连通分量以后缩点,把桥当成边,实际上是要选一条最长的链。缩点以后会形成一颗树,一定不存在环否则和桥的定义矛盾,求树上的最远点对。树上的最远点对用dp TLE了,实际上两次dfs就行了,第一... 阅读全文
posted @ 2015-09-03 18:33 瑞宇 阅读(360) 评论(0) 推荐(0)
摘要:预处理+暴力,每个颜色都是独立的,求个前缀和,减一减判断一个在区间内颜色是否存在。算了算复杂度好像有点勉强,但是还是过了,学了主席树以后用主席树在做一下#includeusing namespace std;const int maxn = 1e4+4;const int maxm = 256;in... 阅读全文
posted @ 2015-09-03 18:25 瑞宇 阅读(214) 评论(0) 推荐(0)
摘要:打个表找找规律,到24445的时候乘2以后产生了0出现循环。一般地,判断循环节是否存在可以用Floyd判圈算法。#includeusing namespace std;typedef long long ll;int ans[]{-1,1,2,4,8,16,23,46,29,58,116,223,4... 阅读全文
posted @ 2015-09-03 18:20 瑞宇 阅读(226) 评论(2) 推荐(0)
摘要:很多的边会被删掉,需要排除一些干扰进行优化。和UVA - 1279 Asteroid Rangers类似,本题最关键的地方在于,对于一个单源的最短路径来说,如果最短路树上的边没有改变的话,那么最短路肯定是不会变的,所以只要枚举删掉最短路树上的边。这样的时间复杂度就能过了。#includeusing ... 阅读全文
posted @ 2015-09-02 23:50 瑞宇 阅读(264) 评论(0) 推荐(0)
摘要:求出家到其他点的最短路径,题目的条件变成了u->v不是回头路等价于d[u]>d[v]。然后根据这个条件建DAG图,跑dp统计方案数,dp[u] = sum(dp[v])。#includeusing namespace std;const int maxn = 1001, maxm = 2002;st... 阅读全文
posted @ 2015-09-02 18:47 瑞宇 阅读(173) 评论(0) 推荐(0)
摘要:题目只有一条路径会发生改变。常见的思路,预处理出S和T的两个单源最短路,然后枚举商业线,商业线两端一定是选择到s和t的最短路。路径输出可以在求最短路的同时保存pa数组得到一棵最短路树,也可以用dist数组检查。#includeusing namespace std;const int maxn = ... 阅读全文
posted @ 2015-09-02 10:20 瑞宇 阅读(242) 评论(0) 推荐(0)
摘要:用布尔变量表示状态,把限制条件转化为XνY的形式以后跑2SAT,根据变量取值输出方案。#includeusing namespace std;const int maxn = 1e5+5;#define PB push_backbool vis[maxn*2];vector G[maxn*2];in... 阅读全文
posted @ 2015-09-02 08:37 瑞宇 阅读(181) 评论(0) 推荐(0)
摘要:题目的要求一个最小值最大,二分即可,但是怎么判断呢?飞机早或者晚两种状态,可以用一个布尔变量表示,假设当前猜测为m,那么根据题意,如果x和y所对应的时间冲突那么就是¬(xΛy)化成或的形式(¬x)V(¬y),就可以套用twoSAT了。关于2-SAT,简单理解是,把逻辑推导变成一条有向边,然后跑图判断... 阅读全文
posted @ 2015-09-02 00:23 瑞宇 阅读(277) 评论(0) 推荐(0)
摘要:给出一个有向图,求一个最大的结点集合,任意两个点u,v。u可到达v或v可到达u。一个强连通分量肯定一起选的。而且只能在一条路径上。所以先找出所有scc,然后缩点找一条最大权的路径,按拓扑序跑DAG上的dp。注意0,0这组数据#includeusing namespace std;const int ... 阅读全文
posted @ 2015-09-01 22:45 瑞宇 阅读(172) 评论(0) 推荐(0)
摘要:把证明的关系看出一张图,最终就是要所有的点都在至少一个环中。环的判断和度数有关。用tarjan找强连通分量,在一个强连通分量点已经等价缩点以后形成一个DAG,计算入度为0的点数a,出度为0的b,取其中大的一个。特判强连通分量数为1的情况。看懂tarjan算法以后还是比较简单的#includeusin... 阅读全文
posted @ 2015-09-01 21:38 瑞宇 阅读(202) 评论(0) 推荐(0)
摘要:补题,逆序考虑每个询问的时间,这样每次就变成出现新岛屿,然后用并查集合并统计。fa = -1表示没出现。以前写过,但是几乎忘了,而且以前写得好丑的,虽然常数比较小,现在重新写练练手。每个单词后面都要加空格不然PE#includeusing namespace std;const int maxn =... 阅读全文
posted @ 2015-09-01 19:45 瑞宇 阅读(359) 评论(0) 推荐(0)
摘要:题意:在一颗树上要求一个到其他结点容量和最大的点,i,j之前的容量定义为i到j的路径上的最小边容量。一开始想过由小到大的去分割边,但是很难实现,其实换个顺序就很容易做了,类似kruskal的一个贪心算法,从大到小的连边,每次连通两个分量A和B,这样可以新边容量一定是两个分量相互到达的最小容量,其余边... 阅读全文
posted @ 2015-09-01 18:05 瑞宇 阅读(416) 评论(0) 推荐(0)
摘要:题意比较坑,移动完以后的士兵不能再次移动,不然样例都过不了。。。最小值最大满足决策单调性所以二分答案,跑网络流验证是否可行。这种题重点在建图,为了保证只移动一次,拆点,一个入点一个出点,到了出点的自然不能再次调度。不在边界上的边连一条容量为1的边表示至少留一个人,在边界上的与T的连边就设置成mid。... 阅读全文
posted @ 2015-09-01 12:57 瑞宇 阅读(302) 评论(0) 推荐(0)