
STL
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
bzoj1098 [POI2007]办公楼biu(图论+list)
给出补图,求原图的连通块个数及大小。我们直接bfs原图,每次把补图中的边(也就是原图完全图中被删掉的边)通向的点打上标记,这样没被标记的点就是与此点连通的,都在一个连通块内,用链表优化一下,支持O(1)O(1)O(1)插入删除。每个点在链表中只会被删一次,所以这部分复杂度是O(n)O(n)O(n)的,每次给补图中的边连接的点打标记是O(m)O(m)O(m)的,因此总的复杂度是O(n+m)O(n...原创 2019-06-22 14:21:54 · 427 阅读 · 0 评论 -
bzoj1923 [Sdoi2010]外星千足虫(高斯消元+bitset)
就是解异或方程组,保证有解,要判多解。 顺便要记录用到的方程的最大标号。原创 2018-04-24 22:14:48 · 206 阅读 · 0 评论 -
bzoj4995 [Usaco2017 Feb]Why Did the Cow Cross the Road(贪心+multiset)
恩,我觉得这也是个贪心题。没想出来,菜呀qaq从小到大考虑一个数,他被若干区间包含,我们一定是把它分配给区间右端点最小的那个区间。这样肯定不会更差。因为剩下的区间的可选择空间更大。我们考虑把区间按右端点为第一关键字,左端点为第二关键字升序排序,每次对于一个区间我们取离他左端点最近的可选择点和他配对。原创 2018-04-24 13:34:10 · 360 阅读 · 0 评论 -
CF633G Yash And Trees(线段树+bitset)
首先我们用dfs序把子树转化成区间,我们就是要维护区间加法和区间%m不同质数的个数。 因为m只有1000,我们直接暴力的每个节点维护一个大小为1000的bitset即可。 bitset的一位只占1bit,因此内存为1000/8字节。所以空间复杂度就是O(4n∗1000/8)O(4n*1000/8) 而bitset的各种操作都是O(1000/32)的,因此我们总的复杂度就是O(q(logn100原创 2018-04-19 08:53:32 · 270 阅读 · 0 评论 -
bzoj2288【POJ Challenge】生日礼物(贪心+堆)
首先我们把连续的正数/负数合成一个,因为显然要取都取。 然后开头结尾的负数可以去掉了,我们一定不会取。 这样我们就得到了正负正负…正的一个序列。记正数有cnt个,则若cnt<=m,把正数全取了即可。否则,m=cnt-m,我们需要做出一些牺牲。可以删去一个正数或者选上一个负数来使得两边的正数合成一个,共需要m次牺牲,我们肯定是要贪心取牺牲最小的。还有一个限制就是如果我们选了一个正数,则他两边的负数原创 2018-04-18 21:35:18 · 425 阅读 · 0 评论 -
bzoj1150 [CTSC2007]数据备份Backup(贪心+堆)
这题好神啊orz 我们首先肯定是取相邻的两个点连边。 于是我们可以先处理出每相邻两点的距离,然后由于不能选同一个点,我们就当于是在n-1个数中选k个,彼此不能相邻,使得和最小。 我们贪心地取最小,每次取了a[x],删掉左边的右边的和a[x],然后加进去一个a[l]+a[r]-a[x],表示反悔了,不取a[x],取a[l]和a[r]。用一个堆来维护即可。 注意边界的情况:如果你取了最左端的数,原创 2018-04-18 16:22:46 · 482 阅读 · 0 评论 -
Codeforces Educational Round #42
CF962A Equator(模拟)CF962B Students in Railway Carriage(贪心)CF962C Make a Square(爆搜)CF962D Merge Equals(stl)CF962E Byteland, Berland and Disputed Cities(贪心)原创 2018-04-12 20:34:29 · 366 阅读 · 0 评论 -
bzoj4516 [Sdoi2016]生成魔咒(SAM+map)
动态在最后字符,问本质不同的子串个数,可以SAM来做。 mx[x]-mn[x]+1=mx[x]-mx[par[x]]就是答案。原创 2018-04-11 14:42:04 · 195 阅读 · 0 评论 -
bzoj1058 [ZJOI2007]报表统计(stl)
都可以用stl实现就好了。第一问用个能删除的堆,第二问用个set。、原创 2018-04-10 17:16:27 · 244 阅读 · 0 评论 -
bzoj3832 [Poi2014]Rally(拓扑排序+堆)
非常厉害的思路. 设f[i],g[i]分别表示从起点到i的最长路径和从点i开始的最长路径. 这个显然可以用拓扑排序处理. 对于一条边(u,v),它能产生的最长路径是f[u]+g[v]+1 我们用一个可删除堆来维护当前所有合法边产生的最长路径的最大值. 首先把g[i]数组加入线段树.按拓扑序依次枚举每一个点. 把指向它的边产生的最长路径和从这个点开始的最长路径从堆中删除. 当前全局最大值就原创 2018-04-08 23:17:19 · 374 阅读 · 0 评论 -
bzoj2006 [NOI2010]超级钢琴(st表+堆)
求连续子段和的前K大。 做个前缀和,把子段和变成sum[r]-sum[l]。 考虑r=i时,左端点一定是在一个范围内选一个最小的。 可以用st表+rmq来O(1)得到。 我们把这些扔进优先队列贪心取最大即可。 考虑对于i我在可选择区间[l,r]选了x之后,选别的还有可能在前k大。可是我们很难把x删掉。于是我们把[l,r]分裂成两半[l,x-1],[x+1,r]。即可。 因此我们优先队列需原创 2018-05-02 20:11:16 · 348 阅读 · 0 评论 -
bzoj3991 [SDOI2015]寻宝游戏(虚树+set)
动态删减关键点,我们发现答案就是虚树的边长和*2. 而虚树的边长和二倍正好就是把所有关键点按dfs序排序后相邻两点间的距离和。(包括最后一个和第一个的距离和)因此我们用set维护一下即可。原创 2018-04-25 23:22:07 · 311 阅读 · 0 评论 -
bzoj4504 K个串(主席树+堆)
很类似bzoj2006。 只是这次的区间和比较难算,我们需要建主席树来求。 rt[i]的每个叶节点x,表示右端点为i时左端点为x时的答案。 每个节点要维护区间最大值,及最大值所在位置。 我们有两种操作,区间加和查询区间最大值。 区间加的主席树比较麻烦。下放时要新建节点太慢了。 我们可以考虑标记永久化。不下放标记。 然后类似超级钢琴那题用堆来维护贪心就好啦。 或者也可以每次去删掉最大...原创 2018-05-05 16:38:07 · 328 阅读 · 0 评论 -
Codeforces Round #568 (Div. 2)
老年选手水平退化严重,花样WA题。A.Ropewalkers贪心#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 500010int main(){// freopen("a.in","r",stdin); int a[3],...原创 2019-06-20 22:46:29 · 327 阅读 · 0 评论 -
bzoj2300 [HAOI2011]防线修建(动态维护凸包)
把操作离线,倒着做,这样就是加点维护凸包了。 可以用set维护一下当前凸包上的点 然后每次新加一个点时判断是在凸包内还是凸包外 如果在凸包外,就要重新维护上凸壳,往两边删点,直到再次构成凸壳。 O(nlogn)O(nlogn)O(nlogn)#include <bits/stdc++.h>using namespace std;#define ll long long...原创 2018-07-01 22:37:43 · 403 阅读 · 0 评论 -
bzoj4198 [Noi2015]荷马史诗(Huffman编码+stl)
题目给出的定义显然就是让我们求Huffman编码。 不过可能是K叉的,我们加几个0补全就好了。 为了满足第二个要求,贪心的权值相同时深度小的优先。#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 100010#define pi...原创 2018-06-26 14:20:31 · 275 阅读 · 0 评论 -
bzoj4946 [Noi2017]蔬菜(模拟费用流,贪心,线段树)
首先我们有一个费用流的做法。 因为保质期这个东西不太好限制,我们把每种蔬菜都按照过期时间分成若干类,每类大概x个,这样就相当于我们有了n*p种蔬菜。每种蔬菜在指定时间过期。我们把S的奖励放到每一种蔬菜过期时间最晚的那一类中去。我们可以建图,S向每一天i连边,容量为m,费用为0,每一天i向所有第i天过期的蔬菜连边,容量为inf,费用为a,每一天i向下一天i+1连边,容量为inf,费用为0(我把...原创 2018-06-29 22:28:40 · 945 阅读 · 0 评论 -
bzoj3687 简单题(背包dp+bitset)
关键是权值小啊! 背包dp一下每种权值的个数是奇数还是偶数。 发现O(nW)O(nW)O(nW)过不去 注意到我们的dp值只有0/1,然后我们bitset优化一下就好了啦 复杂度O(nW/32)O(nW/32)O(nW/32)#include <bits/stdc++.h>using namespace std;#define ll long long#define ...原创 2018-06-17 16:18:11 · 300 阅读 · 0 评论 -
bzoj5084 hashit(广义SAM+set动态维护树链的并)
给出的字符串可以很方便的建成Trie树的若干个字符串的形式。 然后我们对Trie树建出广义SAM 那么每次询问的答案就是目前Trie树上所有点在parent树上的点到根的若干树链的并的点i的mx[i]-mx[par[i]] 我们可以用set+dfs序来动态维护树链的并的长度。 注意到x到根的这条树链的贡献其实就是mx[x] 复杂度O(26n+nlogn)O(26n+nlogn)O(26n...原创 2018-06-21 22:56:08 · 411 阅读 · 0 评论 -
bzoj5289 [Hnoi2018]排列(贪心+树+set)
首先把限制翻译一下就是考虑p这个排列,aiaia_i必须出现在i前面,连边aiaia_i->i。发现约束关系是一棵以0为根的树。(有环就无解) 现在的问题就变为,给定一棵树,每个点有点权,你要给每个点再分配一个不同的pipip_i,需要满足pi>pfa[i]pi>pfa[i]p_i>p_{fa[i]},使得∑ipiai∑ipiai\sum\limits_ip_ia_i最大。 ...原创 2018-06-11 15:09:41 · 296 阅读 · 0 评论 -
Codeforces Avito Code Challenge 2018
CF981A Antipalindrome(字符串+模拟)#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 100int n;char s[N];inline bool jud(int l,int r){ for(i...原创 2018-05-28 10:59:30 · 307 阅读 · 0 评论 -
bzoj4236 JOIOJI(map)
我可能是个智障【再见】 一开始脑残的一发二分答案,这有单调性么大哥【再见】 哎…然后又各种锅x 考虑我们要满足s1i−s1j=s2i−s2j=s3i−s3js_{1i}-s_{1j}=s_{2i}-s_{2j}=s_{3i}-s_{3j} 移一移得到两个式子:s1i−s2i=s1j−s2j,s1i−s3i=s1j−s3js_{1i}-s_{2i}=s_{1j}-s_{2j},s_{1i}-s原创 2018-04-27 16:32:10 · 292 阅读 · 0 评论 -
suoj33 诡异的交通(lct+stl)
orz sbw 题目传送门:portal原创 2018-03-21 23:06:15 · 328 阅读 · 0 评论 -
bzoj2827 千山鸟飞绝(平衡树+map)
把坐标用map离散化掉。我们考虑把一个点x加到集合y中的影响: 首先是对x点的影响:用集合y中的最大值更新ans1,用集合大小更新ans2. 然后是对集合y的影响:每个点的ans1都可以由v[x]更新,ans2都可以由集合大小更新。 因此我们就要维护集合最大值,集合大小,还要能够打标记,支持插入删除。 用splay即可。原创 2018-03-21 22:13:44 · 397 阅读 · 0 评论 -
bzoj5140 [Usaco2017 Dec]A Pie for a Pie(最短路+set)
其实就是建图,多源点最短路。但是呢边数最坏是O(n2)O(n^2)级别的,暴力建图会gg(不过数据水,跑的还贼快,快卡掉它吧(逃) 我们发现对于一个点x,他能连向的点是点权在[x,x+d]范围内的点,边权均为1,于是我们可以直接bfs,每个点只入队一次。每次快速的找到未入队的点中能连向的点,并删除即可。我们可以用一个set来支持这个操作。复杂度O(nlogn)不会自定义比较函数gg,只好set+p原创 2018-03-25 20:03:27 · 497 阅读 · 0 评论 -
bzoj1095 [ZJOI2007]Hide 捉迷藏(括号序列+线段树/动态点分治+堆)
括号序列做法真是神神神呀qaq直接去看岛娘的博客吧:传送门。 或者直接去看noi2008国家集训队论文《数据结构的提炼与压缩》 by cqx1.20upd:终于看懂了点分治+堆的方法…orz hzwer 准确理解每个堆的意义很关键… C[x] 维护的是x所控制的子树中每个点到x在重心树中的父亲的距离 B[x] 维护的是x所控制的子树中以x的每个儿子为根的子树到x的最大距离,即在重心树中x的每原创 2018-01-19 09:44:39 · 503 阅读 · 0 评论 -
hdu4547 CD操作(lca+map)
就是求lca。。。要注意如果A=B的话是需要0步。字符串映射可以采用map。原创 2018-01-26 21:09:43 · 367 阅读 · 0 评论 -
CIA11 毒瘤题(七维偏序,分块+bitset)
首先bitset很强呀x,我们针对每一维,对于每一个点预处理出比他小的集合。然后他的答案就是这k个集合的交。但是O(n^2k)的空间很gg。我们可以分块,对于每一维,只预处理出若干块集合,然后查询的时候找到离他最近的块,用这个块的答案暴力得出正确的集合。应该是O(nn−√+n2∗7/32)O(n\sqrt n+n^2*7/32)原创 2018-01-16 23:21:51 · 1240 阅读 · 0 评论 -
bzoj2626 JZPFAR(求K远点)
类似bzoj3053,求第K远点。打打板子,找找手感。 学习了一下priority_queue如果想自定义小根堆,要重载大于号。原创 2018-01-24 21:57:09 · 811 阅读 · 0 评论 -
loj6227「网络流 24 题」最长k可重线段集问题(类似loj6014 费用流)
这题好坑啊。(是我太菜了) 注意开区间这个问题。。。很玄学。。。看大佬的处理方式是把(x,y)变成(x*2+1,y*2)。我的强行理解是把原数轴上的每个点拆成两个,一个表示到这个点,一个表示从这个点开始。然后对于(x,x)这种开区间就可以变得合法了。要记得保证li< ri。这题还得开ll,sqrt(负数)会Tle.然后就基本和loj6014一样了,直接建图跑费用流即可。 然后,终于刷完网络流24原创 2017-12-18 11:04:48 · 424 阅读 · 0 评论 -
loj6122「网络流 24 题」航空路线问题(最长不相交路径)
读题又双叒叕出锅了。题目中说从最西端到最东端,所以是钦定了起点为1号点,终点为n号点。我们可以把原题转化为:找到从1到n的两条最长不相交路径。其中1和n可以经过两次,其他点只能经过1次。拆点,那么答案就是最大费用最大流。怎么输出路径呢,可以两遍dfs。最后不得不说,stl大法好。原创 2017-12-17 21:54:16 · 539 阅读 · 0 评论 -
bzoj1112 [POI2008]砖块Klo(平衡树/map/树状数组)
把一个区间的数都变成一个数,显然都变成中位数需要的次数最少,而次数就是后k/2的数的和-前k/2的数的和,因此原问题就是求区间中位数。区间中位数可以平衡树来搞,也可以用stl水过hh。先把1…k排序,前k/2个数扔进mp1,剩下的数扔进mp2,此时mp2中的最小值就是中位数mid。然后我们维护这两个map,以及这两个map的大小,和,即可。每次先删掉x,再扔进新的y,根据两个map的size把两个m原创 2017-11-09 16:30:10 · 369 阅读 · 0 评论 -
bzoj2342 [Shoi2011]双倍回文(manacher+暴力/set)
题意:求一个最长的回文串,满足它的后半段也是个偶数回文串。 首先用manacher处理出f数组,表示以i,i+1为对称轴的最长偶数回文的长度的一半(根据题目不难发现只有偶数回文才有用)(造样例推一推和p数组的关系)。然后枚举以x,x+1为对称轴的双倍回文,检验是否存在(枚举y,看以y,y+1为对称轴且过x+1点的回文是否存在 ,显然y最大到x+f[x]/2,最小到x+1)原创 2017-07-28 21:21:35 · 404 阅读 · 0 评论 -
bzoj2028 [SHOI2009]会场预约(set)
STL就是好之set 用set直接水过。。每次看看离自己最近的那个区间有没有重叠。。有就删了它。。注意一下iterator在有erase,insert的情况下不要乱++,–,乖乖循环。。还有< 的重载啊。要const 和引用。。原创 2017-08-11 20:38:50 · 549 阅读 · 0 评论 -
bzoj5132 [CodePlus2017年12月]火锅盛宴(线段树+stl)
stl+线段树硬刚,我也是无话可说。orz leoly原创 2018-02-13 23:48:53 · 339 阅读 · 0 评论 -
bzoj4538 [Hnoi2016]网络(树链剖分,线段树套堆)
给定一棵树,三种操作: 1、加入一条路径 2、删除一条已加入的路径 3、询问不过一个点x的路径的最大值。我们用树链剖分,把路径分成logn个连续的区间,然后对这些区间的补集(即不在路径上的所有点)扔进此条路径的值。线段树的每个节点维护一个可以删除的大根堆。询问时对线段树上所有包含点x的节点的堆顶取个max即可。时间复杂度O(nlog3n)O(nlog^3n),空间复杂度O(nlog2n)O(n原创 2018-03-08 16:03:10 · 318 阅读 · 0 评论 -
bzoj1572 [Usaco2009 Open]工作安排Job(贪心)
一开始还naive了一发。。。菜不禁声 我们把工作按截止日期从小到大排序,维护一个做了的工作的收益的小根堆,以及当前时间now,如果这个工作已经超时了,贪心地去已经做了的工作里找一个收益最少的,如果比它收益多,就替换掉他。原创 2018-02-21 09:38:50 · 437 阅读 · 0 评论 -
bzoj2882 工艺(SAM+map)
求S的最小循环串。我们构造出SS的SAM,从rt出发,每次选择标号最小的,走m次即可。字符集太大,我们只好map,还好求最小了呢(逃原创 2018-03-24 16:08:39 · 308 阅读 · 0 评论 -
bzoj2351 [BeiJing2011]Matrix(二维哈希)
挺裸的,,,搞出hash表,直接查询即可。原创 2018-03-20 10:27:00 · 507 阅读 · 0 评论 -
hdu4441 Queue Sequence(splay)
维护一个序列,三种操作: 1.insert p,在第p个位置(从0开始编号)之前插入目前不在序列中的最小正整数x,并在合法的最右位置插入-x。 2.remove x 删掉序列中的x和-x 3.query x 查询序列中x与-x之间的数的和 对于操作1,目前不在序列中的最小正整数可以用一个优先队列来维护,或者用线段树也行。合法的最右位置是哪里呢?如果p位置之前有t个正数,则合法的最右位置就是第原创 2018-02-25 13:40:46 · 403 阅读 · 0 评论