OI/ACM之数据结构
OI/ACM数据结构
「已注销」
前oi选手。
重庆市南开中学高2020级毕业生。
重庆大学计算机系2020级学生。
QQ1954486214欢迎添加讨论~
展开
-
AtCoder Beginner Contest 214 abc214_d D - Sum of Maximum Weights【最小生成树】【Kruskal】
题目链接 我们考虑最长的边会出现在何处。以这场边为中心,将这棵树分为两半,其中一半有xxx个点,另外一半有yyy个点,那么必然有x∗yx*yx∗y个点对的最短路,会经过这条最长边。于是我们考虑每条边作为最长边的状态。 于是考虑最小生成树,将边按照大小排序,对于每一条边加进来的时候,这条边已经是当前的最长边,于是我们考虑这条当前的最长边的两端的点的数量,然后我们用并查集维护即可。#include <map>#include <queue>#include <cmat原创 2021-08-15 10:27:18 · 205 阅读 · 0 评论 -
LOJ #2236. 「JLOI2014」松鼠的新家【树上差分】
板子题:#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define ll long long#define rep(i,x,y) for(ll i=(x);i<=(y);i++)#d...原创 2018-10-05 15:23:22 · 272 阅读 · 0 评论 -
BZOJ 2783 [JLOI2012]树【倍增一下】
#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define db double#define sg string#define ll long long#define rep(i,x,y)...原创 2018-10-21 14:39:30 · 171 阅读 · 0 评论 -
NKOJ P4251 「NOIP模拟」 直线的交点【树状数组】【离散化】
这道题我考试的时候又智障了……考试的时候我想到了离散化+树状数组,想到了逆序处理交点,但是就是没有想到逆序对……所以谁都不知道做题打比赛的时候会犯一些什么神奇的错误,只能平时多加练习,形成一种好的做题习惯,这样才能在关键的时候去避免它……由于我们只需要考虑直线与直线的交点是否在平板内部,而这样的直线与直线的交点也就相当于这两条直线被平板所截得的两条线段的交点,而这两条线段都是由直线分别与平板的...原创 2018-07-11 23:46:28 · 227 阅读 · 0 评论 -
BZOJ P4240 有趣的家庭菜园 【树状数组】
题目分析: 首先有一个很常用并且十分显然的结论(楼楼不知道怎么证明):一串数交换后形成的以原来编号为元素的序列的逆序对数为最小交换次数,其中交换为两两交换(其实这个结论都比较能感觉到它的正确性)。对于这道题,我们显然可以按照高度从小到大排序后枚举每个数,那么对于每个数它对答案的贡献就是剩下的数与它能够形成逆序对数的个数。这个时候我们就可以根据题意开两个数组,其中一个维护比一个数的位置大的...原创 2018-05-28 11:21:14 · 332 阅读 · 0 评论 -
BZOJ P1452 count 【树状数组】
就是一个二维线段树板题:#include &lt;cmath&gt;#include &lt;cstdio&gt;#include &lt;cstring&gt;#include &lt;iostream&gt;#include &lt;algorithm&gt;#define DB double#define SG string原创 2018-05-31 15:36:15 · 211 阅读 · 0 评论 -
BZOJ P4378 「POI2015」Logistyka【树状数组】【离散化】
#include &amp;lt;queue&amp;gt;#include &amp;lt;cmath&amp;gt;#include &amp;lt;cstdio&amp;gt;#include &amp;lt;cstring&amp;gt;#include &amp;lt;iostream&amp;gt;#include &a原创 2018-09-09 23:31:30 · 206 阅读 · 0 评论 -
BZOJ P1818 [Cqoi2010]内部白点【离散化】【树状数组】
扫描线。#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define ll long long#define rep(i,x,y) for(ll i=(x);i<=(y);i++)#d...原创 2018-09-18 20:21:07 · 192 阅读 · 0 评论 -
BZOJ P4659 和谐数【离散化树状数组】
题目分析:这道题没啥好分析的,X表示Ai左边比它大的个数,Y表示Ai右边比它大的个数,我们将Ai离散化后,就只需要求出X,然后就能够推出Y然后进行比较了。求X,也就是求一个序列中某个数的左边比它大的个数有多少个,树状数组直接水过去就可以了。参考代码:#include &lt;cmath&gt;#include &lt;cstdio&gt;#include &lt;cstri...原创 2018-06-14 23:33:10 · 171 阅读 · 0 评论 -
BZOJ P1103 「POI2007」大都市meg【dfs序】【树状数组+差分】
#include <queue>#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define ll long long#define rep(i,x,y) for(ll i=(x)...原创 2018-10-05 16:43:49 · 183 阅读 · 0 评论 -
【复习】【树状数组】
一、lowbitint lowbit(int x) {return x&(-x)}作用:取出十进制数x二进制表示中由最低位往最高位方向的第一个1如10的二进制为(1010)2(1010)_2(1010)2取出由最低位往最高位方向的第一个1:(10)2(10)_2(10)2即为数字2这个时候我们如果将原数x减去这个数的lowbit,在二进制的表示当中,我们就消除了由最低位往最高位方向的第一个1原理首先了解一下负数的二进制表示:计算机二进制中为了区分正负数,在最高位上原创 2020-09-09 19:22:16 · 179 阅读 · 0 评论 -
【复习】【差分数组】【树状数组区间修改】
差分数组的构建即在原数列的基础上,第nnn项与第n−1n-1n−1项做差得到新数列。记a[]a[]a[]为原数组且a[0]=0a[0]=0a[0]=0则差分数组c[]c[]c[]中的任意一项c[i]=a[i]−a[i−1],i>0c[i]=a[i]-a[i-1],i>0c[i]=a[i]−a[i−1],i>0那么a[i]=∑j=1ic[j]a[i]=\sum_{j=1}^ic[j]a[i]=∑j=1ic[j]差分数组的应用当我们需要对数组区间[x,y][x,y][x,y]进行原创 2020-09-14 07:25:16 · 99 阅读 · 0 评论 -
BZOJ P2237 龙珠雷达【单调队列优化DP】
#include <cmath>#include <deque>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define ll long long#define rep(i,x,y) for(ll i=(x...原创 2018-09-27 21:25:43 · 231 阅读 · 0 评论 -
POJ P1821 Fence【单调队列优化DP】
很显然的地方是我们要先把工匠按照sis_isi排序,这样每个工匠粉刷的木板一定在上一个工匠粉刷的木板之后,方便操作。f[i][j]f[i][j]f[i][j]表示前iii个工匠粉刷前jjj块木板(可以有空着不刷的木板),获得的最多的总报酬。接下来进行讨论f[i][j]f[i][j]f[i][j]。如果第iii个工匠可以什么也不刷,那么f[i][j]=f[i−1][j]f[i][j]=f[...原创 2018-10-12 19:10:18 · 174 阅读 · 0 评论 -
BZOJ P2442 [Usaco2011 Open] 修剪草坪【单调队列优化DP】
问题描述 在一年前赢得了小镇的最佳草坪比赛后,FJ变得很懒,再也没有修剪过草坪。现在,新一轮的最佳草坪比赛又开始了,FJ希望能够再次夺冠。然而,FJ的草坪非常脏乱,因此,FJ只能够让他的奶牛来完成这项工作。FJ有N(1 &lt;= N &lt;= 100,000)只排成一排的奶牛,编号为1…N。 每只奶牛的效率是不同的,奶牛i的效率为E_i(0 &lt;= E_i &lt;= 1,0...原创 2018-09-16 14:12:01 · 279 阅读 · 0 评论 -
BZOJ P1342 [Baltic2007] 静音问题 【单调队列】
大概先解释一下题意: 给定序列中有多少个长度为mmm的区间中最大值与最小值的差≤c≤c\leq c,输出左端点。如果无输出,则输出NONENONENONE给定题意之后这道是不是就变得十分简单了?由于nnn的范围有点大,用STLSTLSTL也许会TLETLETLE,不过这道题的时间范围是3s3s3s,应该可以过吧?当然这道题除去STLSTLSTL肯定还是有更加优秀的做法的,比如...原创 2018-07-23 14:31:17 · 217 阅读 · 0 评论 -
HDU 4699 Editor【栈模拟】
a[]a[]a[]记录光标前的内容,b[]b[]b[]记录光标后的内容,sum[i]sum[i]sum[i]表示a[1,i]a[1,i]a[1,i]的和,f[i]f[i]f[i]表示a[1,i]a[1,i]a[1,i]的最大前缀和。栈模拟一下就好了。#include &lt;bits/stdc++.h&gt;using namespace std;const int N=1e6+5...原创 2018-10-25 13:04:15 · 225 阅读 · 0 评论 -
BZOJ P1113 「POI2008」海报PLA【单调栈】
#include &lt;cmath&gt;#include &lt;cstdio&gt;#include &lt;cstring&gt;#include &lt;iostream&gt;#include &lt;algorithm&gt;#define ll long long#define rep(i,x,y) for(ll i=(x原创 2018-10-03 22:13:23 · 180 阅读 · 0 评论 -
BZOJ P2086 「POI2010」Blocks【单调栈】
题目描述 给出N个正整数a[1..N],再给出一个正整数k,现在可以进行如下操作:每次选择一个大于k的正整数a[i],将a[i]减去1,选择a[i-1]或a[i+1]中的一个加上1。经过一定次数的操作后,问最大能够选出多长的一个连续子序列,使得这个子序列的每个数都不小于k。 总共给出M次询问,每次询问给出的k不同,你需要分别回答。对于每一个kkk,我们把每一个a[i]−k...原创 2018-09-09 16:22:21 · 187 阅读 · 0 评论 -
NKOJ P3861 子矩阵【单调栈】
显然暴力不可取,由于这道题我们要处理有关最值的东西,所以我们考虑一下能够处理最值的数据结构。能够处理最值的数据结构大概就是线段树树状数组与单调栈队列一类与相关的东西。由于这道题肯定不能用线段树来解决(因为线段树处理的是区间问题而这道题需要考虑的是矩阵当然也许可以用二维树状数组来解决?但是时间复杂度肯定承受不了),所以我们考虑一下单调的线性数据结构。我们可以通过枚举子矩阵的两个边界III,JJJ...原创 2018-07-13 14:40:19 · 240 阅读 · 0 评论 -
NKOJ P3764 树上间距【并查集】
问题描述 有n个节点,初始时每个节点的父亲节点都不存在。你的任务是执行下列两种操作: 1 x y 把节点x的父亲设为y,距离为|x-y| mod 1000 输入保证执行指令前x没有父亲节点 2 x 询问x到它所在这棵树的根节点的距离带权并查集板子题,放代码:#include <queue>#include <cmath>#incl...原创 2018-09-09 12:44:22 · 110 阅读 · 0 评论 -
BZOJ P1370 [Baltic2003] 团伙【并查集】
感觉这道题和NOIPNOIPNOIP关押罪犯很相像?把每个人看成一个点,然后人与人之间的关系看成边,首先把点iii拆成两个点iii和i+ni+ni+n,如果两个人是朋友的话直接连边就好了,否则的话就xxx到y+ny+ny+n一条边,yyy到x+nx+nx+n一条边,最后统计一下答案就可以了。参考代码:#include <cstdio>const int Max=1e3...原创 2018-07-23 14:44:14 · 239 阅读 · 0 评论 -
BZOJ 3296: [USACO2011 Open] Learning Languages【并查集】
last[x]last[x]last[x]表示xxx这门语言上一个掌握的奶牛。然后合并。答案就是最后的集合个数-1。#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define db dou...原创 2018-11-06 15:55:05 · 215 阅读 · 0 评论 -
BZOJ 1015 [JSOI2008]星球大战starwar【并查集】
想了很久。无解。然后看了题解。看到最上面四个字:“逆向处理”然后瞬间动完了!正难则反!!!!然后就是一道水题了!!!#include &lt;cmath&gt;#include &lt;cstdio&gt;#include &lt;cstring&gt;#include &lt;iostream&gt;#include &原创 2018-10-23 20:22:59 · 183 阅读 · 0 评论 -
AtCoder Grand Contest 026 A - Colorful Slimes 2【模拟】【并查集】【map】
ProblemStatementProblemStatementProblem Statement Takahashi lives in another world. There are slimes (creatures) of 100001000010000 colors in this world. Let us call these colors Color 1,2,…,10000...原创 2018-07-17 10:29:55 · 346 阅读 · 0 评论 -
BZOJ P4551 LOJ P2054 [TJOI2016][HEOI2016] 树【并查集】
题目分析: 总之这是一道很水的题,没有多么难,也就是普通的逆向思维一发就好了。 首先这道题是很显然的一道并查集可做的题(据说可以用一些高级的数据结构),我们正向考虑每个点所在的集合(F[])所代表的含义,很显然的一个想法就是每个点所在的集合的关键字都是它最近的打了标记的祖先,但是这样设定集合含义的话是有问题的,因为当我们对一个添加标记的时候,有可能会导致以这个点为根节点的所有...原创 2018-06-22 17:57:41 · 197 阅读 · 0 评论 -
【复习】【并查集】
并查集:若干个元素不断放入共同的“堆”里面,中途查询某两个元素是否属于同一个堆初始化:将每个元素放在以自己为编号的“堆”for(int i=1;i<=n;i++) f[i]=i;路径压缩找相同的“堆”(找父亲)public static int find(int x) { if(f[x]==x) return x; return f[x]=find(f[x]);}合并两个元素先判断是否处于同一个“堆”,如果不是就合并public static void merge(i原创 2020-09-07 00:41:00 · 130 阅读 · 0 评论 -
BZOJ 2752 [HAOI2012]高速公路(road)【线段树】【概率期望】
显然, 概率期望是一个幌子。设i−&gt;i+1i-&gt;i+1i−>i+1的边长为a[i]a[i]a[i],那么对于询问区间[l,r][l,r][l,r],易知答案为(注意边转点对区间的小影响):ans=∑i=lra[i]∗(r+1−i)∗(i+1−l)Cr+2−l2ans=\frac{\sum_{i=l}^ra[i]*(r+1-i)*(i+1-l)}{C_{r+2-...原创 2018-11-04 21:20:20 · 203 阅读 · 0 评论 -
BZOJ P1798 LOJ P10129 [AHOI2009] 维护序列【线段树】【双Lazy】
双LazyLazyLazy。线段树里面存储三个量:Sum,Mul,AddSum,Mul,AddSum,Mul,AddSumSumSum表示区间和,用ax+bax+bax+b的形式表示MulMulMul表示该区间的乘延迟标记,AddAddAdd表示该区间的加延迟标记。#include <bits/stdc++.h>#define LL long longusing n...原创 2018-08-01 21:28:41 · 205 阅读 · 0 评论 -
HDU P1698 Just a Hook【线段树】
题目不难,但是由于此处的标记感觉十分巧妙,所以提一下。容易发现我们在涂色的时候会出现某一段区间的颜色有多种的的情况,这个时候我们用一个类似于LazyLazyLazy的标记ColorColorColor标记一下,如果Color==−1Color==−1Color==-1说明此段区间颜色不唯一,否则颜色唯一。而我们在查询的时候避开Color==−1Color==−1Color==-1的情况搜索左儿...原创 2018-07-27 18:46:23 · 99 阅读 · 0 评论 -
HDU P6183 Color it【线段树】【动态开点】
OrzOrzOrzOrzOrzOrz感觉以前写的动态开点都很板……涨姿势……代码的原型好像来源于ClarisClarisClaris,受用不尽OrzOrzOrzOrzOrzOrz。#include <cstdio>#define min(X,Y) (X>Y?Y:X)const int Max=1e6+5;const int Inf=1e9;int X,Y1,Y...原创 2018-07-30 04:44:44 · 239 阅读 · 0 评论 -
POJ P2828 Buy Tickets【线段树】【详细题解】
大概说一下题意: 有nnn个人,带着想要插队的位置(从000开始编号)和自身的一个valvalval值进行插队,输出最后的valvalval序列。题意就是这样,正着想没什么思路那就想想逆推,毕竟正难则反。其实这道题为什么要逆推也容易理解。序列始终是一个动态序列,我们无法在要求的时间内处理,而最后的序列是固定的,所以我们考虑逆推。从后往前,那么每个人的位置其实都固定了。比如...原创 2018-07-30 00:37:06 · 226 阅读 · 0 评论 -
NKOJ P2386 「NOIP模拟」 排队【线段树】【单调栈】
题目描述 一个队伍中站在最前面的人是最矮的,并且站在最后面的人是最高的,那么这个队伍是和谐的。 现在NN N个人站成一队,第iii个人身高为hihih_i,对于队伍中的一个区间[L,R][L,R][L,R],如果第LL L 个人的高度小于[L+1,R][L+1,R][L+1,R]所有人的高度,并 且第RRR个人的高度大于[L,R−1][L,R−1][L,R−1]所有人的高度,那么[L...原创 2018-07-21 03:44:52 · 302 阅读 · 0 评论 -
HDU P2795 Billboard 【线段树】
很优秀的一道题,做了各种线段树才感觉自己见的真的很少。我们把每一层看做一个叶子节点,每段区间除了存储左右端点之外再存储一个LenLenLen值,LenLenLen表示在当前区间内剩下的某一层最长的宽度。于是判断−1−1-1的情况就只需要判断需要与Tree[1].LenTree[1].LenTree[1].Len的大小即可,然后我们一边更新一边查找即可。参考代码:#include...原创 2018-07-27 19:11:13 · 102 阅读 · 0 评论 -
BZOJ P3211 LOJ P10128 花神游历各国【线段树】
注意到两个地方: 1.1,01,01,0开根后仍然是1,01,01,0 2.任何非零数不断开根后最终一定会变为111所以我们在线段树当中标记一个当前区间内的数是否都是111或者000就可以了。#include &lt;cmath&gt;#include &lt;cstdio&gt;#include &lt;cstring&gt;#include &lt;iostream&am原创 2018-08-01 22:25:30 · 195 阅读 · 0 评论 -
LOJ P2086 BZOJ P4653「NOI2016」区间 【线段树】【离散化】
比较水。按照坐标作为叶子结点建立线段树,维护该点被选择的区间覆盖了的次数。将每个区间按照长度排序,在合法条件下每次试探来更新答案。坐标太大,所以将坐标离散化。#include &lt;bits/stdc++.h&gt;#define LL long long#define For(I,X,Y) for(LL I=(X);I&lt;=(Y);I++)#define Fora(I...原创 2018-08-23 23:14:00 · 208 阅读 · 0 评论 -
BZOJ P3747「POI2015」Kinoman【线段树】
#include <queue>#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define ll long long#define rep(i,x,y) for(int i=(x...原创 2018-09-11 18:26:09 · 174 阅读 · 0 评论 -
BZOJ P2957 楼房重建【线段树】
明明是线段树的水题吖…我居然还wa了三次#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define db double#define ll long long#define rep(i,x...原创 2018-10-03 11:16:16 · 185 阅读 · 0 评论 -
BZOJ P1012 LOJ P10127 [JSOI2008] 最大数【线段树】
题目分析:考虑线段树。我们先建一个叶子节点200000大的空树,用Cnt表示现在已经插入了Cnt个数,那么此时插入一个新的数就将第Cnt+1个叶子结点(从左往右)变为要插入的数,然后我们维护区间最大值;对于查询L-队列末的最大值,就相当于查询线段树上Cnt+1-L~Cnt的最大值,得解。参考代码:#include &amp;amp;amp;lt;cmath&amp;amp;amp;gt;#include &amp;amp;amp;lt;cst原创 2018-05-28 17:48:07 · 253 阅读 · 0 评论 -
BZOJ P3526 「POI2014」Card【线段树】
记录一个ck[2][2]ck[2][2]ck[2][2],ck[0/1][0/1]ck[0/1][0/1]ck[0/1][0/1]表示当前区间左端点选择a/b,a/ba/b,a/ba/b,a/b能否满足题意,然后区间合并一下。#include &lt;queue&gt;#include &lt;cmath&gt;#include &lt;cstdio&gt;#include &lt;原创 2018-09-10 00:04:39 · 225 阅读 · 0 评论