• 2024-07-03线段树的基本知识和初级运用
    前言线段树绝对是出题人最爱考的高级数据结构了。它快、灵活、码量也大,相当考验OIer的综合能力。所以好好学习一下线段树是相当必要的。基础线段树是基于二叉树的。通过为二叉树的每个节点赋予线段的意义,线段树可以维护很多的区间信息,包括但不限于区间和、区间最大值、区间第
  • 2024-07-03[Hackerrank University Codesprint 5] Sword profit (李超线段树)
    [HackerrankUniversityCodesprint5]Swordprofit李超线段树考虑大力推式子。写出在第\(i\)所商店的第\(k\)把剑在第\(j\)所商店卖掉的价格。\[\text{profit}=\max(0,q_i-(j-i)\cdotd_i-r_j)-(a_i+k\cdotb_i)\]显然利益一定要是正的才有价值,所以\(\max\)可以改到
  • 2024-07-02区间更新、求和问题
    树状数组、线段树的实现与应用、模运算的使用。一、题目  定义在数组上的操作,给定大小为N的数组以及N个数。之后给出M个操作,则要输入M行。每一行操作第一个数代表操作类型,要么是U要么是C。对于U类型的操作,紧跟3个数a、b、k,也就是把数组下标a到b的每个数替换为该数的k次方(
  • 2024-07-02P4097 【模板】李超线段树 / [HEOI2013] Segment
    P4097【模板】李超线段树/[HEOI2013]Segment前言李超线段树并不是一种新的线段树,而是对一类题维护最值的过程做了改进,使线段树仍然有不错的复杂度。引入简要题意实现两种操作:在区间\([x_0,y_0]\)上加入一条两端为\((x_0,y_0)\),\((x_1,y_1)\)的线段。查询下标\(k
  • 2024-07-02树状数组和线段树板子
    树状数组板子#define_CRT_SECURE_NO_WARNINGS#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<sstream>#include<string>#include<string.h>#include<iomanip>#include<stdlib.h&g
  • 2024-07-022024.7.1 - 7.15
    Question1-[ABC360G]SuitableEditforLIS给定一个长度为\(n\)的序列\(A\),你可以执行如下操作恰好一次,最大化LIS的长度:选定一个下标\(x\)满足\(1\leqx\leqn\),选定一个任意的整数\(y\),然后将\(A_x\)替换为\(y\)。\(1\leqn\leq2\times10^5,1\leqA_i\le
  • 2024-07-012024.7.1 之后的做题小记
    7.1P7124[Ynoi2008]stcm维护一个\(O(n\logn)\)级别的子树补不删除莫队。Solution1:考虑菊花图,忽略根节点,一个显然的做法是把这些节点扔进线段树,然后遍历某个节点时候就把它的兄弟节点内所有点加进来。这个做法是线段树所有节点大小和即\(O(n\logn)\)。然后在一条链上
  • 2024-07-01线段树基础设计的个人理解
    概述线段树是一棵二叉搜索树,每个树节点代表一个线段或者说一个区间范围,常用于解决各种区间修改、区间查询问题,本文暂时只讲述基础概念,用经典的区间最值问题作为示例。数据结构经典代码模板都是用数组来实现线段树,按照层序遍历的顺序给每个节点分配数组空间,从根节点代表的
  • 2024-06-30(线段树,最小值不能低于0的)北京建筑大学2024年程序设计竞赛 A 寿命修改
    题意:code:#pragmaGCCoptimize("O3")#pragmaGCCoptimize("Ofast")#pragmaGCCoptimize("unroll-loops")#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;usingu64=unsignedlonglong;usingPII=p
  • 2024-06-24[题解]CF1175E Minimal Segment Cover
    思路这是一道简单的DP题,DP题的核心就是状态转移。先来说一说\(dp\)数组的含义。\(dp_{i,j}\)表示从\(i\)这个点用\(2^j\)条线段能走到的最远的点。我们再来考虑一下边界情况。因为我们只用\(2^0\)条线段,那么:\(dp_{i,0}=\max(dp_{i,0},r)\)接着,我们递推一
  • 2024-06-23线段树进阶
    P5787二分图/【模板】线段树分治普通二分图:染色染色无法扩展,先考虑加边如果两点在同一联通块内:加边只需要考虑连边的两个点颜色是否相同如果不在同一联通块内,第一次加边为YES,合并联通块,接下来的操作同上再考虑删边线段树分治思想解决问题:容易插入,难删除,且插入顺序不影响
  • 2024-06-23线段树进阶 学习笔记
    线段树合并学习笔记线段树分治P5787考虑怎么判断二分图。先考虑弱化的版本。不考虑删边加边,则可以直接黑白染色。考虑只加边,不删边,分类讨论:注意到对于同一个连通块,一共只有两种染色方式。加的边在两个连通块之间,一定是Yes,并确定了两个连通块的染色方案。加的边在连通
  • 2024-06-22[题解]AT_abc256_h [ABC256Ex] I like Query Problem
    思路首先可以看一下P4145,在P4145中使用了一种叫势能线段树的Trick。对于势能线段树,我个人的理解是,对于一段区间(或一个点)直接暴力维护,在经过很少的次数后操作将没有意义的题就可以使用势能线段树。在本题中,如果没有推平操作,显然我们可以直接使用势能线段树,时间复杂度可以轻
  • 2024-06-22[题解]AT_abc225_e [ABC225E] フ
    思路对于每一个7,我们都可以抽象为这样一个图形:如果有两个7,无论它是否有重合部分,红色部分是不需要判断的,只需要看绿色的部分。因此,我们的问题就简化为了三角形,而不是四边形。对于所有的7,都有一个公共顶点:\((0,0)\)点。所以,我们可以引出一个叫斜率的概念来判断这些三角形
  • 2024-06-20CF484E 题解
    很好的数据结构题,加深了蒟蒻对于可持久化线段树的理解。题意给定一个序列\(\{a_n\}\)(\(1\len\le10^5,1\lea_i\le10^9\)),有\(m\)($\lem\le10^5$)个询问,每次询问给出\(l,r,k\),表示询问区间\([l,r]\)里长度为\(k\)的子区间的最小值最大是多少。题
  • 2024-06-19动态开点线段树
    众所周知,线段树要开\(4\)倍空间,但是这样会浪费许多空间,所以动态开点线段树就诞生了。动态开点线段树适用于\(n\)比较大的情况,它没有优化时间复杂度,优化的是空间复杂度。具体的,我们不再用\(p\times2\)和\(p\times2+1\)作为\(p\)的左右儿子了,而用两个数组\(ls_{p}\)
  • 2024-06-14重链剖分与线段树
    树链剖分将整棵树可以铺到线性的去维护,于是利用线段树等可维护线性数组的数据结构,就可以做到很多事情了当然也包括省赛的J题--奇偶最小生成树,并且线段树还支持修改操作,这是ST表与普通倍增维护做不到的这是没有模数的代码:intn,m;llw[N];inthead[N],cnt;structE
  • 2024-06-13线段树学习笔记
    线段树(SegmentTree)是一种基于分治思想的数据结构,可以在\(\mathcal{O}(\log~n)\)的时间内完成区间修改和区间查询等操作。1.1线段树基础此部分介绍普通线段树的基本思想与操作。1.1.1基本思想线段树本质上就是一棵二叉树,它的每一个节点表示一段区间的信息,对于一个长度不为
  • 2024-06-13【模版】线段树
    https://www.luogu.com.cn/problem/P3372#include<cstring>#include<iostream>#include<algorithm>usingnamespacestd;#defineN100005#defineLLlonglong#definelcu<<1#definercu<<1|1LLw[N];structTree{//线段树LL
  • 2024-06-11D. In Love
    题解首先,我们来学会如何判断在一系列线段中是否存在不相交线段。我们选取所有线段中最大的左边界l_max和最小的右边界r_min,我们可以清楚的知晓当l_max>r_min的时候存在不相交线段(贪心的思想),否则不存在。code #include<bits/stdc++.h>usingnamespacestd;typedeflonglo
  • 2024-06-07编写一个程序,提示用户输入三个点 p0、p1 和 p2,显示 p2 是否在从 p0 到 p1 的线段左侧、右侧,或者在该直线上。
    (几何:点的位置)给定一个从点p0(x0,y0)到pl(xl,pl)的有向线段,可以使用下面的条件来确定点p2(x2,y2)是在线段的左侧、右侧,或者在该直线上(见下图): 编写一个程序,提示用户输入三个点p0、p1和p2,显示p2是否在从p0到p1的线段左侧、右侧,或者在该直线上。下面是运行示例:
  • 2024-06-06自由线段树
    #include<bitsstdc++.h>#definelllonglong#definemaxn1000005usingnamespacestd;structnod{ intl,r,v; nod(){} nod(inta,intb,intc){l=a;r=b;v=c;}};intn,q;intnum[505][505];lldp[505][505];vector<nod>now;lldfs(intl,intr
  • 2024-06-05校内模拟赛总结,又名挂分日记
    倒序排序20240601A容易发现是矩阵快速幂B把每一段编个号,找到号码出现的顺序,还要考虑段内的顺序C用类似线段树的东西维护,将pushup改成\(O(n)\)的即可,没做出来D不会20240502今天又犯傻逼错误A简单背包,背包的大小开小了,100->10B数位DP,答案与输入并不在同一数量级,但
  • 2024-06-04T461430 「Daily OI Round 4」Mine
    T461430「DailyOIRound4」MineT461430「DailyOIRound4」Mine解题思路首先,有个简单的想法就是我们考虑选择的那个采矿点是谁,但是我们发现,如果直接算,会重复,比如采矿点\(A\)和采矿点\(B\)所能采集的线段集合如果有交,显然会方案数会重复。这里学到一个计数的技巧:考
  • 2024-06-04线段树合并复杂度证明
    以CF600E为例,没看过题目的先去看题。本题的线段树做法,即对题目所给树中每个结点所在子树建树维护数字出现情况。此做法中,当前节点和其兄弟节点对应的线段树需要合并到父节点上,最后父节点上权值update到新树。也就是说对于每个非叶子节点,其有x个子节点,就要合并x次(其实也可以看成x-