【洛谷P4097】Segment 李超线段树】的更多相关文章

题目大意:维护一个二维平面,给定若干条线段,支持询问任意整数横坐标处对应的纵坐标最靠上的线段的 id,相同高度取 id 值较小的,强制在线. 题解:初步学习了李超线段树.李超线段树的核心思想在于通过标记永久化的方式来维护斜率. 代码如下 #include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; const double eps=1e-6; inline int read(){ int x=0,f=1;char ch…
题目链接 \(Click\) \(Here\) 李超线段树的模板.但是因为我实在太\(Naive\)了,想象不到实现方法. 看代码就能懂的东西,放在这里用于复习. #include <bits/stdc++.h> using namespace std; const int N = 100010; #define ls (p << 1) #define rs (p << 1 | 1) #define mid ((l + r) >> 1) struct Nod…
3165: [Heoi2013]Segment Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 368  Solved: 148[Submit][Status][Discuss] Description 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第i条被插入的线段的标号为i. 2.给定一个数k,询问与直线 x = k相交的线段中,交点最靠上的线段的编号. Input 第一行一个整数n,表示共n 个操作. 接下来n行,每行第一…
题目大意: 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第 i 条被插入的线段的标号为 i 2.给定一个数 k,询问与直线 x = k 相交的线段中,交点最靠上的线段的编号. 若有多条线段符合要求,输出编号最小的线段的编号 (省略输入以及在线操作的要求) 分析: 明显的线段树特征: 1.有固定的 区间长度,(<=39989) 2.插入元素支持合并,(一个线段可以拆成两段线段) 所以我们用线段树来做这道题. 线段树维护什么元素开始不太好想. 发现要求一个交点最靠上的线段的编号…
题意 题目链接 Sol 李超线段树板子题.具体原理就不讲了. 一开始自己yy着写差点写自闭都快把叉积搬出来了... 后来看了下litble的写法才发现原来可以写的这么清晰简洁Orz #include<bits/stdc++.h> #define pdd pair<double, double> #define MP make_pair #define fi first #define se second using namespace std; const int MAXN = 1…
所谓李超线段树就是解决此题一类的问题(线段覆盖查询点最大(小)),把原本计算几何的题目变成了简单的线段树,巧妙地结合了线段树的标记永久化与标记下传,在不考虑精度误差的影响下,打法应该是这样的. #include <cstdio> #include <cstring> #include <algorithm> #define mid(a,b) ((a+b)>>1) typedef long double ld; ; ; int cnt,sz; struct L…
$ \color{#0066ff}{ 题目描述 }$ 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第 i 条被插入的线段的标号为 i 给定一个数 k,询问与直线 x = k 相交的线段中,交点最靠上的线段的编号. 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i].有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[i]个洗车店,且会选择这些店中最便宜的一个进行一次消费.但是如果这个最便宜的价格大于c[i],那么这个人就不洗车了.请给每家店指定一个价格,使得…
Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插入操作.语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾.限制:n是非负整数并且在长整范围内.注意:初始时数列是空的,没有一个数. Input 第一行两个整数,M和D,其中M表示操作的个…
题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=3064 分析 其实我是在看吉司机线段树课件时看到这题很感兴趣就跑过来做 显然如果数据小一点可以用分块什么的比较好搞 但是这个数据范围可能用\(log N\)的数据结构更舒服一点 怎么搞呢?请阅读国家集训队2016论文集之<区间最值操作与历史最值问题--杭州学军中学 吉如一>,对,就是我们敬爱可亲的吉…
洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; long long sum,d; }; ; treetype a[maxn<<]; long long num[maxn]; void build(int k,int l,int r) { a[k].l=l;a[k].r=r;a[k].d=; if (a[k].l==a[k].r) { a[k].s…
BZOJ 洛谷 对于线段,依旧是存斜率即可. 表示精度误差一点都不需要管啊/托腮 就我一个人看成了mod(10^9+1)吗.. //4248kb 892ms #include <cstdio> #include <cctype> #include <algorithm> //#define gc() getchar() #define MAXIN 300000 #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MA…
题意 题目链接 Sol 线段树板子题都做不出来,真是越来越菜了.. 根据题目描述,一个合法区间等价于在区间内的颜色没有在区间外出现过. 所以我们可以对于每个右端点,统计最长的左端点在哪里,刚开始以为这个东西有单调性,但事实并不是这样.. 我们统计出对于每个颜色最优的位置\(r_i\)和最左的位置\(l_i\) 那么对于某个左端点\(j\),如果\(r_j > i\),那么\(j\)以及它左侧的点都是不能选的,这里可以用堆+multiset维护. 若\(r_j \leqslant i\),那么\(…
题意:给定线段树,上面若干个节点坏了,求能表示出多少区间. 区间能被表示出当且仅当拆出来的log个节点都是好的. 解:每个区间在最浅的节点处计算答案. 对于每个节点维护从左边过来能有多少区间,从右边过来能有多少区间即可. 说起来水的一批为什么会被评成黑题啊. #include <bits/stdc++.h> typedef long long LL; ; ; LL lc[N], rc[N], ans; int tot, ls[N], rs[N]; bool vis[N]; void add(L…
正解:动态开点线段树 解题报告: 传送门! 因为最近学主席树的时候顺便get到了动态开点线段树?刚好想起来很久很久以前就想做结果一直麻油做的这题,,,所以就做下好了QAQ 然后说下,这题有很多种方法,我目前是先只写个最傻逼的方法,等学了splay什么的再来upd一下QAQ(这题好像有,线段树.树状数组.splay等各种方法,我可能都会写只要我麻油咕QAQ 然后就直接进入正题QAQ 首先其实要知道动态开点线段树和线段树思想什么的都是一样儿的,只是实现方法有一点儿区别(就是动态开点线段树节省点儿空间…
可以说是数据结构学傻了的典型案例了 昨天跳到这题上 然后思考了一下 噫!好!线段树裸题 然后打完板子,发现\(  n \le 10^9 \) 显然线段树直接做不太行 然后这题又只有普及的难度 然后我就打了神奇的动态开点线段树水过 qwq 之后看题解发现正解是\( O(m^2) \)的暴力 因为常数小跑的更快啊qwq #include <cstdio> #include <algorithm> #include <cstring> #define int long lon…
题意 题目链接 Sol 别问我为什么发两遍 就是为了骗访问量 这个题的线段树做法,,妙的很 首先一个显然的结论:位置\(i\)能被看到当且仅当\(\frac{H_k}{k} < \frac{H_i}{i}, k < i\) 考虑直接维护区间\([l, r]\)的可以被看到的点. 因为只有单点修改,因此只需考虑如何合并两个区间即可 维护区间内\(\frac{H_i}{i}\)的最大值,设其为\(mx\) 首先左孩子的答案可以直接加上,考虑左孩子对右孩子的贡献,如果\(mx_{ls} > m…
传送门 线段树基本操作. 把那个方差的式子拆开可以发现只用维护一个区间平方和和区间和就可以完成所有操作. 同样区间修改也可以简单的操作. 代码: #include<bits/stdc++.h> #define N 300005 #define lc (p<<1) #define rc (p<<1|1) #define mid (T[p].l+T[p].r>>1) using namespace std; int n,m; double a[N]; struc…
正解:线段树 解题报告: 传送门! 话说开始看到这题的时候我想得hin简单 因为关于%3有个性质就是说一个数的各个位数之和%3=这个数%3嘛,小学基础知识? 我就想着,就直接建一棵树,只是这棵树要用个数据结构分别存下%3=0,1,2然后大力走一波就好辣 然后我仔细思考了一下,发现因为它是要连续一个区间所以我可能这个数据结构中要有9个数 前三个不变,第四个到第六个是连着左边的%3的余数,第七个到第九个是连着右边的%3的余数,依然是大力走一波 但是我jio得应该不会出这种并没有思维难度然而实现难度又…
题目传送门 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L. 现在色板上只有一个颜色,老师告诉阿宝在色板上只能做两件事: "C A B C" 指在A到 B 号方格中涂上颜色 C. "P A B" 指老师的提问:A到 B号方格中有几种颜色. 学校的颜料盒中一共有 T 种颜料.为简便起见,我们把他们标记为 1, 2, ...…
点此看题面 大致题意: 给你一棵线段树,两种操作.一种操作将每棵线段树复制成两个,然后在这两个线段树中的一个上面进行\(Modify(l,r)\).另一种操作询问所有线段树的\(tag\)总和. 大力分类讨论 我们考虑用线段树来进行维护. 定义一个\(f_{rt}\),表示在当前所有线段树中编号为\(rt\)的节点上的\(tag\)之和. 然后对于每次修改,就需要大力分类讨论,来计算新增加的\(2^{t-1}\)棵树对\(f_x\)的贡献. 当这个节点未被访问到 显然,就相当于此次操作对该节点没…
题目 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和. 红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别,排成的队伍高低错乱,极不美观.设第i个小朋友的身高为hi,我们定义一个序列的杂乱程度为:满足ihj的(i,j)数量. 幼儿园阿姨每次会选出两个小朋友,交换他们的位置,请你帮忙计算出每次交换后,序列的杂乱程度.为方便幼儿园阿姨统计,在未进行任何交换操作时,你也应该输出该序列的杂乱程度. 输入格式 第一行…
主席树可以存储线段树的历史状态,空间消耗很大,一般开45n即可 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> #include <queue> #define lson l, mid #define rson mid+1, r #define ll long long using name…
用动态开点线段树分别维护每一行和最后一列,线段树的作用是记录被选的点的个数以及查询第k个没被选的点,每次修改,从行里标记被选的点,从最后一列标记向左看齐之后少的点,然后用vector维护行列的新增点 #include<iostream> #include<cstdio> #include<vector> using namespace std; const int N=600005; int n,m,q,mx,tot,rt[N]; vector<long long…
题目:https://www.luogu.org/problemnew/show/P3834 无法忍受了,我要写主席树! 解决区间第 k 大查询问题,可以用主席树,像前缀和一样建立 n 棵前缀区间的权值线段树: 然后 n 棵线段树可以共用一些节点: 线段树的 sum 可以相减,利用这个查询即可: 什么嘛,主席树也没我想得那么难(蛮简单的)! 代码如下: #include<iostream> #include<cstdio> #include<cstring> #incl…
题目描述 Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. Frank不仅喜欢观测,还喜欢分析观测到的数据.他经常分析两个参数之间(比如亮度和半径)是否存在某种关系. 现在Frank要分析参数XX 与YY 之间的关系.他有nn 组观测数据,第ii 组观测数据记录了x_ixi​ 和y_iyi​ .他需要一下几种操作 1 L,RL,R : 用直线拟合第LL 组到底RR 组观测数据.用\overline{x}x 表示这些观测…
题目:https://www.luogu.org/problemnew/show/P2221 题意:有n个节点排成一条链,相邻节点之间有一条路. C u v val表示从u到v的路径上的每条边权值都加val. Q l r表示在l到r中等概率选择两个城市的路径长度的期望值. 思路:首先期望值的分子肯定是可以选择的方案数也就是$C^2_{r - l + 1}$ 分子应该是所有可能的路径和.我们可以通过计算每一条边算了多少次得到. 对于第$i$条边,他的左端点有$(i - l + 1)$种可能,右端点…
题目大意:给定一个长度为 N 的序列,每个点有两种状态 1/0,表示占有和空闲,现支持 first-fit 查询是否有一段连续的长度为 X 的空闲子序列和区间赋值操作. 题解:get到了线段树新技能..qwq 区间赋值操作和其他线段树一样,维护标记即可. 查询是否有一段连续的长度为 X 的空闲子序列只需要类似于维护区间连续最长字段即可,即:lmx,rmx,mx.first-fit 查询操作需要类似于在线段树上二分的操作,即:若左子树满足条件就走左子树,左右子树能拼接成满足需求的结果则返回,否则遍…
先上一波链接 https://www.luogu.com.cn/problem/P1168 这道题我们有两种写法 第一种呢是线段树,我们首先需要将原本的数据离散化,线段树维护的信息就是区间内有多少个数, 每次加入两个数(也就是单点修改),查询的时候就是查找中位数((x+1)/2 )所在的位置 每次走到一个点 判断左子树中数字的个数(y)是不是就大于等于当前所找的数k 如果是 则往左子树继续走 如果左子树的数字个数(y)小于当前所找的数k,那么就将k减去y,再往右子树走,这样一直走下去就可以找到中…
先上一波题目 https://www.luogu.org/problem/P2023 复习了一波线段树 题目涉及的操作有区间加 区间乘以及区间求和 tips:线段树在传标记的时候 优先传乘法标记再传加法标记 规定好顺序就不会错了 #include<cstdio> #include<cstring> #include<algorithm> #define LL long long using namespace std; ; LL read(){ LL ans=,f=,c…
正解:线段树+树链剖分 解题报告: 传送门$QwQ$ 其实是道蛮板子的题,,,但因为我写得很呆然后写了贼久之后发现想法有问题要重构,就很难受,就先写个题解算了$kk$ 考虑先跑个树剖,然后按$dfn$序建线段树,区间修改区间查询就行 然后唯一要注意细节的点就因为它是查询颜色段,所以当左侧的最靠右的颜色和右侧的最靠左的颜色相同的时候要答案减一.然后在树上跳的时候也是注意这个点. 然后因为我很呆,实现在树上跳的时候就用的两个结构体分别存了两侧的数量和边界颜色. 然后我发现到最后一步两个合并的时候我分…