数据结构
文章平均质量分 53
扩展的灰
扩展的灰(Extended Ash)
展开
-
Jzoj5409 Fantasy
Y sera 陷入了沉睡,幻境中它梦到一个长度为N 的序列{Ai}。对于这个序列的每一个子串,定义其幻境值为这个子串的和,现在Y sera 希望选择K 个不同的子串并使得这K 个子串的幻境值之和最大。然而由于梦境中的种种限制,这些子串的长度必须在L 到R 之间。你需要告诉她,最大的幻境值之和。对于100% 的数据,有1 此题做法比较神奇,也很好懂,但是很难搞清楚如何去构原创 2017-11-06 20:55:19 · 297 阅读 · 0 评论 -
Jzoj5410 小型耀斑
Uthuso 的核反应失控了,她在地灵殿释放了几颗大核弹.地灵殿可以看做一个大小为n*m 的矩阵.一颗大小为k 的核弹,对于任意一个与爆炸中心曼哈顿距离小于k 的地区,会造成(k-(该地区到爆炸中心曼哈顿距离))*(该地区的价值)的损失.现在,地灵殿方面想统计一下每颗核弹造成的损失,请你来帮忙计算.哇我十月都在做些什么毒瘤题啊这个题读者可以稍微思考一下再看,因为下面的东西会很难看这个题原创 2017-11-06 21:14:55 · 324 阅读 · 0 评论 -
Jzoj5417 方阵
题目背景 热烈庆祝北京师范大学附属实验中学成立100周年!问题描述 为了准备校庆庆典,学校招募了一些学生组成了一个方阵,准备在庆典上演出。 这个方阵是一个n*m的矩形,第i行第j列有一名学生,他有一个能力值Aij。 校长会定期检查一个p*q的方阵,询问这个方阵的学生能力值之和,或是学生能力值的最大值,或是学生能力值的最小值。由于校长不原创 2017-11-07 07:41:48 · 356 阅读 · 0 评论 -
Jzoj5419 筹备计划
题目背景 热烈庆祝北京师范大学附属实验中学成立100周年!问题描述 校庆筹备组的老师们正在寻找合适的地方来举办校庆庆典。 学生们的位置和可以举办庆典的位置在x轴的正半轴取值在[1,n]的整数位置上。 老师们选择的地点是会根据参加典礼的学生位置来决定的,具体来说:定义一个位置的距离和为该位置到所有参加学生的距离之和。如果一个位置的距原创 2017-11-07 08:00:07 · 311 阅读 · 0 评论 -
Jzoj4791 矩阵
在麦克雷的面前出现了一个有n*m个格子的矩阵,每个格子用“.”或“#”表示,“.”表示这个格子可以放东西,“#”则表示这个格子不能放东西。现在他拿着一条1*2大小的木棒,好奇的他想知道对于一些子矩阵,有多少种放木棒的方案。(不是填满)我们考虑用前缀和的方式求出答案,这里我们假设所有的方案都是有向的,都是向上或者向左我们令s[i][j]表示子矩阵(1,1,i,j)的答案,那么s[i]原创 2017-10-26 20:48:49 · 331 阅读 · 0 评论 -
Jzoj4784 Map
这个题意很简单,就是问你连一条边会增加多少双联通点对按照一般的方法,先用Tarjan缩点化为一颗树,每次连起来就在树上找路径统计答案答案的统计方法,设树上节点i(原图的一个双联通块)的大小为v[i]那么一条路径[x,y]的端点被连接起来,贡献应该是(Σv[i])^2-Σv[i]^2,其中i∈x~y的路径这样的话可以用倍增或者树剖求lca来解决码量比较大#pragma G原创 2017-10-25 19:00:49 · 322 阅读 · 0 评论 -
Jzoj4778 数列编辑器
我们发现前四个操作可以用双向链表维护,而最后一个操作有一个限制就是1#include#include#include#define N 1000010using namespace std;int l[N],r[N],s[N]; char c[5];int w[N],f[N]={-129},n=0,m,t,cnt=0;int main(){ freopen("editor.原创 2017-10-24 20:33:52 · 295 阅读 · 0 评论 -
Jzoj4744 同余
线段树套分块/主席树!我们考虑到ai,p,q比较小(若p较大,则kp+q的数量就比较少,可以暴力枚举若p较小,可以预处理,令g[i][j]表示膜i余j的数的个数我们取这个界为sqrt(maxp)=100将询问放到每个节点上,依次处理处[1,i]的答案最后ans(l,r)=ans(r)-ans(l-1)即可#pragma GCC optimize("O3")#pragm原创 2017-10-23 19:28:56 · 385 阅读 · 0 评论 -
Jzoj4747 被粉碎的线段树
额这个题么有一个很关键的点:结点个数依然为2N-1(证明可以看sam的讲稿)不难发现以下性质:区间定位个数+区间所覆盖的节点个数=2*区间长度所以问题变为,一个区间覆盖了多少个节点?我们可以求出所有的节点,然后这个问题就是一个二维偏序计数问题了具体用离线+按照r排序套上树状数组即可#include#includeusing namespace std;inline原创 2017-10-23 19:48:31 · 401 阅读 · 0 评论 -
Jzoj1306 Sum
先预处理出取模后的前缀和s,那么问题变成min(s[j]-s[i]%P)且s[j]-s[i]%P>=k把s序列反过来作,对于每个数s[i],维护一个set存有s[i]+1~s[……原创 2017-09-19 21:12:53 · 483 阅读 · 0 评论 -
Jzoj1277最高的奶牛
给你一个序列s和n个限制,(a,b)表示s[a]这不是裸的差分约束吗哈哈哈哈 诶TLE了怎么破认真观察发现:对于每个限制,要么不相交,要么包含,所以对于一组询问(a,b),将(a,b)内的数全部减掉1即可,可以用前缀和不过记得判重。。。这个很坑#include#includeusing namespace std;set f[10010];int n,m,h,k,s[1原创 2017-09-19 20:38:01 · 429 阅读 · 0 评论 -
Jzoj1155 有根树的同构(树的Rabin-Karp)
这里简单说一下rabin-karp其实就是字符串hash算法,不理解的可以自行百度对于一颗树,我们可以将其变为一个括号序列,对这个括号序列作rabin-karp,让后就可以轻松判断同构了是不是很简单细节不多说,有一点必须注意:因为子树是无序的,所以dfs时必须对子树排序#include#include#include#includeusing namespace std;原创 2017-09-19 19:51:46 · 571 阅读 · 0 评论 -
Jzoj1310 生日礼物
先模拟,这个是双向链表的工作,让后将移动过后的序列取出来,在序列上面作LIS,那么答案就是n-LIS为什么?很简单LIS上的数不用动其他的都一次移动搞定就好了原创 2017-09-19 22:02:39 · 545 阅读 · 0 评论 -
Jzoj1321 灯
我们考虑到点数比较少,而且按下开关的操作可以用异或代替,但是问题是2^35直接搜索会超时,所以我们采用折半搜索+map就可以ac了,复杂度O(2^(n/2)n)原创 2017-09-20 18:10:23 · 291 阅读 · 0 评论 -
Jzoj2921【NOI2012模拟题】字符串识别
神(shui)题,AC后看了下别人的code发现全都是后缀数组(难看)可能是因为我太弱了所以只想到SAM的算法做法:建立SAM,求出parent树,预处理倍增,让后就可以O(lg n)查询一个字串的出现次数了接下来,我们对于每个l∈[1,n],我们求出一个最小的r使得[l,r]在整个串里面只出现一次那么对于每个点i,ans[i]有两种情况:1.i被一个最短的区间[lj,原创 2017-09-20 20:54:46 · 400 阅读 · 0 评论 -
Jzoj2934 字符串函数
首先显然不能每个串暴力,我们考虑单独计算每一个字符的贡献对于b[i],若我们找到a[j]=b[i],可以分两种情况讨论1.i所以贡献就是i*j2.i>j 情况是对称的,所以贡献是(n-i+1)*(n-j+1)所以对于原创 2017-09-20 21:48:34 · 388 阅读 · 0 评论 -
Jzoj3518 进化序列
Abathur采集了一系列Primal Zerg 的基因样本,这些基因构成了一个完整的进化链。为了方便,我们用A0,A1...An-1 这n 个正整数描述它们。一个基因Ax 可以进化为序列中在它之后的基因Ay。这个进化的复杂度,等于Ax | Ax+1...| Ay的值,其中| 是二进制或运算。Abathur 认为复杂度小于M 的进化的被认为是温和的。它希望计算出温和的进化的对数原创 2017-09-26 21:44:39 · 373 阅读 · 0 评论 -
Jzoj3523 JIH的玩偶
这个题没有修改,只是从节点到根,所以简单的倍增即可维护区间最大,最小和答案,那么Ans[x][j]=max(Ans[x][j-1],Ans[f[x]][j-1],Max[f[x]][j-1]-Min[x][j-1])原创 2017-09-27 21:19:37 · 406 阅读 · 0 评论 -
Jzoj3547 MEX
有一个长度为n的数组{a1,a2,...,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。这是一个经典的主席树的题目,对于每个节点i开一颗线段树存储[1,i]区间内每个数最后出现的位置,那么查找的时候直接再树上类似平衡树找最小即可#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#include#include#in原创 2017-09-27 21:24:00 · 283 阅读 · 1 评论 -
Jzoj3931【NOIP2014day1官方数据】联合权值
题意略过,口胡正解对于每个节点i,我们求出每个与i相连的节点的权值和s,那么i的贡献就是∑d[j]*(s-d[j])求最大就排个序咯#include#include#include#define M 10007using namespace std;int n,d[200010],mx=0,sum=0;vectorint> G[200010];inline bool原创 2017-10-05 20:54:11 · 492 阅读 · 0 评论 -
Jzoj3928 射♂击
有问题,找副连,无聊的时候当然也可以找他啦。小W找到了他的叔叔——东厂厂长——宇宙超级无敌老WS yy。他们叔侄两个商量之后决定用弹弓打破社区里的一些窗户,但是弹弓每秒只能彻底打破一扇窗户。而且如果某户窗户的主人回来了的话,他们就不能进行破坏了(不然会死得很惨的)。因为有的人装的玻璃好,有的人装的玻璃差,有的人装的玻璃高,有的人装的玻璃矮,所以你不能要求他们叔侄两个打破不同的窗户获得的快乐值必须相原创 2017-10-04 11:40:15 · 276 阅读 · 0 评论 -
Jzoj3717【NOI2014模拟7.2】火车
很显然的树剖题目嘛,加上个区间打标记即可,可以用树状数组注意数据很坑,dfs爆栈,所以要从最中间开始dfs原创 2017-09-27 21:27:48 · 663 阅读 · 0 评论 -
Jzoj3806 小X 的道路修建
给你一个图,求一个最大边和最小边差值最小的生成树首先我们可以枚举最小边,每次跑一个最小生成树即可但是这样会超时,我们考虑优化采用最优性剪枝,假设我们当前树中的最小边是i,当前边是j,当前最优答案是ans,那么对于所有边k使得Length(j)-Length(k)>Ans的边在枚举最小边的时候可以直接跳过,下一次直接从k+1开始枚举,这样就可以优化时间复杂度,期望100分当然这不是正原创 2017-10-02 11:53:12 · 400 阅读 · 0 评论 -
Jzoj3882 近邻
有n个无聊的人,对于一条长为m(n我们要知道的是在每个人加入之后整个队伍的友善值。为了更方便确认你能够得到答案,输出每个人加入后整个队伍的友善值的异或和即可。这个题就是要维护一个动态插入和求前继后续的序列,那么我们可以用map但是TLE了,那么就改成好写又好看的zkw线段树即可,当然正解其实是离线处理+链表,不过因为位运算常熟小所以也可以掉打一些跑得慢的#include#原创 2017-10-02 21:27:27 · 318 阅读 · 0 评论 -
Jzoj3883 线段树
题意:给你一颗树,每次选择一条简单路径进行染色,问最后每条边的颜色此题非常之坑,各种卡,主要是卡栈空间首先看题就写了个树剖,让后各种TLE和RE,开了O3还是不行#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#pragma comment(linker, "/STACK:102400000,102400000") #i原创 2017-10-03 16:58:17 · 286 阅读 · 0 评论 -
Jzoj3895 数字对
给你一个序列s,求出所有最长的区间[l,r]使得存在一个k∈[l,r]且对于任何i∈[l,r]都有s[k]|s[i]显然如果这个k存在,那么s[k]一定是s[l]~s[r]的最小值现在问题就成了,求一个最长的区间使得s[l]~s[r]的最小值=s[l]~s[r]的gcd那么我们可以二分答案,而求一个区间最小和gcd都可以用ST表完成,所以整体复杂度nlg^2n(虽然说这是solut原创 2017-10-03 17:26:51 · 389 阅读 · 0 评论 -
Jzoj3898 树的连通性
题意:给一棵树,每次删边或者询问连通性,强制在线其实这题做法很多嘛,简单说一下一眼看过去肯定是LCT啦,于是马上开始打打到一半发现似乎不用LCT?好像树剖也可以嘛结果发现树剖也不用,直接一个dfs序就可以了嘛用线段树维护每个点能到达的最远的祖先,删边的时候将整个区间覆盖即可注意,对于在子树中已经断开的节点不要再覆盖,可以记录每个节点深度#pragma GCC opi原创 2017-10-03 19:37:42 · 398 阅读 · 0 评论 -
Jzoj3901 二叉查找树
题意:给你一个bst插入的顺序问你完成这些操作需要多少次比较(即这颗bst所有节点深度之和)显然,我们在bst中插入一个节点x,它一定是它前继或者后续的儿子这样的话,我们记录每个点的深度,每次找前继和后续即可本来应该用链表的,我还是为了卡时用了ZKW线段树#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#include原创 2017-10-03 20:22:09 · 332 阅读 · 0 评论 -
Jzoj3908 吴传之火烧连营 (梦回三国系列)
【题目背景】蜀汉章武元年(221年),刘备为报吴夺荆州、关羽被杀之仇,率大军攻吴。吴将陆逊为避其锋,坚守不战,双方成对峙之势。蜀军远征,补给困难,又不能速战速决,加上入夏以后天气炎热,以致锐气渐失,士气低落。刘备为舒缓军士酷热之苦,命蜀军在山林中安营扎寨以避暑热。陆逊看准时机,命士兵每人带一把茅草,到达蜀军营垒时边放火边猛攻。蜀军营寨的木栅和周围的林木为易燃之物,火势迅速在各营漫延。蜀军大乱,原创 2017-10-04 11:04:28 · 661 阅读 · 0 评论 -
Jzoj4711 Binary
如果没有这个+x的话应该都能想到是按位拆开每一位处理吧现在考虑这个+x如何处理一个数v加上x,如果有(v+x)%2^i>2^(i-1)的话,那么就必然第i位为1所以我们考虑,对于每一个询问的y,若有y&(1mod (1具体实现可以用fenwick树(一个小小的常熟优化,不要用%2^i而要用&(2^i-1))#pragma GCC opitmize("O3")#prag原创 2017-10-14 22:09:04 · 293 阅读 · 0 评论 -
Jzoj4699 Password
首先,orzYxuanwKeith,这套题后面两个把我虐爆了我们发现,B序列每一个元素都肯定出现在A中,那么考虑最大的元素B1,显然就是A中元素最大的那个删除后让后我们继续求B2,显然也是最大的那个,让后删除B2,gcd(B1,B2)后,我们就可以得到B3....以此类推偷懒用了map+O3#pragma GCC optimize("O3")#pragma G++ opt原创 2017-10-12 16:05:46 · 420 阅读 · 0 评论 -
Jzoj4614 字符串(待填)
(EMPTY)原创 2017-10-07 22:32:40 · 329 阅读 · 0 评论 -
Jzoj4605 排序
树套树?莫队?分块?好像都可以?我们发现询问只有一个,我们考虑二分这个最后答案我们将序列中所有大于mid的值变成1,否则变成0,那么,排序就变成了将序列的01放在头或尾,可以用线段树区间修改做到#include#include#define mid (l+r>>1)#define ls x#define rs xusing namespace std;int s[400原创 2017-10-07 22:08:35 · 367 阅读 · 0 评论 -
Jzoj4603 颜料大乱斗
看了一眼就开始想分快树套树莫队了吧?233333333但是这道题有一个奇怪的条件!颜色不超过30种!是不是一个状压就完了?23333333333333333333#include#define ls x#define rs x#define mid (l+r>>1)int s[400040],t[400010],n,m,c;void pushdown(int x){ i原创 2017-10-07 21:54:47 · 379 阅读 · 0 评论 -
Jzoj4604 树
子树的问题都是dfs序的工作啦,加上个线段树就ok了#include#define mid (l+r>>1)struct Edge{ int v,nt; } G[200010];int h[100010],cnt=0,clk=0,l[100010],r[100010];int s[400040],n,m,d[100010]; char c[5];void adj(int x,in原创 2017-10-07 22:01:34 · 409 阅读 · 0 评论 -
Jzoj4594 Dynamic len (待填)
(EMPTY)原创 2017-10-07 21:28:13 · 387 阅读 · 0 评论 -
Jzoj5459【NOIP2017提高A组冲刺11.7】密室
小X 正困在一个密室里,他希望尽快逃出密室。密室中有N 个房间,初始时,小X 在1 号房间,而出口在N 号房间。密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会单向地创造一条从房间X 到房间Y 的通道。另外,想要通过某个传送门,就必须具备一些种类的钥匙(每种钥匙都要有才能通过)。幸运的是,钥匙在打开传送门的封印后,并不会消失。然而,通过密室的传送门需要耗费大量的时间,因此,原创 2017-11-07 15:34:43 · 669 阅读 · 0 评论 -
Jzoj5460【NOIP2017提高A组冲刺11.7】士兵训练
好长一道题结果发现就是个叫你求最大次大的东西我们跑出dfs序和主席树后,开始分类讨论1.只有一个节点2.有不止两个最大值,且在此子树外有l[i]不为0的节点3.只有一个最大值,而次大值+子树外l[i]的最大值不等于最大值4.只有一个最大值,而次大值+子树外l[i]的最大值等于最大值,就取第三大值和最大值相加,和次大值和子树外次大值相加(这里的次大和第三大都是严格的)主席原创 2017-11-07 15:48:13 · 374 阅读 · 0 评论 -
Jzoj5422 天才绅士少女助手克里斯蒂娜
居然是向量叉乘!考场上忘了怎么叉乘了。。。考完后发现可以推一波式子Σ(aj*bk-ak*bj)^2{1Σak^2)*(Σbk^2)-(Σak*bk)^2 {1让后用BIT维护a的平方和,b的平方和和ab的和就好了#pragma GCC optimize("O3")#pragma G++ optimize("O3")#include#include#include#de原创 2017-11-07 17:09:04 · 1267 阅读 · 0 评论 -
Jzoj4738 神在夏至祭降下了神谕(GOSICK系列)
我们先写裸的dp,设φ[i]表示长度为i的划分方案数,φ(0)=1有φ(i)=Σφ(j) (|sum[j,i]|sum用前缀和预处理就好(将0视为-1)那么我们考虑用树状数组快速更新,我们发现,若s[j](前缀和)在[s[i]-k,s[i]+k]中就可以合法转移所以我们考虑将φ[i]的值插入到s[i]的位置上,每次更新即可注意s[i]可能为负数,要开两倍长度#include原创 2017-10-23 07:15:01 · 618 阅读 · 0 评论