10 2018 档案

摘要:似乎是弱化的qtree3。树剖什么的非常无脑。考虑离线。并查集维护每个点的最近打标记祖先,倒序处理,删除标记时将其与父亲合并即可。 阅读全文
posted @ 2018-10-31 22:40 Gloid 阅读(163) 评论(0) 推荐(0)
摘要:设f[i][j][x][y]为安排了i个男孩j个女孩,后缀最大男孩-女孩数为x,最大女孩-男孩数为y的方案数。转移显然。 阅读全文
posted @ 2018-10-31 21:52 Gloid 阅读(153) 评论(0) 推荐(0)
摘要:如果n、m、k都是2的幂次方,答案非常好统计。于是容易想到数位dp,考虑每一位是否卡限制即可,即设f[i][0/1][0/1][0/1]为第i位是/否卡n、m、k的限制时,之前的位的总贡献;g[i][0/1][0/1][0/1]为第i位是/否卡n、m、k的限制时,之前的位的方案数。为了方便可以改为统 阅读全文
posted @ 2018-10-31 21:24 Gloid 阅读(185) 评论(0) 推荐(0)
摘要:首先求出每个女性接受某个男性的概率。这个概率显然是一个无穷等比数列求和。 然后按编号从小到大考虑每个女性,维护出每个男性被选择的期望次数,BIT上查询后缀和即可。 需要long double。 阅读全文
posted @ 2018-10-31 15:19 Gloid 阅读(216) 评论(0) 推荐(0)
摘要:逐个去除限制。第四个限制显然可以容斥,即染恰好c种颜色的方案数=染至多c种颜色的方案数-染至多c-1种颜色的方案数+染至多c-2种颜色的方案数…… 然后是限制二。同样可以容斥,即恰好选n行的方案数=至多选n行的方案数-至多选n-1行的方案数+至多选n-2行的方案数…… 限制三同理。即容斥套容斥套容斥 阅读全文
posted @ 2018-10-31 14:35 Gloid 阅读(318) 评论(0) 推荐(0)
摘要:考虑在每个点的出边中删除哪些。如果其出边所指向的点中存在某点能到达另一点,那么显然指向被到达点的边是没有用的。于是拓扑排序逆序处理,按拓扑序枚举出边,bitset维护可达点集合即可。 阅读全文
posted @ 2018-10-31 10:58 Gloid 阅读(215) 评论(0) 推荐(0)
摘要:显然若右端点确定,gcd最多变化log次。容易想到对每一种gcd二分找最远端点,但这样就变成log^3了。注意到右端点右移时,只会造成一些gcd区间的合并,原本gcd相同的区间不可能分裂。由于区间只有log个,暴力即可。 阅读全文
posted @ 2018-10-31 00:46 Gloid 阅读(142) 评论(0) 推荐(0)
摘要:树上建可持久化trie即可,有点过于裸了。darkbzoj过了然而在bzoj一直wa,不知道哪有锅。 阅读全文
posted @ 2018-10-30 22:11 Gloid 阅读(173) 评论(0) 推荐(0)
摘要:看到这个式子当然先二分答案。得max-min-(j-i+k)ans>=0。 显然max-min相同的情况下所选区间长度越短越好,所以max和min都应该取在边界。那么实际上我们根本不用管端点是否真的是max或min,因为即使不是将他们计入也不会对最终答案造成影响。不妨设右端点是max,则要最大化aj 阅读全文
posted @ 2018-10-30 21:28 Gloid 阅读(165) 评论(0) 推荐(0)
摘要:数据范围过大说明这个题和组合一点关系也没有,答案基本上肯定是ab的形式了。暴力打表感觉不太好写,找到当年的题面发现还有个样例是6 40 401898087,于是暴力找ab=401898087的数,发现一组a=64 b=40,可以发现a=2n b=k,同时也符合第一组数据,于是就做完了。 可以发现集合 阅读全文
posted @ 2018-10-30 19:10 Gloid 阅读(330) 评论(0) 推荐(0)
摘要:相当于选一个包含根的连通块使权值和最大,且每个点的儿子选取数量有限制。那么显然贪心的在所有子树中选比较大的就可以了。至于方案是否唯一只需要看选的子树是否可以替换,注意dp值为0的情况。 阅读全文
posted @ 2018-10-30 18:17 Gloid 阅读(155) 评论(0) 推荐(0)
摘要:感觉比较套路,每次在长边中轴线处切一刀,求出切割线上的点对矩形内所有点的单源最短路径,以此更新每个询问,递归处理更小的矩形。因为若起点终点跨过中轴线是肯定要经过的,而不跨过中轴线的则可以选择是否经过中轴线,若不经过一定就在矩形的某一半了。复杂度O((nm)1.5log(nm)),不太会证。 阅读全文
posted @ 2018-10-30 17:38 Gloid 阅读(139) 评论(0) 推荐(0)
摘要:即滋磁单点修改,询问路径上小于某数的值有多少个。暴力树剖套个主席树(或者直接树上主席树,似乎就1个log了?感觉不一定比两个log快)即可,然而不太优美。 开始觉得可以cdq,然而就变成log^3了。冷静一下感觉简直是个弱智,修改本身就是单调的,只要对询问离线即可。树剖+BIT即可维护。 阅读全文
posted @ 2018-10-30 14:42 Gloid 阅读(194) 评论(0) 推荐(0)
摘要:显然答案应该是Σi-next[next[……next[i]]] (next[next[……next[i]]]>0)。递推即可。 阅读全文
posted @ 2018-10-30 13:31 Gloid 阅读(135) 评论(0) 推荐(0)
摘要:设f[i][j]为由根进入遍历完i子树,最后一个到达的点是j时的最小代价,g[i][j]为由子树内任意一点开始遍历完i子树,最后一个到达的点是j时的最小代价,因为是一棵完全二叉树,状态数量是nlogn的。转移考虑四种走法:根→左子树→右子树;根→右子树→左子树;左子树→根→右子树;右子树→根→左子树 阅读全文
posted @ 2018-10-30 11:24 Gloid 阅读(256) 评论(0) 推荐(0)
摘要:链上问题是一个经典的贪心。于是考虑破环成链,将链倍长。求出每个线段右边能作为后继的最远线段,然后倍增即可。 阅读全文
posted @ 2018-10-29 23:45 Gloid 阅读(177) 评论(0) 推荐(0)
摘要:即删除一条边使图中不存在奇环。如果本身就是个二分图当然任意一条边都可以,先check一下。否则肯定要删除在所有奇环的交上的边。 考虑怎么找这些边。跑一遍dfs造出dfs树,找出返祖边构成的奇环。可以通过树上差分标记奇环上的边。 但是这显然只包含了一部分奇环。注意到如果某条在奇环上的边同时也在一个偶环 阅读全文
posted @ 2018-10-29 20:34 Gloid 阅读(271) 评论(0) 推荐(0)
摘要:判断网格图中某两点是否被割开,可以将割边视为边区域视为点,转化为可切割这两点的区域是否连通。于是每次判断使两个区域连通后是否会形成环(边界视为连通),若是则说明被两点被割开。并查集维护。 阅读全文
posted @ 2018-10-29 17:30 Gloid 阅读(150) 评论(0) 推荐(0)
摘要:好友状态的变化次数不会超过m,于是考虑暴力,对每个人记录其好友关系的变化,通过前缀和计算贡献。这需要查询一段前缀时间内某人发的微博数量,可以离线建一棵绝对平衡的平衡树。事实上完全可以线性。 阅读全文
posted @ 2018-10-29 16:34 Gloid 阅读(183) 评论(0) 推荐(0)
摘要:当n大到一定程度(>21)时一定无解,并不会证。 如果要取出一个排列,显然应该让每一位在序列中的位置尽量靠前。于是设f[S]表示存在S子集中这些字母所组成的所有排列的最短前缀的长度,枚举当前排列最后一个字母转移即可。 阅读全文
posted @ 2018-10-29 15:56 Gloid 阅读(256) 评论(0) 推荐(0)
摘要:似乎是noip2017d2t3的一个部分分。用splay的话当然非常裸,但说不定会被卡常。可以发现序列中数的(环上)相对位置是不变的,考虑造一棵权值线段树维护权值区间内还有多少个数留在序列中,每次在线段树上二分即可。 阅读全文
posted @ 2018-10-29 13:53 Gloid 阅读(133) 评论(0) 推荐(0)
摘要:首先显然如果块大小固定,方案唯一。如果在方案中将一个点和其父亲分开,那么这个点的子树大小一定是块大小k的倍数。并且如果能找到n/k个点(当然n是k的倍数)满足这条,一定可以以此构造一个划分方案,看起来挺显然的感(xia)性(cai)证(jie)明(lun)一下。于是统计子树大小即可。 阅读全文
posted @ 2018-10-29 11:07 Gloid 阅读(137) 评论(0) 推荐(0)
摘要:注意到只有增加点/合并的操作。这些操作都可以用线段树完成,于是线段树合并一发就好了。注意乘积大小直接比较肯定会炸,取个对数即可。数据中存在重边。 阅读全文
posted @ 2018-10-29 09:59 Gloid 阅读(207) 评论(0) 推荐(0)
摘要:A:枚举答案即可。注意答案最大可达201,因为这个wa了一发瞬间爆炸。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using 阅读全文
posted @ 2018-10-29 08:16 Gloid 阅读(249) 评论(0) 推荐(0)
摘要:小凯的疑惑升级版的升级版。答案若存在不会超过30002-3000,暴力dp似乎勉强可以过。当然这不优美。 注意到如果能拼出长度为l的围栏,就一定能拼出长度为l+kx的围栏,其中x为最短的(或任意一个)围栏长度。这样将值域范围缩小到了3000以内。于是将同余类间连长为木料长度的边,求出0为源点到每个点 阅读全文
posted @ 2018-10-28 23:00 Gloid 阅读(163) 评论(0) 推荐(0)
摘要:小凯的疑惑升级版。只有两个数的话不能表示的最大数是ab-a-b,显然如果可选数增加不会比这更大,所以只要答案存在一定小于256*256-2*256。在这个范围内背包即可。 阅读全文
posted @ 2018-10-28 20:59 Gloid 阅读(169) 评论(0) 推荐(0)
摘要:看上去很难维护,考虑找一些必要条件。首先显然最大值-最小值=k*(r-l)。然后区间内的数需要模k同余。最后区间内的数两两不同(k=0除外)。冷静一下可以发现这些条件组合起来就是充分的了。 考虑怎么维护。最大值最小值非常简单。模k同余相当于区间内相邻两数的差都是k的倍数,可以维护差分数组的gcd。两 阅读全文
posted @ 2018-10-28 20:23 Gloid 阅读(228) 评论(0) 推荐(0)
摘要:显然最优策略是先走到一边要到达的最远城市,再换方向走到另一边要到达的最远城市(当然也可以直接停止),路上参观景点。 先仅考虑求出只向左走,花费时间i时的最优解。如果能求出这个,类似的就可以求出所有情况。 显然时间越长,应该往左边走的越远,参观的越多,但是这个最远城市的变化不一定连续,没法愉快地双指针 阅读全文
posted @ 2018-10-28 17:02 Gloid 阅读(236) 评论(0) 推荐(0)
摘要:首先dp出长度为i的不下降子序列个数,显然这可以树状数组做到O(n2logn)。 考虑最后剩下的序列是什么,如果不管是否合法只是将序列删至只剩i个数,那么方案数显然是f[i]*(n-i)!。如果不合法,说明这个序列是由一个长度为i+1的非降序列删除一个数得来的,所以将其减去f[i+1]*(i+1)* 阅读全文
posted @ 2018-10-28 11:44 Gloid 阅读(286) 评论(0) 推荐(0)
摘要:由nim游戏的结论,显然等价于去掉一些数使剩下的数异或和为0。 暴力的dp比较显然,设f[i][j][k]为前i堆移走j堆(模意义下)后异或和为k的方案数。注意到总石子数量不超过1e7,按ai从小到大排序,这样k的枚举范围就不会超过2ai,于是复杂度O(md)。 注意空间卡的非常紧,连滚动都开不下, 阅读全文
posted @ 2018-10-27 17:46 Gloid 阅读(191) 评论(0) 推荐(0)
摘要:注意到k与n同阶,考虑构造一种枚举子集的方式,使得尽量先枚举较小的子集。首先sort一下,用堆维护待选子集。每次取出最小子集,并加入:1.将子集中最大数ai替换为ai+1 2.直接向子集中添加ai+1 这两个子集(若不存在ai+1则不操作)。如此操作k次即可得到第一问的答案。 对于正确性,我们证明当 阅读全文
posted @ 2018-10-27 16:42 Gloid 阅读(252) 评论(0) 推荐(0)
摘要:当然可以在SA上二分答案,但看起来会被卡log。考虑对模板串建出AC自动机,用母串在上面跑,标记上所有能到达的点。注意到达某个点时需要标记所有其通过fail指针可以走到的点,如果遇到一个标记过的点就可以退出,因为显然后面所指向的已被标记。查询时由每个模板串的结尾节点向上暴力找第一个被标记的点即可。 阅读全文
posted @ 2018-10-27 02:50 Gloid 阅读(328) 评论(0) 推荐(0)
摘要:考虑套路地将1~n依次加入排列。设f[i][j]为已将1~i加入排列,有j对不合法的方案数。加入i+1时可能减少一对不合法的,可能不变,可能增加一对,对于i+1与i的关系再增设0/1/2状态表示i与左边/右边的数是否构成不合法对即可。 阅读全文
posted @ 2018-10-27 02:01 Gloid 阅读(177) 评论(0) 推荐(0)
摘要:考虑根号分块。对于<√3e5的模数,每加入一个数就暴力更新最小值;对于>√3e5的模数,由于最多被分成√3e5块,查询时对每一块找最小值,这用一些正常的DS显然可以做到log,但不太跑得过。考虑并查集在序列上的奇技淫巧。加点不太能做,考虑离线改成删点。并查集维护下一个未删除的点即可。 阅读全文
posted @ 2018-10-26 22:17 Gloid 阅读(169) 评论(0) 推荐(0)
摘要:设f[i][0/1]为考虑前i位,第i位为0/1时的期望得分(乘以是0/1的概率)。暴力转移显然。前缀和优化即可。 但是这个前缀和精度无法承受,动不动就nan。 考虑增加一位的贡献。若之前后缀1的个数为x,则增加一个1的贡献为(x+1)3-x3=3x2+3x+1。因此记录后缀1的个数期望、后缀1的个 阅读全文
posted @ 2018-10-26 19:43 Gloid 阅读(273) 评论(0) 推荐(0)
摘要:A:差点开场懵逼。只要有相邻两位不同就可以作为答案。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace 阅读全文
posted @ 2018-10-26 18:23 Gloid 阅读(176) 评论(0) 推荐(0)
摘要:由点积的几何意义(即投影)可以发现答案一定在凸壳上,并且投影的变化是一个单峰函数,可以三分。现在需要处理的只有删除操作,线段树分治即可。 阅读全文
posted @ 2018-10-25 20:36 Gloid 阅读(206) 评论(0) 推荐(0)
摘要:A:设f[i][j][0/1]为前i个数第i位为j且第i位未满足/已满足限制的方案数。大力dp前缀和优化即可。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #inclu 阅读全文
posted @ 2018-10-25 12:39 Gloid 阅读(199) 评论(0) 推荐(0)
摘要:注意到答案一定是原串的子串,于是考虑造出SA,二分答案是第几小的子串。第k小子串很容易在SA上求出。之后计算使他成为最大子串至少要在几个位置切割,对每个字典序比答案大的后缀,找到所有合法切割位置(求lcp即可),就转化成了选最少的点使每个区间都包含至少一个点的经典问题。 阅读全文
posted @ 2018-10-25 00:19 Gloid 阅读(357) 评论(0) 推荐(0)
摘要:SA写了就忘,SAM根本学不会,没救。 SA模板: 阅读全文
posted @ 2018-10-24 20:38 Gloid 阅读(152) 评论(0) 推荐(0)
摘要:设f[i][j]为前i个数中所选择的最后一个数在第j位上为1时的最长序列长度,转移显然。 阅读全文
posted @ 2018-10-24 01:35 Gloid 阅读(146) 评论(0) 推荐(0)
摘要:感觉非常不可做,于是考虑有什么奇怪的性质。 先考虑怎么求子集和mex。将数从小到大排序,假设已经凑出了0~n的所有数,如果下一个数>n+1显然mex就是n+1了,否则若其为x则可以凑出1~n+x所有数。 对于区间查询,建棵主席树即可,每次查询权值线段树上lastn+2~n+1的区间,用区间和更新n, 阅读全文
posted @ 2018-10-23 22:28 Gloid 阅读(190) 评论(0) 推荐(0)
摘要:一个暴力的做法是把边看成点,之间的边权为两边的较大权值,最短路即可。但这样显然会被菊花图之类的卡掉。 考虑优化建图。将边拆成两个有向边,同样化边为点。原图中同一条边在新图中的两个点之间连边权为原边权的边。对于原图同一点的出边按权值从小到大排序,权值相邻的由小到大连边权为差值的边,由大到小连边权为0的 阅读全文
posted @ 2018-10-23 21:02 Gloid 阅读(179) 评论(0) 推荐(0)
摘要:用trie求出前缀最大区间异或和、后缀最大区间异或和即可。注意空间是nlog的。 阅读全文
posted @ 2018-10-23 18:39 Gloid 阅读(149) 评论(0) 推荐(0)
摘要:贪心的按位考虑。如果所有数在某一位上有奇数个为1,显然无论如何划分这一位最终都会为1;否则将每一部分都划分为偶数个1就能保证最终该位为0,可以标记上哪些位置可以作为划分点(当然也要满足之前可为0的位上是0),如果剩余划分点个数>=m-1则说明该位可为0。 阅读全文
posted @ 2018-10-23 18:24 Gloid 阅读(133) 评论(0) 推荐(0)
摘要:相当于一个有负体积的背包。显然如果确定了选哪些,应该先把体积小的挂上去。于是按体积从小到大排序,就是一个裸的背包了。 阅读全文
posted @ 2018-10-23 00:58 Gloid 阅读(190) 评论(0) 推荐(0)
摘要:显然相当于使序列变成单峰。给原序列每个数按位置标号,则要求重排后的序列原标号的逆序对数最少。考虑将数从大到小放进新序列,那么贪心的考虑放在左边还是右边即可,因为更小的数一定会在其两侧,与它自身放在哪无关。对于相同的数,一定可以将其安排至之间无逆序对,特判一下。 阅读全文
posted @ 2018-10-22 23:26 Gloid 阅读(207) 评论(0) 推荐(0)
摘要:如果分块的话与区间众数没有本质区别。这里考虑莫队。 显然莫队时的删除可以用堆维护,但多了一个log不太跑得过。 有一种叫回滚莫队的trick,可以将问题变为只有加入操作。按莫队时分的块依次处理,一块中左端点的差不超过√n,右端点单调递增。首先将右端点也在该块中的询问暴力处理。然后令指针l在下一块开头 阅读全文
posted @ 2018-10-22 21:26 Gloid 阅读(181) 评论(0) 推荐(0)
摘要:如果要询问的某个纵坐标为inf的点左边是否有点能与其构成所要求的矩形,只要用个单调栈就可以了。可以想到用分治来制造单调性。 按横坐标排序,每次考虑跨过分治中心的矩形。考虑右边的每个点能与左边的哪些点构成矩形。首先这受到右边点的限制,对于每个点用set求出这个范围。然后对所有点按纵坐标从大到小排序,维 阅读全文
posted @ 2018-10-22 19:52 Gloid 阅读(229) 评论(0) 推荐(0)
摘要:前缀和后相当于查询三维空间某条直线,用两维坐标减去另一维就变成查询二维点了,map即可。 阅读全文
posted @ 2018-10-22 15:12 Gloid 阅读(128) 评论(0) 推荐(0)
摘要:事实上每次走到横坐标或纵坐标最接近的点一定可以取得最优方案。于是这样连边跑最短路就可以了。 阅读全文
posted @ 2018-10-22 01:04 Gloid 阅读(204) 评论(0) 推荐(0)
摘要:前缀gcd的变化次数是log的,考虑对每一种gcd查询,问题变为查询一段区间是否存在异或前缀和=x/gcd。 无修改的话显然可以可持久化trie,但这玩意实在没法支持修改。于是考虑分块。 对于每一块将其中所有块内异或前缀和排序。查询时先看这块与上一块相比gcd有没有变化,如果有对其中每个位置暴力查询 阅读全文
posted @ 2018-10-21 22:06 Gloid 阅读(178) 评论(0) 推荐(0)
摘要:A:真的懵逼了。冷静了半天之后决定二分一下答案,然后先a安排上尽量小的再贪心地一个个扩大。40min才过。这个做法非常怂的以代码复杂度和时间复杂度为代价换取了比较稳的正确性,事实上由于1~n可以组合出1~n*(n+1)/2的所有数,只要从大到小贪心地放就可以了。 #include<iostream> 阅读全文
posted @ 2018-10-21 19:43 Gloid 阅读(223) 评论(0) 推荐(0)
摘要:首先显然地如果某个点超过了最大负载,删掉它仍然是不合法的。删除某个点当前只会对其父亲产生影响,同一个节点的儿子显然应该按代价从小到大删。考虑如果删掉某个点之后他的父亲不能再删了,我们损失了父亲这个点,但不会对其他点产生任何影响;而若删掉父亲,其儿子节点中能够删除的节点肯定会更少,且会对爷爷造成负面影 阅读全文
posted @ 2018-10-21 13:54 Gloid 阅读(182) 评论(0) 推荐(0)
摘要:显然每一行棋子的某种放法是否合法只与上一行有关,状压起来即可。然后n稍微有点大,矩阵快速幂即可。 阅读全文
posted @ 2018-10-20 23:31 Gloid 阅读(246) 评论(0) 推荐(0)
摘要:这场打的顺手到不敢相信。如果不是vp的话估计肯定打不到这个成绩。 A:最大显然,最小的话每次暴力给最小的+1。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #inclu 阅读全文
posted @ 2018-10-20 17:42 Gloid 阅读(275) 评论(0) 推荐(0)
摘要:可以大胆猜想的一点是,只要有不少于一个长度为k的颜色相同子串,方案就是合法的。 直接算有点麻烦,考虑减去不合法的方案。 一个正(xue)常(sha)的思路是枚举序列被分成的段数,问题变为用一些1~k-1的数组成n的方案数,这显然是可以容斥的。但好像对每一种都进行容斥就不太好办了。 暴力二维dp是很容 阅读全文
posted @ 2018-10-20 15:21 Gloid 阅读(220) 评论(0) 推荐(0)
摘要:搜索好难啊。 1.对于每个分数集合记忆化。 2.某人得分超过总分,剪枝。 3.某人之后全赢也无法达到总分,剪枝。 4.每有一场比赛分出胜负总分会多三分,而平局则会多两分。某人的分出胜负场次或平局场次超过该限制,剪枝。 面向代码编程直到除了变量名几乎都一模一样还是T。最后发现记忆化判断某个状态是否已经 阅读全文
posted @ 2018-10-20 14:34 Gloid 阅读(181) 评论(0) 推荐(0)
摘要:DAG中每个点选一条入边就可以构成一棵有向树,所以如果没有环答案就是∏degreei。 考虑去掉含环的答案。可以看做把环缩点,剩下的点仍然可以任意选入边。于是去除的方案数即为∏degreei/∏degreek,k为环上点。 环相当于考虑新加入边的终点到起点的所有路径。设f[i]为i为起点的所有路径提 阅读全文
posted @ 2018-10-20 01:47 Gloid 阅读(189) 评论(0) 推荐(0)
摘要:copy: Dilworth定理:DAG的最小链覆盖=最大点独立集 最小链覆盖指选出最少的链(可以重复)使得每个点都在至少一条链中 最大点独立集指最大的集合使集合中任意两点不可达 此题中独立的定义即是两点满足一个在左下一个在右上(或在同一格)。于是只需要找一条从左下到右上权值和最大的路径。 阅读全文
posted @ 2018-10-19 22:20 Gloid 阅读(155) 评论(0) 推荐(0)
摘要:因为睡过了只好vp。 A:阅读理解。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; in 阅读全文
posted @ 2018-10-19 21:18 Gloid 阅读(198) 评论(0) 推荐(0)
摘要:由扩展欧拉定理,a^(a^(a^(……^x)))%p中x作为指数的模数应该是φ(φ(φ(φ(……p)))),而p取log次φ就会变为1,也即每个位置一旦被修改一定次数后就会变为定值。线段树维护区间剩余修改次数的最大值,暴力修改即可。 可以预处理出每个位置进行k次操作后的值。直接计算是log^3的,会 阅读全文
posted @ 2018-10-18 22:33 Gloid 阅读(206) 评论(0) 推荐(0)
摘要:按照子串出现的先后考虑。令f[i][j]为已经出现的字符串集合为i,最后一个出现的字符串为j时的最短串长,预处理一下任意两个串的最长重叠长度,转移显然。有点麻烦的是字典序,强行增加代码难度。 另一个比较简单的做法是上AC自动机,建出来后类似地令f[i][j]为已经出现的字符串集合为i,在自动机上点j 阅读全文
posted @ 2018-10-17 22:53 Gloid 阅读(188) 评论(0) 推荐(0)
摘要:可以发现询问的即是“由起点开始‘只经过编号大于等于l的点’所形成的连通块”与“由终点开始‘只经过编号小于等于r的点’所形成的连通块”是否有交集。于是建出重构树,就可以知道每个询问的连通情况了。现在要知道的是两个连通块的交集,考虑每个点是否有可能在里面。于是按照两棵重构树的dfs序给每个点一个二维坐标 阅读全文
posted @ 2018-10-17 18:53 Gloid 阅读(165) 评论(0) 推荐(0)
摘要:首先造出所要求的得到的环。如果将位置一一对应上,答案就是不在所要求位置的人数。因为显然这是个下界,并且脑补一下能构造出方案达到这个下界。 剩下的问题是找到一种对应方案使错位数最少。可以暴力旋转这个环,然而是n2的。诶是不是特别熟悉……这好像很像卷积?然而好像没有什么优美的函数能方便的计算出两个排列的 阅读全文
posted @ 2018-10-17 00:46 Gloid 阅读(131) 评论(0) 推荐(0)
摘要:dp容易想到,但没法进一步优化了。 考虑贪心,每次选出价值最大的物品。但这显然是不对的因为会影响其他物品的选择。 于是考虑加上反悔操作。每次选出一个物品后,将其相邻两物品删除,再将原物品价值变为相邻两物品价值和-原物品价值。这样如果再次选择该物品就可以达到改为选择相邻两物品的效果。并且最优方案中相邻 阅读全文
posted @ 2018-10-16 20:47 Gloid 阅读(407) 评论(0) 推荐(1)
摘要:两个位置i和j上的元素不能被放进同一个栈的充要条件显然是存在k使i<j<k且ak<ai<aj。由此在保证合法的情况下贪心地放就是正确的了。 至于如何判断,可以记一下后缀最小值,每找到一对就利用补集并查集合并。放的时候要求与该栈所有元素不排斥且与另一个栈的元素不存在强制同栈的关系。 怎么感觉远古时代n 阅读全文
posted @ 2018-10-16 02:55 Gloid 阅读(208) 评论(0) 推荐(0)
摘要:暴力枚举每一位是否进位,然后就可以高斯消元解出方程了。然而复杂度是O(2nn3),相当不靠谱。 考虑优化。注意到某一位进位情况的变化只会影响到方程的常数项,于是可以在最开始做一次高斯消元算出每个未知数与每个常数项的关系。这样就变成了O(2nn2),虽然仍然不靠谱不过经常可以早早break,就能过了。 阅读全文
posted @ 2018-10-15 23:56 Gloid 阅读(234) 评论(0) 推荐(0)
摘要:A:开场懵逼。然后发现有人1min过,于是就sort了一下,于是就过了。正经证明的话,考虑回文串两端点一定是相同的,所以最多有Σcnti*(cnti+1)/2个,cnti为第i种字母出现次数。而sort是可以达到这个最大值的。 #include<iostream> #include<cstdio> 阅读全文
posted @ 2018-10-14 22:32 Gloid 阅读(171) 评论(0) 推荐(0)
摘要:非常经典的剪枝题然而一直没有写。感觉自己连普及组水平都没有了。 1.半径和高枚举范围满足加上后总体积不超过n且剩下每层还能放。 2.半径从大到小枚举,因为体积正比于半径平方而面积正比于半径,大的半径更有可能成为最优解。 3.剩下的最大体积+当前体积>=n。 4.剩下的最小面积+当前面积<ans。可以 阅读全文
posted @ 2018-10-14 20:34 Gloid 阅读(121) 评论(0) 推荐(0)
摘要:单纯的暴搜似乎还是很好写的,然而过不了。出完顺子之后答案是可以dp出来的,于是大力搜然后大力dp就好了。 dp时强行讨论完了几乎所有拆牌情况,理性愉悦一发。 阅读全文
posted @ 2018-10-14 16:03 Gloid 阅读(308) 评论(0) 推荐(0)
摘要:暴搜加个最优性剪枝即可。一直觉得正式比赛出这种不能一眼看出来暴搜就行了的搜索题的出题人都是毒瘤。 阅读全文
posted @ 2018-10-14 12:49 Gloid 阅读(126) 评论(0) 推荐(0)
摘要:这玩意写个鬼游记啊 听说普及+提高的考两张卷子€€£也是想得出来 怎么监考还能咕咕咕的啊 怎么我到快结束了才做完啊 怎么我根本不知道初赛能带啥啊 怎么dij我都能想着对的选了错的啊 怎么我根本不知道图灵奖是谁创立的啊(不过好像蒙对了 怎么看程序写结果读入n不换行的啊完全注意不到啊于是连环都不会数了 阅读全文
posted @ 2018-10-13 17:05 Gloid 阅读(402) 评论(0) 推荐(0)
摘要:拿走一个区间的代价只与最大最小值有关,并且如果最后一次拿走包含区间右端点的子序列一定不会使答案更劣,于是设f[i][j][x][y]为使i~j区间剩余最小值为x最大值为y且若有数剩余一定包含j的最小代价,特别地f[i][j][0][0]表示取完i~j区间的最小代价。转移时考虑j最后和哪一段一起拿走, 阅读全文
posted @ 2018-10-13 12:39 Gloid 阅读(199) 评论(0) 推荐(0)
摘要:容易想到设f[i][j][k]为i~j区间以k为根是否能构成bst。这样是O(n4)的。考虑将状态改为f[i][j][0/1]表示i~j区间以i-1/j+1为根能否构成bst。显然如果是i-1作为根的话i~j区间都在它的右子树,所以转移时枚举右子树的根并判断是否合法,j+1类似。 阅读全文
posted @ 2018-10-12 19:00 Gloid 阅读(283) 评论(0) 推荐(0)
摘要:设f[i][j][k]为将i~j的字符最终合并成k的答案。转移时只考虑最后一个字符是由哪段后缀合成的。如果最后合成为一个字符特殊转移一下。 复杂度看起来是O(n32k),实际常数极小达到O(玄学)。 upd:突然发现根本没在bzoj上交。bzoj的数据输入中没有空格。 阅读全文
posted @ 2018-10-12 02:20 Gloid 阅读(373) 评论(2) 推荐(0)
摘要:A:签到。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() { in 阅读全文
posted @ 2018-10-12 01:17 Gloid 阅读(204) 评论(0) 推荐(0)
摘要:感觉上这个题是可以直接暴力的,每次根据一段连续最小值个数的奇偶性决定是否划分区间,递归处理。然而写起来实在太麻烦了。 设f[i][j]为以i为左端点合并出j时的右端点。则有f[i][j]=f[f[i][j-1]+1][j-1]。类似于区间dp。 阅读全文
posted @ 2018-10-11 18:49 Gloid 阅读(167) 评论(0) 推荐(0)
摘要:首先按数据值排序,那么连续一段区间的dfs序一定也是连续的。 将权值离散化,设f[i][j][k]为i到j区间内所有点的权值都>=k的最小代价,转移时枚举根考虑是否修改权值即可。 阅读全文
posted @ 2018-10-11 02:20 Gloid 阅读(139) 评论(0) 推荐(0)
摘要:设f[i][j][0/1]表示i~j这段区间上一次选择的是最左/最右人的方案数。转移显然。 阅读全文
posted @ 2018-10-10 23:40 Gloid 阅读(163) 评论(0) 推荐(0)
摘要:线段树合并的话这个noip最难题就是个裸题了。 注意merge最后return x,以及如果需要区间查询的话这里还需要up,无数次死于这里。 阅读全文
posted @ 2018-10-10 20:36 Gloid 阅读(166) 评论(0) 推荐(0)
摘要:每个节点被经过的概率即为该区间和/总区间和。那么所需要计算的东西就是每个节点的平方和了。修改对于某个节点的影响是使其增加2sum·l·x+l2x2。那么考虑对子树的影响,其中Σl2是定值,修改后Σsum·l会增加Σl2x。维护一下就好。 懒得纠结爆long long的问题了,被卡90算了。 阅读全文
posted @ 2018-10-10 02:34 Gloid 阅读(211) 评论(0) 推荐(0)
摘要:容易想到二分答案。问题变为判断是否所有条件都被满足,可以发现这是很多变量间的相对关系,取个log之后就是经典的差分约束模型了。特殊的地方在于某些人的分数已被给定,从每个人开始跑一遍最短路判断一下是否能满足关系即可。 阅读全文
posted @ 2018-10-09 20:46 Gloid 阅读(256) 评论(0) 推荐(0)
摘要:打猝死场感觉非常作死。 A:判一下起点和终点是否在其两侧即可。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using name 阅读全文
posted @ 2018-10-08 12:50 Gloid 阅读(285) 评论(0) 推荐(0)
摘要:既然已经学傻了,这个题当然是上反演辣。 对于求积的式子,考虑把[gcd=1]放到指数上。一通套路后可以得到∏D∏d∏i∏j (ijd2)μ(d) (D=1~n,d|D,i,j=1~n/D)。 冷静分析一下,由μ*1=e,后面一串ij相关的式子仅当D=1时有贡献。这一部分就非常好算了。而d对某个D的贡 阅读全文
posted @ 2018-10-07 23:59 Gloid 阅读(159) 评论(0) 推荐(0)
摘要:容易想到设f[i]为杀死i号怪物所消耗的最小体力值,由后继节点更新。然而这显然是有后效性的,正常的dp没法做。 虽然spfa已经死了,但确实还是挺有意思的。只需要用spfa来更新dp值就可以了。dij看起来也差不多。 更新部分写的看起来就很慢很能优化一波,在luogu上T一个点,然而实在太懒了就算了 阅读全文
posted @ 2018-10-06 23:10 Gloid 阅读(208) 评论(0) 推荐(0)
摘要:A:搜索好难啊根本不会啊。 B:暴力枚举给哪段前缀乘,维护一些前后缀最大最小值之类的东西就很好算了。 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<al 阅读全文
posted @ 2018-10-06 19:11 Gloid 阅读(151) 评论(0) 推荐(0)
摘要:A:做法应该很多,比较好想的是每个点都往上倍增找到其能更新到的点。 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> using na 阅读全文
posted @ 2018-10-06 02:01 Gloid 阅读(202) 评论(0) 推荐(0)
摘要:A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() { int 阅读全文
posted @ 2018-10-06 01:54 Gloid 阅读(177) 评论(0) 推荐(0)
摘要:A:搜索好难啊根本不会啊。 B:原题都能写挂没救了啊。考虑求出每个数作为最小值时能向左向右扩展到的最远位置,那么这段区间里的所有数就不可能作为唯一的最小值成为最优解了,否则假设可以的话这段区间里的数都能整除该数,也一定能整除之前找到的最小值,区间就可以扩展到这里。所以从左往右从右往左各扫一遍即可,注 阅读全文
posted @ 2018-10-05 16:02 Gloid 阅读(161) 评论(0) 推荐(0)
摘要:设f(n)为模n时的答案,由2k mod n=2k mod φ(n)+φ(n) mod n(并不会证),且k mod φ(n)=f(φ(n)),直接就可以得到一个递推式子。记搜一发即可。 阅读全文
posted @ 2018-10-04 23:45 Gloid 阅读(205) 评论(0) 推荐(0)
摘要:没事干写一发模板。 阅读全文
posted @ 2018-10-04 20:47 Gloid 阅读(156) 评论(0) 推荐(0)
摘要:A:容易发现这要求所有子集中元素的最高位1的位置相同,并且满足这个条件也是一定合法的。统计一下即可。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<al 阅读全文
posted @ 2018-10-04 18:03 Gloid 阅读(221) 评论(0) 推荐(0)
摘要:k=1的话非常好做,每个有1的位都有一半可能性提供贡献。由组合数的一些性质非常容易证明。 k=2的话,平方的式子展开可以发现要计算的是每一对位提供的贡献,于是需要计算每一对位被同时选中的概率。找出所有存在的相互绑定的位,这些位被同时选择的概率为0.5,而不被绑定的则为0.25。 对于k>=3,其实用 阅读全文
posted @ 2018-10-04 08:35 Gloid 阅读(279) 评论(0) 推荐(0)
摘要:A:这我怎么没学傻了啊。整个一傻逼题一眼容斥我连暴力都写不出来啊。显然序列是没有什么用的,考虑求众数小于x的概率,显然可以枚举有几个超过容斥一发。虽然要算的组合数非常大,发现可以抵消很大一部分,最后算组合数是O(n)的,总复杂度O(Tn2logn)。精度可能会有问题。 #include<iostre 阅读全文
posted @ 2018-10-03 23:57 Gloid 阅读(188) 评论(0) 推荐(0)
摘要:A:cf原题。当然是不是也没什么关系。 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> using namespace std; i 阅读全文
posted @ 2018-10-03 13:39 Gloid 阅读(142) 评论(0) 推荐(0)
摘要:完全想不到地,考虑分治。 对区间[l,r],将左端点x由mid不断左移,右边记录最右的p满足max[mid+1,p]<=max[x,mid],q满足min[mid+1,q]>=min[x,mid]。这样右边被分成三部分,分别统计。 对于p和q左边的位置,这部分的max和min显然是由左边部分决定的, 阅读全文
posted @ 2018-10-03 12:55 Gloid 阅读(201) 评论(0) 推荐(1)
摘要:A:非常裸的dp。 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int read() 阅读全文
posted @ 2018-10-02 18:25 Gloid 阅读(215) 评论(0) 推荐(0)
摘要:考虑固定左端点,求出该情况下能获得的最大值。于是每次可以在某数第一次出现的位置加上其价值,第二次出现的位置减掉其价值,查询前缀最大值就可以了。每次移动左端点在线段树上更新即可。 阅读全文
posted @ 2018-10-02 16:13 Gloid 阅读(138) 评论(0) 推荐(0)
摘要:显然可以dp:设f[i]为前i个人最多能分多少组,则f[i]=max{f[j]}+1 (cmax<=i-j<=dmin)。 容易发现d的限制是一段连续区间,二分或者随便怎么搞都行。c则有点麻烦,考虑分治。找到区间中c最大的位置,处理左边区间再向右边(包括该位置)转移,最后处理右边区间(当然就是cdq 阅读全文
posted @ 2018-10-02 14:55 Gloid 阅读(450) 评论(0) 推荐(0)
摘要:A:辣鸡题。搜索怎么这么难啊。不会啊。 B:裸的高斯消元,看起来可以优化到n2。 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> u 阅读全文
posted @ 2018-10-02 09:39 Gloid 阅读(163) 评论(0) 推荐(0)
摘要:设f[i]为由i开始遍历完子树内所要求的点的最短时间,g[i]为由i开始遍历完子树内所要求的点最后回到i的最短时间。则g[i]=Σ(g[j]+2),f[i]=min{g[i]-g[j]+f[j]-1}。 然后由父亲答案还原。因为上面的dp用到了max似乎不太好搞,于是记录一下最大值是用了哪棵子树以及 阅读全文
posted @ 2018-10-01 23:34 Gloid 阅读(185) 评论(0) 推荐(0)
摘要:A:注意到模数是要求lcm的数的倍数,直接先取模就可以了。考场脑抽,对其质因数分解判了一下每个因子有没有,当然也行。 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #in 阅读全文
posted @ 2018-10-01 15:29 Gloid 阅读(209) 评论(0) 推荐(0)