随笔分类 - CF TC
摘要:Water Tree给出一棵树,有三种操作:1 x:把以x为子树的节点全部置为12 x:把x以及他的所有祖先全部置为03 x:询问节点x的值分析: 昨晚看完题,马上想到直接树链剖分,在记录时间戳时需要记录一下出去时的时间戳,然后就是很裸很裸的树链剖分了。 稳稳的黄名节奏,因为一点私事所以没做导致延迟了 (ps:后来想了一下,不用树链剖分直接dfs序维护也行。。。)#include #include #include #include #include #include #include #include #include #include #include #include usin...
阅读全文
摘要:118EBertownroads题目:把无向图指定边的方向,使得原图变成有向图,问能否任意两点之间互达分析:显然如果没有桥的话,存在满足题意的方案。输出答案时任意从一个点出发遍历一遍即可。求桥的话,利用tarjan算法的low和dfn值判断一下即可。#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long ll;typedef unsigned long long
阅读全文
摘要:比赛时,开了大号去做,算了半天发现不会做A,囧。于是跑去看B,发现很水?于是很快敲完了,但是A不会,没敢交。于是去看C,一直找规律啊,后来总算调了出来,看了一下榜,发现还是算了吧,直接去睡觉了。第二天一起床把代码一交,居然A了,发现交的话rating还能涨一点,囧。B:其实就是求一个最长不下降子序列的长度。注意到数据范围,使用二分的方式求解。#include #include #include #include #include #include #include #include #include #include #include #include using namespace st..
阅读全文
摘要:树链剖分可以看成是树的边分治,什么是点分治呢?CF322E -Ciel the Commander题目:给出一棵树,对于每个节点有一个等级(A-Z,A最高),如果两个不同的节点有相同等级的父节点(节点不一定相同),则两个节点的路径上最少有一个比他们两的等级都高的节点。要求输出1~n的等级。分析:考虑一条链的情况,如果把A放中间,把数列分成两段,对于每一段,中间放B,这样分成了四段,对于每一段继续这样分,显然26个字母可以安放2^26个位置。 对于树这种结构的话,如何安放? 类似于一条链的情况,根放A,然后分成的每一条子链中间放B。。。 但是怎么知道中间的B在哪呢? 不妨考虑树的点分治,...
阅读全文
摘要:开了个小号做,C题一开始看错范围,D题看了半小时才看懂,居然也升到了div1,囧。C - Xenia and Weights给出一串字符串,第i位如果是1的话,表示有重量为i的砝码,如果有该种砝码的话,数量有无限多个。现在往天平的两侧放入,每次放入的要求:1.每次放入时和上次放入的砝码的重量不能一样。2.放入的那端天平必须必另一端重。问能否放入n次,能的话,求放入方式。分析: 比赛时看到很多人写的是贪心,但是想不到有什么好的数据叉掉他们,囧。 我写的是直接dfs爆搜。代码略吧。D - Xenia and Bit Operations这题挺有意思的。只不过比赛时纠结了半个小时的题意,看懂了之..
阅读全文
摘要:在div 188中,幸运的达成了这学期的一个目标:CF1800+,所以这次可以打星去做div2,有点爽。A.Flipping Game直接枚举B.Hungry Sequence 由于素数的分布大概10个中有一个,所以直接筛法筛1e5个即可。C. Magic Five 删除串s中的某些字符,使得他整除5,并且跟删除顺序有关,现在问有k个串s连在一起组成一个新的串,问新的串有多少种删除方式。我们可以先看每一个串,由于整除5的数的末尾只能为0或者5。用样例二 13990作为说明。考虑只有一个时,在13990中,只有第4位(从0开始算),则前面有2^4中删除方式。如果加上一个,即1399013990时
阅读全文
摘要:题目:点这跟这题BZOJ2002: [Hnoi2010]Bounce弹飞绵羊 一模一样分析: 分块数组入门题。 具体的可以学习这篇博文以及做国家集训队2008-苏煜《对块状链表的一点研究》这篇论文上面的几道题目。#include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long ll;typedef unsigned long long ull;#define debug put...
阅读全文
摘要:对于动态凸包添加的问题的一般做法: 如上图。我们知道,如果能够有一种数据结构可以维护一下凸包上的顶点与原点的角度,对于插入一个点now的时候,我们就可以二分出点的位置,然后找到比他角度小的上一个顶点pre以及比他角度大的下一个顶点next,通过判断now跟next,pre的叉积正负来判断点now是否在凸包内。 对于需要插入不在凸包中的点时,我们找出了pre,next之后,需要分别通过维护上凸包以及下凸包,把多余的点从平衡树中删掉。例如上图中,由于next_next可以被now“看见”,所以next需要被删掉,删掉next之后继续判断next_next是否需要删掉,直到不能够删掉为止。对于下..
阅读全文
摘要:题目在这: 给出三种操作: 1.增加点(x,y) 2.删除点(x,y) 3.询问在点(x,y)右上方的点,如果有相同,输出最左边的,如果还有相同,输出最低的那个点 分析: 线段树套平衡树。 我们先离散化输入的x坐标,然后以每个坐标建立一棵平衡树来维护,这里可以直接用set或者map来维护就行了。 然后我们现在需要在x的右方找到最左最下大于(x,y)的点。 建立一棵线段树,维护的是区间的纵坐标的最值,而线段树的端点为离散后x的值。 1.我们每次插入的时候,直接在相应的平衡树中插入,然后更新一下线段树的区间最值。 2.删除时,直接删掉,更新一下最值。 3.询问时,对于整...
阅读全文
摘要:題目: 如果一個數的各位數字均為a或者b,則這數為good number。如果一個goodnumber的各數字和為good number的話,這個數為excellent。給出a b以及數的長度為len,問長度為len的數中有多少個excellent數分析: 比較明顯的組合數。 我們可以枚舉有i個a,然後剩餘len-i個b。 如果a*i+(len-i)*b為good,我們可以從len個位置中選出i個位置放a,剩餘的len-i個位置放b。所以當前的組合數為C(len,i)。 答案即為sigma(C(len,k)),a*k+(len-k)*b為goo...
阅读全文
摘要:一维的差分数列如下定义:假设原数组为a[1]...a[n],a[0] = 0差分数列数组为d[1]...d[n]则d[i] = a[i]-a[i-1] (d数组初始化)題目: 給出原始數列a[1]...a[n] 給出m個操作方式: l r val 表示把a[l],...,a[r]都增加val 現在需要執行以下op條操作: x y 表示執行第x條操作方式到第y條操作方式 詢問:最終的數列a分析: 一:線段樹 顯然可以用線段樹成段更新。 1.對於每個操作,我們可以用樹狀數組、線段樹、差分數列,統計一下每條操作方式的次...
阅读全文
摘要:題目: 有50斤的人c1人,100斤的人c2人。現在他們需要過河,但是只有一條船,並且船的載重重量不超過k。問有多少種方法 使得運人過河的次數最少。分析: 三維DP。 由於從河的對岸過來以及過去河的對岸是等價的,所以我們直接考慮單次過河的情況。 dp[i][x][y]表示第i次過河,過河之後對岸有50斤的人x,100斤的人y的方法數。 我們假設第n次過河的人的個數為i,j,過河前河岸有x,y人,所以過完河之後河的對岸有c1-x+i,c2-y+j人。 所以轉移方程為 dp[n][c1-x+i][c2-y+j] += dp[n-1][x][y]*comb[x][i]...
阅读全文
摘要:代碼如下#include <set>#include <map>#include <cmath>#include <queue>#include <stack>#include <string>#include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;typed
阅读全文
摘要:题目here: 给出n个数,现在有m个区间询问l[i],r[i],问如何重新排列这n个数,使得 询问的和值最大分析: 方法一:差分数列 一维的差分数列如下定义: 假设原数组为a[1]...a[n],a[0] = 0 差分数列数组为d[1]...d[n] 则d[i] = a[i]-a[i-1] (d数组初始化) 我们发现:a[i] = sigma(d[i]) 所以我们对于区间[l,r]执行加同一个数的时候,我们可以执行 d[l] += val , d[r+1] -= val; 最终,我们可以用差分数列的累加和计算a[i]的值。#i...
阅读全文