随笔分类 - OI
Good Bye 2015 D. New Year and Ancient Prophecy
摘要:D. New Year and Ancient Prophecytime limit per test2.5 secondsmemory limit per test512 megabytesinputstandard inputoutputstandard outputLimak is a lit...
阅读全文
轮廓线DP POJ3254 && BZOJ 1087
摘要:补了一发轮廓线DP,发现完全没有必要从右往左设置状态,自然一点: 5 6 7 8 91 2 3 4如此设置轮廓线标号,转移的时候直接把当前j位改成0或者1就行了。注意多记录些信息对简化代码是很有帮助的,尤其对于我这种代码经常错的一塌糊涂的人来说。。呆马:POJ 3254 Corn Field...
阅读全文
bzoj 1162 network
摘要:树上的区间第k小数,以前写的主席树是一直MLE的,后来看到一种在初始化的时候的优化:直接DFS这颗树,得到每个点的主席树,然后更新的时候另外对DFS序建主席树,答案加上初始每个点的主席树,这样在初始化每个点的时候就不需要用BIT维护了,省去的空间正好AC了这个题。呆马: 1 #include ...
阅读全文
Hiho 1232 北京网络赛 F Couple Trees
摘要:给两颗标号从1...n的树,保证标号小的点一定在上面。每次询问A树上的x点,和B树上的y点同时向上走,最近的相遇点和x,y到这个点的距离。比赛的时候想用倍增LCA做,但写渣了。。。。后来看到题解是主席树就写了一发呆马: 1 #include 2 #include 3 #include ...
阅读全文
Hdu 4681 2013 Multi-University Training Contest 8 String
摘要:带跨越式的LCS,同样是在朴素的LCS上加入一种跨越一段的转移,这样我们要预处理出跨越一段给定串的转移函数。这个题同样可以正反两边LCS做呆马: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #define inf 0x3...
阅读全文
Hdu 5489 合肥网络赛 1009 Removed Interval
摘要:跳跃式LIS(nlogn),在普通的转移基础上增加一种可以跨越一段距离的转移,用一颗新的树状数组维护,同时,我们还要维护跨越完一次后面的转移,所以我用了3颗树状数组。。比赛的时候一句话位置写错了,然后就。。。雪崩呆马: 1 #include 2 #include 3 #include 4 #i...
阅读全文
Hdu 5493 合肥网络赛 1010 Queue
摘要:在线求第k大,第一次用二分+树状数组写。。。比赛的时候分治啊,splay啊,主席树啊换来换去,然而以前为什么不知道可以这么写。。。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include ...
阅读全文
Hiho coder 1236 2015 北京网络赛 Score
摘要:五维偏序。。一开始被吓到了,后来知道了一种BITSET分块的方法,感觉非常不错。呆马: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define inf 10000000...
阅读全文
JAG Summer 2012 Day 4 C Connect
摘要:状压dp,由于枚举两维状态会GG,所以只枚举当前位置前m个的状态,就是这个样子大概= =;呆马: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define...
阅读全文
关于树状数组区间最值
摘要:居然最近才发现BIT是可以用来求最值的233,道理和线段树差不多,因为树状数组里每个点存储的数据范围是[i-lowbit(i)+1,i],而任意一个区间都是可以被许多段这样的小区间所覆盖的,那么我们就可以用这些小区间的最值来更新所求区间的最值了。 1 struct max_bit 2 { 3 ...
阅读全文
Gym 100500B
摘要:题目给了四个轮子,每个轮子上有按顺序排列的n个数,要求适当旋转每个轮子,使得四个轮子相同行数相加和相同。首先,可以计算出每一行的和应该是多少,记为Sum。然后固定第一个轮子,二重循环枚举2、3轮子,然后O(n)判断1+2+3是否等于Sum-4,这样时间复杂度是O(n^3)。那么,只要把判断过程复杂度...
阅读全文
RQNOJ Bus
摘要:H城是一座小城市,前几日才刚刚建立公交系统,且只有一辆公交车。于是,如何最大化这唯一一辆公交车的载客量成了亟待解决的问题。H城的俯视图可以近似地看成是一个棋盘网络——共有N行M列,从南向北,每行从1到M标号,从西向东,每列从1到N标号。经实地考察,公交总公司选定了K个可以设为站点的地方,其中第K个站点位于第Xi列,第Yi行,预计每天有Pi名乘客需要在此乘车。设有序数对(X,Y)表示第X列,第Y行。每天,公交车从(1,1)开出,驶向(N,M),途中只能向北或向东行驶。现在,公交总公司希望你能够帮助他们选定一条路线,使得能够接到的乘客数最大,我们假设公交车的容量无限大。输入格式一个非负整数ans,
阅读全文
bzoj3126 [Usaco2013 Open]Photo
摘要:省选前最后一天填坑...... 其实这个题早就想过,一直懒得写。我发现我写单调队列一次一个样,真是郁闷。 简述题意就是给你一个n长度的数轴和m个区间,每个区间里有且仅有一个点,问能有多少个点。 我们考虑用f[i]表示前i个位置能放多少个,每一步决策有两个限制:1.每个区间里要有一个点,这样我们可以确定决策区间左边界;2.每个区间里只能有一个点,这样我们可以确定右边界。如果有地方左边界大于右边界了就是一定不能放点了。 单调队列的话,首先让[ L[I],R[I] ]区间的f值入队,然后把队首不在这个决策区间里的出队,然后转移f[q[head]]就行了。 总结起来,单队大概有两种,一种...
阅读全文
bzoj3100 排列
摘要:这个题有点恶心啊,总觉得以前做过,可就是想不出来。最后在发现是meng神出的一次模拟赛题= =当时我还P都不会呢... 这个题有两个关键点,一个是选取的子序列内不能有重复,二是选取的子序列要是一个排列(当然这包含了一)。首先如果确定了不会重复,那么只要子序列内的数的和等于(len+1)*len/2就行了,那么怎么确定不重复呢? 我们可以O(N)时间求出来每个数两边第一个和它相同的数的位置(L,R),这样我们可以不断地更新合法的序列的范围。 具体方案:我们先确定每一个1的位置(因为每个区间首先必须有1),按照这个来划分区间。我们先从左到右扫每个区间,相当于枚举了右端点k(我们要包含那个...
阅读全文
bzoj1444 [Jsoi2009]有趣的游戏
摘要:这个题是一道AC自动机上的概率DP,可以帮助理解一下AC自动机的结构。 首先我们把所有的串插入trie,建立AC自动机,求一下转移函数(相当于构造一个trie图),那么就可以概率DP了。首先到达每个点的概率为变量,然后我们要求的就是到达接受状态(也就是每个串的结尾对应的状态)的概率。注意到了接受状态就不必往下转移了,因为游戏就此结束了。注意有一个限制是必须要加的,就是所有接受状态的概率和是1。如果不加的话,会得到所有点的概率等于0这个答案。那么我们就随便拿一个方程替换这个方程就好了。 1 #include<iostream> 2 #include<cstdio> 3 #
阅读全文
bzoj1449 [JSOI2009]球队收益
摘要:这是一道凸费用的题,需要用到拆边的转化。 具体是这样,首先列出关于流量xi的费用式子:f(xi)=ci*xi2+di*(si-xi)2=(ci+di)*xi2-2*di*si*xi+di*si 其中si表示i进行的总常数,xi表示胜场数(也就是规定的流量)。显然这样的式子是不能定费用的,但我们可以求一下每增加1的流量费用的改变量:f(xi)-f(xi-1)=(ci+di)*(2*xi-1)-2*di*si 这样我们可以把每1单位的流量设置一个费用,也就是把原来一条边拆成若干条边,第i条边如果对应第wi个胜场,那么它的费用应该是(ci+di)*(2*wi-1)-2*di*si,注意这里wi...
阅读全文
poj3415 Common Substrings
摘要:一道字符串好题。网上大多解法是后缀数组+栈扫描,大致思想是按K分组以后统计s,t中不同公共字串的个数。但这种方法我实在是理解不能...... 其实,用后缀自动机来考虑这个题可能会好一点。首先,我们给S串建立后缀自动机,然后让T串在S串上跑一下匹配,这是后缀自动机的经典操作。这样我们可以求得T的每一位向前最大能匹配多少位,用这个数目来统计答案。但是有一个问题,就是假设T的某一位u匹配了x长度,那么有可能S中有多个位置对应和T的u匹配x长度,于是我们首先就要知道每个点对应多少重复的字串。这恰恰应用了后缀自动机第二个经典操作。 好,我们来理一下思路:首先,给S建自动机以后,我们用排序+递推的...
阅读全文
三维偏序
摘要:贴个三维偏序的模板吧。注意清空bit的时候操作数不要和序列长线性相关。如果上一个题插入的数是无序的话,大概这么做就行了。 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #define maxn 200000 7 #define inf 2147483647 8 using namespace std; 9 struct point{10 int x,y,z,s;11 }a[max
阅读全文
bzoj3144 [Hnoi2013]切糕
摘要:这个题是个挺经典的最小割。 这个题的关键是如何限制h之差不超过d。首先我们按高度分层,每层的点向下一层相同位置的点连边,边权设为点权(也就是说我们要多设一层),然后如果我们割掉这条边就意味着选择了下面这个点。然后,对于h之差的限制,我们把k+d层的点向k层的四周的点连+oo边,也就是说如果我们割掉了一条边,就不能选择+oo的边连接的上面的边,因为选择了这条边,如果再选择上面的边的话,就不能构成割了,因为流还是可以经过那条+oo的边流回来。其实类比一下最大权独立集的话,这条+oo的边的意义就是选了某个点以后,就不能选和它相差超过d的点了。 最后跑最小割就ok了。 1 #include...
阅读全文
bzoj3173 [Tjoi2013]最长上升子序列
摘要:这个题...被恶心到了。 如果插入的数是无序的话,貌似就要做三维偏序了= =,但这个题就不需要了哈。 其实,LIS是可以用bit做的,每次我们可以求出以当前插入的数为结尾的LIS长度,也就是查询x的前缀max,插入的时候把查询结果+1插入bit。我们看到,如果插入的数的递增的话,要么新的LIS是以x结尾,要么不变,于是扫一遍就好了。 但是我们得知道插入数的实际位置,怎么做?有一种比较简单的方法就是倒着扫序列,二分答案+bit,这个bit维护前缀和,也就是求比二分的位置小的数的个数,与插入位置相比。我一开始想的是直接用bit求比插入位置x小的数的个数,但这样是错的,因为插入这个数之前这...
阅读全文
浙公网安备 33010602011771号