摘要:
居然最近才发现BIT是可以用来求最值的233,道理和线段树差不多,因为树状数组里每个点存储的数据范围是[i-lowbit(i)+1,i],而任意一个区间都是可以被许多段这样的小区间所覆盖的,那么我们就可以用这些小区间的最值来更新所求区间的最值了。 1 struct max_bit 2 { 3 ... 阅读全文
摘要:
题目给了四个轮子,每个轮子上有按顺序排列的n个数,要求适当旋转每个轮子,使得四个轮子相同行数相加和相同。首先,可以计算出每一行的和应该是多少,记为Sum。然后固定第一个轮子,二重循环枚举2、3轮子,然后O(n)判断1+2+3是否等于Sum-4,这样时间复杂度是O(n^3)。那么,只要把判断过程复杂度... 阅读全文
摘要:
H城是一座小城市,前几日才刚刚建立公交系统,且只有一辆公交车。于是,如何最大化这唯一一辆公交车的载客量成了亟待解决的问题。H城的俯视图可以近似地看成是一个棋盘网络——共有N行M列,从南向北,每行从1到M标号,从西向东,每列从1到N标号。经实地考察,公交总公司选定了K个可以设为站点的地方,其中第K个站点位于第Xi列,第Yi行,预计每天有Pi名乘客需要在此乘车。设有序数对(X,Y)表示第X列,第Y行。每天,公交车从(1,1)开出,驶向(N,M),途中只能向北或向东行驶。现在,公交总公司希望你能够帮助他们选定一条路线,使得能够接到的乘客数最大,我们假设公交车的容量无限大。输入格式一个非负整数ans, 阅读全文
摘要:
蒟蒻Zigzag正在准备联赛......这个算是这几天做的唯一一个值得写一写的题吧。首先LIS的N^2暴力dp应该都会写,就是F[i]=Max{F[j]}+1那么加权的就吧后面的1换成数的权值就行了,如果优先长度的话加一些判断就行了。那么O(nlogn)怎么写?LIS的Nlogn应该都会写,就是记一个数组D[i]表示长度为i的LIS的末尾的最小值,可证D是单增的,所以每次找Max的时候只需要二分查找D数组就行了或者你可以个给每个F插到树状数组里(数为横坐标,F为纵坐标),每次查找比这个数小的里面的最大F又或者可以用单调栈什么的?我记得好像可以,不过记不清了。那带权的怎么写?还想记录D数组吗?如 阅读全文
摘要:
省选前最后一天填坑...... 其实这个题早就想过,一直懒得写。我发现我写单调队列一次一个样,真是郁闷。 简述题意就是给你一个n长度的数轴和m个区间,每个区间里有且仅有一个点,问能有多少个点。 我们考虑用f[i]表示前i个位置能放多少个,每一步决策有两个限制:1.每个区间里要有一个点,这样我们可以确定决策区间左边界;2.每个区间里只能有一个点,这样我们可以确定右边界。如果有地方左边界大于右边界了就是一定不能放点了。 单调队列的话,首先让[ L[I],R[I] ]区间的f值入队,然后把队首不在这个决策区间里的出队,然后转移f[q[head]]就行了。 总结起来,单队大概有两种,一种... 阅读全文
摘要:
这个题有点恶心啊,总觉得以前做过,可就是想不出来。最后在发现是meng神出的一次模拟赛题= =当时我还P都不会呢... 这个题有两个关键点,一个是选取的子序列内不能有重复,二是选取的子序列要是一个排列(当然这包含了一)。首先如果确定了不会重复,那么只要子序列内的数的和等于(len+1)*len/2就行了,那么怎么确定不重复呢? 我们可以O(N)时间求出来每个数两边第一个和它相同的数的位置(L,R),这样我们可以不断地更新合法的序列的范围。 具体方案:我们先确定每一个1的位置(因为每个区间首先必须有1),按照这个来划分区间。我们先从左到右扫每个区间,相当于枚举了右端点k(我们要包含那个... 阅读全文
摘要:
这个题是一道AC自动机上的概率DP,可以帮助理解一下AC自动机的结构。 首先我们把所有的串插入trie,建立AC自动机,求一下转移函数(相当于构造一个trie图),那么就可以概率DP了。首先到达每个点的概率为变量,然后我们要求的就是到达接受状态(也就是每个串的结尾对应的状态)的概率。注意到了接受状态就不必往下转移了,因为游戏就此结束了。注意有一个限制是必须要加的,就是所有接受状态的概率和是1。如果不加的话,会得到所有点的概率等于0这个答案。那么我们就随便拿一个方程替换这个方程就好了。 1 #include<iostream> 2 #include<cstdio> 3 # 阅读全文
摘要:
这是一道凸费用的题,需要用到拆边的转化。 具体是这样,首先列出关于流量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... 阅读全文
摘要:
一道字符串好题。网上大多解法是后缀数组+栈扫描,大致思想是按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 阅读全文