12 2018 档案

摘要:场外选手赛时只口胡出了CD感觉非常惨。只看了E并且还没看到题面里的wiki我能咋办 C:f只与gcd(n,k)有关。 D:考虑每种起始位置,对于跨越的两个排列,只有前一个排列的后缀单减时不产生贡献。答案就非常显然了。注意最后+1,因为这样没考虑n~1的排列。 E:根据题面给出的定理,n+1号点度数增 阅读全文
posted @ 2018-12-31 22:02 Gloid 阅读(156) 评论(0) 推荐(0)
摘要:A:阅读。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define ll long 阅读全文
posted @ 2018-12-29 22:56 Gloid 阅读(217) 评论(0) 推荐(0)
摘要:考虑枚举相邻点距离差的比例。显然应使比例值gcd为1以保证不重复统计。确定比例之后,各维坐标的方案数就可以分开考虑。设比例之和为k,则若坐标上限为m,该维坐标取值方案数即为Σm-ki (i=1~⌊m/k⌋),也即⌊m/k⌋·m-k·(⌊m/k⌋+1)·⌊m/k⌋/2,设其为f(m,k)。总方案数即将 阅读全文
posted @ 2018-12-28 12:36 Gloid 阅读(159) 评论(0) 推荐(0)
摘要:NOI2018冒泡排序的一个子问题。 阅读全文
posted @ 2018-12-27 21:23 Gloid 阅读(180) 评论(0) 推荐(0)
摘要:打表可以发现相当于不存在长度>=3的递减子序列。 考虑枚举在哪一位第一次不卡限制。注意到该位一定会作为前缀最大值。判掉已确定位不合法的情况后,现在的问题即为求长度为i、首位>j的合法排列个数,设其为g[i][j]。 由于首位>j,1~j在排列中一定依次出现,并且在j出现之前,>j的部分也一定单增。于 阅读全文
posted @ 2018-12-27 21:19 Gloid 阅读(225) 评论(0) 推荐(0)
摘要:显然multiset求出每次用哪把剑。注意到除了p=1的情况,其他数据都保证了ai<pi,于是先特判一下p=1。比较坑的是还可能存在ai=pi,稍微考虑一下。 剩下的部分即解bix≡ai(mod pi)方程组。没有保证模数互质,于是excrt一发。excrt实际上就是不停exgcd合并两个方程。 这 阅读全文
posted @ 2018-12-26 22:13 Gloid 阅读(216) 评论(0) 推荐(0)
摘要:按海拔从大到小合并建出kruskal重构树,这样就能知道开车能到达哪些点,对这些点到1的最短路取min即可。最难的部分在于多组数据的初始化和数组大小的设置。 阅读全文
posted @ 2018-12-26 01:54 Gloid 阅读(181) 评论(0) 推荐(0)
摘要:即求b串有多少个本质不同的非空子串,在a串的给定区间内未出现。即使已经8102年并且马上就9102年了,还是要高举SA伟大旗帜不动摇。 考虑离线,将所有询问串及一开始给的串加分隔符连起来,求出SA。对于每个询问,我们对串的每个后缀,求出其在给定区间中最长的lcp是多少。这样就能得到不考虑本质不同时的 阅读全文
posted @ 2018-12-25 21:56 Gloid 阅读(502) 评论(0) 推荐(0)
摘要:整天自闭。 A:有各种讨论方式。我按横坐标排了下然后讨论了下纵坐标单调和不单调两种情况。写了15min也就算了,谁能告诉我printf和cout输出不一样是咋回事啊?又调了10min啊?upd:突然想起来我好像define int long long了 #include<iostream> #inc 阅读全文
posted @ 2018-12-24 00:57 Gloid 阅读(209) 评论(0) 推荐(0)
摘要:置换数量是阶乘级别的,但容易发现本质不同的点的置换数量仅仅是n的整数拆分个数,OEIS(或者写个dp或者暴力)一下会发现不是很大,当n=53时约在3e5左右。 于是暴力枚举点的置换,并且发现根据点的置换我们得到的实际上是边的置换,暴力数一下循环节就好了。3e5*50*50,luogu上过掉了。诶怎么 阅读全文
posted @ 2018-12-23 19:16 Gloid 阅读(344) 评论(0) 推荐(0)
摘要:直接给了一个置换群(当然要自己手动加上不洗牌的情况)。考虑求不动点数量即可。对于一个置换,求出所有循环的长度,然后设f[i][x][y]为给前i个循环着色后,用了x张红色卡片、y张绿色卡片的方案数,dp一发即可。 upd:为啥我写的应该不是假算法却好像也被hack掉了?不管了已经忘了这是啥题肯定哪写 阅读全文
posted @ 2018-12-23 16:12 Gloid 阅读(174) 评论(0) 推荐(0)
摘要:对于置换0→i,1→i+1……,其中包含0的循环的元素个数显然是n/gcd(i,n),由对称性,循环节个数即为gcd(i,n)。 那么要求的即为Σngcd(i,n)/n(i=0~n-1,也即1~n)。考虑枚举gcd。显然gcd(i,n)=x在该范围内解的个数是φ(n/x)。分解一下质因数即可。 阅读全文
posted @ 2018-12-23 15:18 Gloid 阅读(166) 评论(0) 推荐(0)
摘要:参考:刘汝佳《算法竞赛入门经典训练指南》 感觉是非常远古的东西了,几乎从来没有看到过需要用这个的题,还是学一发以防翻车。 置换:排列的一一映射。置换乘法相当于函数复合。满足结合律,不满足交换律。 置换的循环分解:即将置换看成一张有向图,分解成若干循环。循环的数量称为循环节。 以置换集合来描述等价关系 阅读全文
posted @ 2018-12-23 14:38 Gloid 阅读(356) 评论(0) 推荐(0)
摘要:考虑乱搞,用矩形框圆放KD-Tree上,如果当前删除的圆和矩形有交就递归下去删。为防止被卡,将坐标系旋转一定角度即可。注意eps稍微设大一点,最好开上long double。 阅读全文
posted @ 2018-12-23 13:23 Gloid 阅读(220) 评论(0) 推荐(0)
摘要:堆维护第k大,每个点KD-Tree上A*式查询较远点,跑得飞快,复杂度玄学。 阅读全文
posted @ 2018-12-22 17:20 Gloid 阅读(135) 评论(0) 推荐(0)
摘要:板子题。 阅读全文
posted @ 2018-12-22 16:07 Gloid 阅读(129) 评论(0) 推荐(0)
摘要:板子题。 阅读全文
posted @ 2018-12-22 00:01 Gloid 阅读(131) 评论(0) 推荐(0)
摘要:参考:https://trinkle23897.github.io/pdf/K-D%20Tree.pdf KD-Tree是一种维护K维空间点的类似BST的数据结构。绝大多数时候只用来维护二维空间的点,因为维度越高复杂度越辣鸡。下面只考虑平面上的KD-Tree,即2D-Tree。 KD-Tree以分割 阅读全文
posted @ 2018-12-21 22:07 Gloid 阅读(295) 评论(0) 推荐(0)
摘要:离散化后,容易想到设f[i][j]为i节点权值为j的概率,不妨设j权值在左子树,则有f[i][j]=f[lson][j](pi·f[rson][1~j]+(1-pi)·f[rson][j~m])。 考虑用线段树合并优化这个dp。记录前缀和,合并某节点时,若某棵线段树在该节点处为空,给另一棵线段树打上 阅读全文
posted @ 2018-12-21 13:00 Gloid 阅读(209) 评论(0) 推荐(0)
摘要:如果直接dp,状态里肯定要带上已走过的点的集合,感觉上不太好做。 考虑一种对期望的minmax容斥:其中Max(S)为遍历完S集合的期望步数,Min(S)为遍历到S集合中一个点的期望步数。当然才不管怎么证,反正看上去非常优美。 设f[i][S]为由i节点出发的Min(S),显然有f[i][S]=Σf 阅读全文
posted @ 2018-12-20 22:39 Gloid 阅读(382) 评论(0) 推荐(0)
摘要:考虑容斥,枚举一个子集S在1号猎人之后死。显然这个概率是w1/(Σwi+w1) (i∈S)。于是我们统计出各种子集和的系数即可,造出一堆形如(-xwi+1)的生成函数,分治NTT卷起来就可以了。 阅读全文
posted @ 2018-12-20 13:15 Gloid 阅读(215) 评论(0) 推荐(0)
摘要:容斥一发改为计算至少碾压k人的情况数量,这样对于每门课就可以分开考虑再相乘了。剩下的问题是给出某人的排名和分数的值域,求方案数。枚举出现了几种不同的分数,再枚举被给出的人的分数排第几,算一个类似斯特林数的东西即可。后一部分与碾压几人是无关的,预处理一下,复杂度即为三方。当然和四方跑得也差不多快。 数 阅读全文
posted @ 2018-12-19 22:15 Gloid 阅读(187) 评论(0) 推荐(0)
摘要:一个显然的做法是二分答案后转化为查询区间颜色数,可持久化线段树记录每个位置上一个同色位置,离线后set+树状数组套线段树维护。这样是三个log的。 注意到我们要知道的其实只是是否所有颜色都在该区间出现,可以改为查询后缀区间的上一个同色位置中最小的。这样我们就只需要set+线段树就可以维护了,同样二分 阅读全文
posted @ 2018-12-19 19:54 Gloid 阅读(217) 评论(0) 推荐(0)
摘要:即求所有情况的最大伤害之和。容易发现应该先打强化牌,至少打一张攻击牌。同样显然的是强化牌和攻击牌都应该按从大到小的顺序打。进一步可以发现,只要还有强化牌,就应该使用(当然至少留一次攻击的机会)。 于是将强化牌和攻击牌各自从大到小排序。显然可以将其分开考虑。对强化牌,设f[i][j]为前i张牌抽到j张 阅读全文
posted @ 2018-12-18 21:41 Gloid 阅读(237) 评论(0) 推荐(0)
摘要:显然的做法是暴力枚举非树边所连接两点的选或不选,大力dp。考场上写的是最暴力的O(3n-mn),成功比大众分少10分。容斥或者注意到某些枚举是不必要的就能让底数变成2。但暴力的极限也就到此为止。 每次重新dp做了大量重复的事,考虑从减少重复计算方面优化。先跑一遍没有限制的树形dp。将非树边所连接的点 阅读全文
posted @ 2018-12-18 01:13 Gloid 阅读(342) 评论(0) 推荐(0)
摘要:记录区间and/or,修改时如果对整个区间影响都相同就打标记,否则递归。复杂度不太会证。 阅读全文
posted @ 2018-12-17 21:11 Gloid 阅读(195) 评论(0) 推荐(0)
摘要:A:n==2?2:1。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define l 阅读全文
posted @ 2018-12-17 01:39 Gloid 阅读(326) 评论(2) 推荐(0)
摘要:如果是要求左端点最大,直接求出SA,找前缀名次最小值就可以了。虽然现在要左端点最小,但我们已经知道了这个字典序最小的串是什么,找到名次数组上的合法区间求最小值即可。我也不知道为什么我会弃掉这个题,可能太久没写字符串了。 阅读全文
posted @ 2018-12-16 22:28 Gloid 阅读(167) 评论(0) 推荐(0)
摘要:A:签到。 B:仅当只有一种字符时无法构成非回文串。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace 阅读全文
posted @ 2018-12-16 00:46 Gloid 阅读(174) 评论(0) 推荐(0)
摘要:A:对于每个B,会和其右边的每个W交换一次。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std 阅读全文
posted @ 2018-12-15 22:28 Gloid 阅读(339) 评论(0) 推荐(0)
摘要:显然集合后相对位置不变最优。主席树上二分向左和向右的分界点即可。注意主席树的值域。我怎么天天就写点一眼题啊。 阅读全文
posted @ 2018-12-15 17:03 Gloid 阅读(186) 评论(0) 推荐(0)
摘要:对于一个序列,重排后有序的概率显然是∏cnti!/n!,其中cnti为第i种数出现次数。要使概率最小,显然应该让各种数字尽量平均分配。剩下的是div2BC左右的大讨论。 阅读全文
posted @ 2018-12-15 15:47 Gloid 阅读(142) 评论(0) 推荐(0)
摘要:可以发现这个过程非常类似埃氏筛,将在该区间内没有约数的数定义为质数,那么也就是求每种方案中选完所有质数的最早时间之和。 于是先求出上述定义中的质数个数,线性筛即可。然后对每个最短时间求方案数,非常显然的组合数。最好特判一下l=1的情况,毕竟如果1作为质数会有奇怪的事。 我的线性筛……跑的几乎跟埃氏筛 阅读全文
posted @ 2018-12-15 14:43 Gloid 阅读(179) 评论(0) 推荐(0)
摘要:由裴蜀定理,子集S有解当且仅当gcd(S,P)|w。 一个显然的dp是设f[i][j]为前i个数gcd为j的选取方案。注意到这里的gcd一定是P的约数,所以状态数是n√P的。然后可以通过这个得到gcd是j约数的选取方案。复杂度O(n√PlogP)。 考虑优化。注意到每个数取gcd后的贡献仅与其和P的 阅读全文
posted @ 2018-12-15 13:59 Gloid 阅读(170) 评论(0) 推荐(0)
摘要:贝尔福特曼(?)的方式相当于每次将所有与源点直接相连的点的影响区域向两边各扩展一格。显然每个点在过程中最多更新其他点一次且这些点构成一段连续区间。这个东西二分st表查一下就可以了。注意某一轮中两点都更新某节点的情况。 阅读全文
posted @ 2018-12-14 22:13 Gloid 阅读(113) 评论(0) 推荐(0)
摘要:显然答案为Σkb·(n-k)a·C(n-k+1,k)。并且可以发现ΣC(n-k,k)=fibn。但这实际上没有任何卵用。 纯组合看起来不太行得通,换个思路,考虑一个显然的dp,即设f[i][j][0/1]为前i为选了j个1其中第i位是0/1的方案数。这样当然能求出答案,复杂度O(n2)。 注意到ab 阅读全文
posted @ 2018-12-14 00:20 Gloid 阅读(215) 评论(0) 推荐(0)
摘要:显然最优走法是先一直停在初始位置然后一次性走完一圈。将序列倍长后,相当于找一个长度为n的区间[l,l+n),使其中ti+l+n-1-i的最大值最小。容易发现ti-i>ti+n-(i+n),所以也就相当于是后缀最大值最小。设ti-i=ai,即要求min{l+max{al..2n}}+n-1 (l=1. 阅读全文
posted @ 2018-12-13 13:27 Gloid 阅读(139) 评论(0) 推荐(0)
摘要:用线段树对每种长度的区间维护权值和。 考虑区间[l,r]+1对长度为k的区间的贡献,显然其为Σk-max(0,k-i)-max(0,k-(n-i+1)) (i=l~r)。 大力展开讨论。首先变成Σk-Σmax(0,k-i)-Σmax(0,k-(n-i+1)) (i=l~r)。 第一部分是一个常数,线 阅读全文
posted @ 2018-12-12 22:45 Gloid 阅读(280) 评论(0) 推荐(0)
摘要:题面描述的相当绕,其实就是如果ai=j,重排后ai要在aj之后。同时每个ai有附属属性wi,要求最大化重排后的Σiwi。 容易发现这事实上构成一张图,即由j向i连边。由于每个点入度为1或0,该图是基环外向树森林,并且如果图中有环显然无解,所以这张图就是个森林。把0也看做一个点后变成一棵树。由于其是基 阅读全文
posted @ 2018-12-12 20:45 Gloid 阅读(194) 评论(0) 推荐(0)
摘要:板子题。 阅读全文
posted @ 2018-12-12 13:11 Gloid 阅读(159) 评论(0) 推荐(0)
摘要:首先将之间没有锁的房间合并。显然可达性具有传递性和反交换律(即若a能到达b,则b不能到达a)。 考虑对每个房间找到其左右第一个(即与其最接近的)能作为起点到达它的房间。如果能求出这个,对此建两棵树,问题就变为终点是否在起点的子树内。 容易想到单调栈。不妨考虑求左边第一个。栈内维护当前房间左边能作为起 阅读全文
posted @ 2018-12-11 20:11 Gloid 阅读(144) 评论(0) 推荐(0)
摘要:注意到一旦在某个路口被红灯逼停,剩下要走的时间是固定的。容易想到预处理出在每个路口被逼停后到达终点的最短时间,这样对于每个询问求出其最早在哪个路口停下就可以了。对于预处理,从下一个要停的路口倒推即可。问题只剩下如何求出下一个要停的路口,这相当于求满足di,j%(g+r)>=g的最小j,对d做一个前缀 阅读全文
posted @ 2018-12-11 12:48 Gloid 阅读(251) 评论(0) 推荐(0)
摘要:日常猝死。 A:f[i]表示子树内包含根且可以继续向上延伸的路径的最大价值,统计答案考虑合并两条路径即可。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include 阅读全文
posted @ 2018-12-11 03:24 Gloid 阅读(391) 评论(1) 推荐(0)
摘要:二进制数能被3整除相当于奇数、偶数位上1的个数模3同余。那么如果有偶数个1,一定存在重排方案使其合法;否则则要求至少有两个0且至少有3个1,这样可以给奇数位单独安排3个1。 考虑线段树维护区间内的一堆东西,合并两节点时计算跨过区间中点的答案。可以对每个节点记录f[0/1][0/1][0/1][0/1 阅读全文
posted @ 2018-12-10 23:50 Gloid 阅读(221) 评论(0) 推荐(0)
摘要:首先相当于最大化access的轻重边交换次数。 考虑每个点作为战场(而不是每个点所代表的国家与其他国家交战)对答案的贡献,显然每次产生贡献都是该点的子树内(包括自身)此次access的点与上次access的点在该点不同儿子的子树内。假设得到了最后的崛起序列,可以发现相互不包含的子树的贡献是相互独立的 阅读全文
posted @ 2018-12-09 20:56 Gloid 阅读(134) 评论(0) 推荐(0)
摘要:第一眼看错题以为只是要求区间值域连续,那莫队一发维护形成的值域段数量就行了。 原题这个条件相当于区间内相邻数差的绝对值不超过1。所以只要对这个做个前缀和就……完了? 阅读全文
posted @ 2018-12-09 00:39 Gloid 阅读(130) 评论(0) 推荐(0)
摘要:设f[i][j]为前i个划成j段的最小代价,枚举上个划分点转移。容易想到这个dp有决策单调性,感性证明一下比较显然。如果用单调栈维护决策就不太能快速的求出逆序对个数了,改为使用分治,移动端点时树状数组维护即可,类似莫队的每次都在原有基础上更新。注意更新时先加再减。感觉复杂度非常玄学丝毫不能看出为啥只 阅读全文
posted @ 2018-12-08 23:54 Gloid 阅读(306) 评论(0) 推荐(0)
摘要:线段树的任意一棵子树都相当于节点数与该子树相同的线段树。于是假装在树形dp即可,记忆化搜索实现,有效状态数是logn级别的。 阅读全文
posted @ 2018-12-08 21:17 Gloid 阅读(234) 评论(0) 推荐(0)
摘要:5在1e9+9下有二次剩余,那么fib的通项公式就有用了。 已知Fn,求n。注意到[(1+√5)/2]·[(1-√5)/2]=-1,于是换元,设t=[(1+√5)/2]n,原式变为√5·Fn=t-(-1)n·t-1。同乘t并移项,可得t2-√5·Fn·t-(-1)n=0。讨论n的奇偶性,BSGS求二 阅读全文
posted @ 2018-12-08 20:25 Gloid 阅读(396) 评论(0) 推荐(0)
摘要:方案合法相当于要求接口之间配对,黑白染色一波,考虑网络流。有一个很奇怪的限制是不能旋转直线型水管,考虑非直线型水管有什么特殊性,可以发现其接口都是连续的。那么对于旋转水管,可以看做是把顺/逆时针方向上最后的接口提到最前。于是用四个点表示某格子的四个方向,以上述方式只移动一次就能相互转换的方向之间连费 阅读全文
posted @ 2018-12-08 16:10 Gloid 阅读(147) 评论(0) 推荐(0)
摘要:这个题???我WA了两发??? 阅读全文
posted @ 2018-12-08 13:12 Gloid 阅读(122) 评论(0) 推荐(0)
摘要:特殊矩阵的幂同样满足费马小定理。 阅读全文
posted @ 2018-12-08 13:04 Gloid 阅读(234) 评论(0) 推荐(0)
摘要:每种父亲编号小于儿子编号的有标号二叉树的出现概率是相同的,问题相当于求所有n个点的此种树的所有结点两两距离之和。 设f[n]为答案,g[n]为所有此种树所有结点的深度之和,h[n]为此种树的个数。 枚举左右子树大小,则有f[n]=Σ{[f[i]+(g[i]+h[i]*i)·(n-i)]·h[n-i- 阅读全文
posted @ 2018-12-08 12:07 Gloid 阅读(157) 评论(0) 推荐(0)
摘要:明摆着的LCT,问题在于如何维护答案。首先注意到给出的泰勒展开式,并且所给函数求导非常方便,肯定要用上这玩意。容易想到展开好多次达到精度要求后忽略余项。因为x∈[0,1]而精度又与|x-x0|有关,当然是维护x=0.5时的各种东西,粗略算下大概到第13项就可以了。具体要维护的东西当然是对于x的不同次 阅读全文
posted @ 2018-12-08 01:03 Gloid 阅读(136) 评论(0) 推荐(0)
摘要:下称0类为单边,1类为互生边,2类为互斥边。对于一种匹配方案,考虑其出现的概率*2n后对答案的贡献,初始为1,如果有互斥边显然变为0,否则每有一对互生边其贡献*2。于是有一个显然的dp,即设f[S1][S2]为左边选取S1右边选取S2对答案的贡献。转移时考虑S1中编号最小的点x与右边的点y匹配。首先 阅读全文
posted @ 2018-12-07 22:38 Gloid 阅读(284) 评论(0) 推荐(0)
摘要:考虑一条扫描线从左到右扫过这些圆。观察某一时刻直线与这些圆的交点,可以发现构成一个类似括号序列的东西,括号的包含关系与圆的包含关系是相同的。并且当扫描线逐渐移动时,括号间的相对顺序不变。于是考虑用set维护这个括号序列,插入时统计被包含层数。这只需要查询后继括号,如果是右括号则被该括号包含,答案为该 阅读全文
posted @ 2018-12-07 18:40 Gloid 阅读(209) 评论(0) 推荐(0)
摘要:对于每个区间[l,r],显然右端点r是必须放置守卫的。考虑其不能监视到的点,构成一段段区间。一个非常显然但我就是想不到的性质是,对于这样的某个区间[x,y],在(y+1,r)内的点都是不能监视到这个区间内的任何一点的,证明考虑一下斜率之间的关系即可。于是该区间的最右一个守卫可以放置在y,也可以放置在 阅读全文
posted @ 2018-12-07 00:24 Gloid 阅读(151) 评论(0) 推荐(0)
摘要:假设确定了最终所得向量的方向,则应该选择所有在该方向上投影为正的向量。按极角序排序后这显然是一段连续区间。最终向量方向很难枚举,但对于某个向量,在其上投影为正的向量与其夹角范围是(-π/2,π/2),所以只要枚举所有极角差不超过π的极长区间就可以了。这里的区间不是向量区间而是极角区间,相当于一条过原 阅读全文
posted @ 2018-12-06 22:00 Gloid 阅读(222) 评论(0) 推荐(0)
摘要:容易发现要么1和n直接相连,要么两点距离即为所有dx,1+dx,n的最小值。若为前者,需要满足所有|d1-dn|都相等,挂两棵菊花即可。若为后者,将所有满足dx,1+dx,n=d1,n的挂成一条链,其余点直接与链上点相连即可,相连点需要满足dx,1-dx,n=dy,1-dy,n。 阅读全文
posted @ 2018-12-06 20:46 Gloid 阅读(144) 评论(0) 推荐(0)
摘要:如果某个格子的积水量超过了该格子的某个挡板高度,那么挡板另一端的积水量就会与其相同。看起来是一个不断合并的过程,考虑并查集。枚举深度,维护每个连通块内的方案数,深度超过某挡板高度时,将两端的连通块合并,即方案数相乘。再加上该连通块均为当前深度的这种方案。这样复杂度即为O(nmHα)或O(n2m2α) 阅读全文
posted @ 2018-12-06 19:40 Gloid 阅读(210) 评论(0) 推荐(0)
摘要:考虑固定右端点,使左端点最小。那么按右端点排序后查询前缀这些区间的左端点第k小即可。然而写了一个treap一个线段树都T飞了,感觉惨爆。事实上可以用堆求第k小,维护一个大根堆保证堆中元素不超过k个即可,瞬间就跑的飞快了。 阅读全文
posted @ 2018-12-06 19:29 Gloid 阅读(238) 评论(0) 推荐(0)
摘要:二分答案后得到每个位置需要被加的次数。考虑贪心。从左到右考虑每个位置,将以该位置为左端点的区间按右端点从大到小加进堆。看该位置还需要被加多少次,如果不需要加了就不管,否则取堆顶区间将其选择,BIT实现区间覆盖。 阅读全文
posted @ 2018-12-06 13:10 Gloid 阅读(153) 评论(0) 推荐(0)
摘要:假设所有操作都是对整个序列的。考虑每个子区间,区间和与其被加的值构成一次函数关系。最大子段和相当于多个子区间取最大值,答案显然就在这些一次函数构成的下凸壳上。如果预处理出凸壳,只要在凸壳上暴力跳就可以回答询问了,因为加的都是正数,并且斜率不同的一次函数数量是O(n)的。暴力建凸壳的复杂度是O(n2) 阅读全文
posted @ 2018-12-05 23:16 Gloid 阅读(395) 评论(0) 推荐(0)
摘要:在子树内和距离不超过k是一个二维限制,容易想到主席树,但主席树显然没法查最小值,因为不满足区间可减。kdtree和二维线段树可以干这事,但肯定会T飞。但事实上我们的问题有一个特殊性:对某个点x,查询其子树中的depth[x]~depth[x]+y和0~depth[x]+y这两种深度区间实际上是相同的 阅读全文
posted @ 2018-12-05 20:13 Gloid 阅读(359) 评论(0) 推荐(0)
摘要:设si为该序列的异或前缀和,则显然相当于求Σmax{sj+sj^si} (i=1~n,j=0~i)。从高位到低位考虑,如果该位si为1,无论sj怎么填都是一样的;如果该位si为0,则sj该位应尽量为1。考虑对每个x预处理出满足si&x=x的最小i。这样贪心时就很好办了。这可以类似前缀和(或者说就是d 阅读全文
posted @ 2018-12-05 18:28 Gloid 阅读(202) 评论(0) 推荐(0)
摘要:A:签到。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define ll long 阅读全文
posted @ 2018-12-05 12:34 Gloid 阅读(131) 评论(0) 推荐(0)
摘要:对bi取log,则相当于Σbi<=min{bi*ai}。注意到值域很小,那么如果有解,使其成立的最小的Σbi不会很大,大胆猜想不超过Σai。然而一点也不会(xiang)证。暴力枚举就好了。 阅读全文
posted @ 2018-12-04 21:03 Gloid 阅读(126) 评论(0) 推荐(0)
摘要:容易想到每个炸弹向其能引爆的炸弹连边,tarjan缩点后bitset传递闭包。进一步发现每个炸弹能直接引爆的炸弹是一段连续区间,于是线段树优化建图即可让边的数量降至O(nlogn)。再冷静一下由于能间接引爆的炸弹也是一段连续区间,传递闭包时只要记录可达点的左右端点即可。 阅读全文
posted @ 2018-12-04 19:55 Gloid 阅读(212) 评论(0) 推荐(0)
摘要:容易想到区间转化成前缀和。这样每个询问有了二维坐标,莫队即可。 阅读全文
posted @ 2018-12-04 13:19 Gloid 阅读(168) 评论(0) 推荐(0)
摘要:相当于求满足在子段中出现的颜色只在该子段中出现的非空子段数量。这也就相当于其中出现的颜色最左出现的位置在左端点右侧,最右出现的位置在右端点左侧。那么若固定某个端点,仅考虑对该端点的限制,会有一段合法区间。这个区间可以二分+st表求出。于是枚举右端点,在其合法区间内查询有多少个合法左端点(即合法区间包 阅读全文
posted @ 2018-12-04 12:44 Gloid 阅读(183) 评论(0) 推荐(0)
摘要:设f[i][j][0/1]为前i位选j段时其中第i位选/不选最多能匹配到哪,转移时f[i][j][0]→f[i+1][j][0],f[i][j][1]→f[i+1][j][0],f[i][j][1]→f[i+1][j][1],f[i][j][0]→f[i+1][j+1][1]。失配时找到最后一位相同 阅读全文
posted @ 2018-12-03 22:52 Gloid 阅读(218) 评论(0) 推荐(0)
摘要:容易猜到能选择的黑点个数是一个连续区间。那么设f[i][j]为i子树内选j个点形成包含根的连通块,最多有几个黑点,g[i][j]为最少有几个黑点,暴力dp是O(n2)的,求出每个连通块大小对应的黑点数量取值范围即可。 惊觉差点不会树形背包了。注意不要出现任何非法转移,即使看上去无伤大雅。 阅读全文
posted @ 2018-12-03 21:48 Gloid 阅读(148) 评论(0) 推荐(0)
摘要:设f[i]为选择i对i-1和i+1所带来的贡献。则有f[i-1]+f[i+1]+a[i]-2f[i]=b[i],特殊地,f[2]+a[1]=b[1],f[n-1]+a[n]-2f[n]=b[n]。可以发现这样我们有n-1个未知数和n个方程,代入求解判断是否矛盾即可。 但这只有必要性显然,为什么是充分 阅读全文
posted @ 2018-12-03 19:45 Gloid 阅读(193) 评论(0) 推荐(0)
摘要:大胆猜想每一步都相当于是第一步。稍微验证一下发现是对的。就做完了。 阅读全文
posted @ 2018-12-03 13:39 Gloid 阅读(164) 评论(0) 推荐(0)
摘要:即要求动态维护边双。出现环时将路径上的点合并即可。LCT维护。具体地,加边成环时makeroot+access+splay一套把这段路径提出来,暴力dfs修改并查集祖先,并将这部分与根断开,视为删除这些点,以后就以并查集中的祖先代替这些点。access时更新每个点的父亲。注意由于之前的删点操作,判断 阅读全文
posted @ 2018-12-03 12:54 Gloid 阅读(305) 评论(0) 推荐(0)
摘要:首先二分答案简化一下问题,现在只有0和1了,要求最后剩下的是1。再简化一下考虑没有已固定的位置怎么做。考虑每个位置由其合并到的位置连边,显然这样形成了一棵三叉树。设f[i]为使得某位置为1其子树至少要放多少个1即可,转移显然。加上已固定位置也类似,修改dp初值即可。 阅读全文
posted @ 2018-12-02 23:14 Gloid 阅读(270) 评论(0) 推荐(0)
摘要:对每个权值分别考虑。则只有单点加路径求和的操作。树上差分转化为求到根的路径和,子树加即可。再差分后bit即可。注意树上差分中根的父亲是0,已经忘了是第几次因为这个挂了。 阅读全文
posted @ 2018-12-02 21:52 Gloid 阅读(190) 评论(0) 推荐(0)
摘要:如果现在选定了一些要求消灭的敌人而不考虑积分,显然应该让每个敌人被刚好能消灭他的人消灭。再考虑最大化积分,显然我们应该优先消灭ci-bi大的敌人,所选用的a也应尽量大。于是按ci-bi从大到小排序,用一个multiset维护a,每次看其中是否有能消灭该敌人的人,如果有则将最小的删去,并用选中的Σci 阅读全文
posted @ 2018-12-02 20:48 Gloid 阅读(375) 评论(0) 推荐(0)
摘要:显然被留下的宝石应该贡献至少一位,否则就可以扔掉。所以如果n-k>=logw,直接输出所有数的or。现在n变得和k同阶了。于是设f[i][j]为前i个数or为j时至少选几个数,转移显然。当然可以只开一维。 阅读全文
posted @ 2018-12-02 19:36 Gloid 阅读(264) 评论(0) 推荐(0)
摘要:这个范围给的很像区间dp之类的,想了半天没一点思路,滚去看了一眼status被吓傻了。然后瞎猜了一发结论就过掉了。 求出逆序对数,判断是否为奇数即可。因为翻转区间会把将这段区间的逆序对取反,而长度为4x+2和4x+3的区间的数对数量是奇数,所以每次增加或减少的逆序对个数是奇数。 阅读全文
posted @ 2018-12-02 19:06 Gloid 阅读(290) 评论(0) 推荐(0)
摘要:显然最短循环节长度=i-next[i],则相当于给定next数组构造字符串。然后按照kmp的过程模拟即可。虽然这看起来是一个染色问题,但是由图的特殊性,如果next=0只要贪心地选最小的就可以了,稍微想一下容易证明。 阅读全文
posted @ 2018-12-02 18:11 Gloid 阅读(248) 评论(0) 推荐(0)
摘要:每个格子记录其左下的45°直角梯形区域的和及左下矩形区域的和即可。 阅读全文
posted @ 2018-12-02 16:41 Gloid 阅读(182) 评论(0) 推荐(0)
摘要:按时间排序,显然可能存在于答案中的公司价格应该单调递减。然后就可以大胆猜想感性证明其有决策单调性。具体地,设f(i,j)表示第i个消费公司和第j个生产公司搭配的获利,f(i,j)=(ti-tj)*(ci-cj),即证若f(i,j)>f(i,k) (k<j),则f(i+1,j)>f(i+1,k)。(t 阅读全文
posted @ 2018-12-02 15:50 Gloid 阅读(262) 评论(0) 推荐(0)
摘要:设f[i][j]为前i种强度选了j种且其中第i种选时前i个的最小误差。转移枚举上个选啥前缀和优化即可。 阅读全文
posted @ 2018-12-02 13:56 Gloid 阅读(209) 评论(0) 推荐(0)
摘要:先给每个非零格子-1以满足俯视图不变。于是就相当于要求每行每列最大值不变。能减少剩余箱子的唯一方法是在要求相同的行列的交叉处放箱子以同时满足两个需求。给这些行列连边跑二分图匹配即可。注意必须格子初始时有箱子才能放在这。 阅读全文
posted @ 2018-12-02 12:44 Gloid 阅读(223) 评论(0) 推荐(0)
摘要:容易发现要求三个区间各数出现次数的最小值。考虑bitset,不去重离散化后and一发就可以了。于是莫队求出每个区间的bitset。注意空间开不下,做多次即可。输出的东西错了都能调一年服了我了。 阅读全文
posted @ 2018-12-01 23:24 Gloid 阅读(157) 评论(0) 推荐(0)
摘要:对每个人行道求出移动距离在哪些区间内时其在建筑物前面。现在问题即为选一个点使得其被最多的区间包含。差分即可。对建筑暴力去掉重叠部分。开始时没有去重用了nm次vector的push_back,时间大概是去重写法的300倍,不知所措。 阅读全文
posted @ 2018-12-01 20:38 Gloid 阅读(242) 评论(0) 推荐(0)
摘要:第一问是来搞笑的。由欧拉函数的计算公式容易发现φ(i2)=iφ(i)。那么可以发现φ(n2)*id(n)(此处为卷积)=Σd*φ(d)*(n/d)=nΣφ(d)=n2 。这样就有了杜教筛所要求的容易算前缀和的两个函数。一通套路即可。 阅读全文
posted @ 2018-12-01 18:35 Gloid 阅读(190) 评论(0) 推荐(0)
摘要:容易想到建一棵平衡树,修改时打上标记即可。但是修改会导致平衡树结构被破坏。注意到实际上只有[k+1,2k)这一部分数在平衡树中的位置会被改变,所以对这一部分暴力修改,因为每次都会使其至少减小一半,复杂度非常正确。 开始写的玩意一个点要跑10s吓到我了,卡了半天常(最后也只是在darkbzoj上过了) 阅读全文
posted @ 2018-12-01 17:18 Gloid 阅读(255) 评论(0) 推荐(0)
摘要:一个显然的dp是设f[i][j]为i子树内权值<=j时的答案,则f[i][j]=Σf[son][j],f[i][a[i]]++,f[i][a[i]+1~n]对其取max。这样是可以线段树合并的,但实在太弱了不太会。 另一种做法是考虑扩展经典的单调队列优化LIS的做法,维护子树内答案为k时最小的最大值 阅读全文
posted @ 2018-12-01 02:01 Gloid 阅读(209) 评论(0) 推荐(0)