题目传送门 酒店 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a vacation on the sunny shores of Lake Superior. Bessie, ever the competent travel agent, has named the Bullmoose Hotel on famed Cumberland Str…
P2894 [USACO08FEB]酒店Hotel 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a vacation on the sunny shores of Lake Superior. Bessie, ever the competent travel agent, has named the Bullmoose Hotel on fam…
P2894 [USACO08FEB]酒店Hotel 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a vacation on the sunny shores of Lake Superior. Bessie, ever the competent travel agent, has named the Bullmoose Hotel on fam…
P2894 [USACO08FEB]酒店Hotel https://www.luogu.org/problem/show?pid=2894 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a vacation on the sunny shores of Lake Superior. Bessie, ever the competent travel…
问题描述 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N <= 50,000)间客房,它们在同一层楼中顺次一字排开,在任何一个房间里,只需要拉开窗帘,就能见到波光粼粼的湖面. 贝茜一行,以及其他慕名而来的旅游者,都是一批批地来到旅馆的服务台,希望能订到D_i (1 <= D_i <= N)间连续的房间.服务台的接待工作也很简单:如果存在r满足编号为r…
题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a vacation on the sunny shores of Lake Superior. Bessie, ever the competent travel agent, has named the Bullmoose Hotel on famed Cumberland Street as th…
https://www.luogu.org/problem/P2894 #include<cstdio> #include<iostream> using namespace std; struct ben { int lmax,rmax,len,sum,lz; }tr[400005]; void bt(int x,int l,int r)//建树 { tr[x].lz=0;//标记清空 tr[x].sum=tr[x].len=tr[x].lmax=tr[x].rmax=r-l+1…
题目大意 多次操作 查询并修改区间内长度==len的第一次出现位置 修改区间,变为空 思路 类似于求区间最大子段和(应该是这个吧,反正我没做过) 维护区间rt的 从l开始向右的最长长度 从r开始向左的最长长度 l到r内的最长长度 反正维护的是个01序列, 随便做 又是小错误,第一遍就能过非得debug一小时 这里懒惰标记有两个,开bool为了省 省不了多少的 内存gg了(可以过样例也是神奇,也许是windows吧) 还有样例好坑啊,我以为是\([5,10]\)(其实是我没认真看) 代码 #inc…
[USACO08FEB]酒店Hotel 线段树 题面 其实就是区间多维护一个lmax,rmax(表示从左开始有连续lmax个空房,一直有连续rmax个空房到最右边),合并时讨论一下即可. void push_up(int x, int l, int r){ int mid=(l+r)>>1; if(sum[lson]==mid-l+1) lmax[x]=sum[lson]+lmax[rson]; else lmax[x]=lmax[lson]; if(sum[rson]==r-(mid+1)+…
题目描述 用线段树维护三个值:区间最长空位长度,从左端点可以延伸的最长空位长度,从右端点可以延伸的最长空位长度. #include<complex> #include<cstdio> using namespace std; ; int n,m; int len[N],Max[N],maxl[N],maxr[N],lazy[N]; int qread() { ; char ch=getchar(); ')ch=getchar(); +ch-';ch=getchar();} retu…
题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a vacation on the sunny shores of Lake Superior. Bessie, ever the competent travel agent, has named the Bullmoose Hotel on famed Cumberland Street as th…
Code: #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N = 200000+5; int n,m,k; struct Segment_Tree{ int lazy,left,right,maxv; }Seg[N<<2]; inline void push_down(int o,int l,int r) { if(Seg[o].la…
题面:P2894 [USACO08FEB]酒店Hotel 题解:和基础的线段树操作差别不是很大,就是在传统的线段树基础上多维护一段区间最长的合法前驱(h_),最长合法后驱(t_),一段中最长的合法区间(mx).询问时由于查询的是最左边的合法端点,所以要从左到中间到右边依次考虑情况. 代码: #include<cstdio> #include<cstring> #include<iostream> #define max(a,b) ((a)>(b)?(a):(b))…
P2894 [USACO08FEB]酒店Hotel 简单的线段树维护区间信息. 维护三个值,一个是从左端点能拓展的长度,一个是从右端点能脱产的的长度.另一个是整个区间内的最大连续零一长度. 记录这三个值的目的在于可以使小区间合并大区间. 这样话就可以愉快的跑出答案了. #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> using std::max; using…
洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一行包含三个整数 n,m,pn,m,p,分别表示该数列数字的个数.操作的总个数和模数. 第二行包含 nn 个用空格分隔的整数,其中第 ii 个数字表示数列第 ii 项的初始值. 接下来 mm 行每行包含若干个整数,表示一个操作,具体如下: 操作 11: 格式:1 x y k 含义:将区间 [x,y][…
P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷评测机出问题了吗? 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接…
洛谷题目传送门 闲话 考场上一眼看出这是个毒瘤线段树准备杠题,发现实在太难调了,被各路神犇虐哭qwq 考后看到各种优雅的暴力AC......宝宝心里苦qwq 思路分析 题面里面是一堆乱七八糟的限制和性质,这时候需要冷静想想有没有可利用的地方.蒟蒻一开始往势能线段树上面想了想. 定义一个全局势能函数,为所有\(C_i<B_i\)的位置个数.注意两个操作的修改都不会小于原来的数. 一个是改\(A\),相当于对\(C\)进行区间设置,此时我们每暴力找到一个原来\(C_i<B_i\)但是现在\(C_i…
To 洛谷.2574 XOR的艺术 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[l,r],伤害为伤害串的这个范围内中1的个数 3. 会被随机修改伤害串中的数值,修改的方法是把[l,r]中的所有数xor上1 AKN想知道一些时刻的伤害,请你帮助他求出这个伤害 输入输出格式 输入格式: 第一行两个数n,m,表示长度为n的01串,有m个时刻 第二行一个长…
!!!一道巨恶心的数据结构题,做完当场爆炸:) 首先,如果你用位运算的时候不小心<<打成>>了,你就可以像我一样陷入疯狂的死循环改半个小时 然后,如果你改出来之后忘记把陷入死循环后为了防止不能停下来而进行的读入操作删了,你就可以像我一样改半个小时最后发现是这个傻逼错误 并且,如果你按照样例输出,你就可以像我一样成功地获得0分的好成绩因为它其实是要每个输出一行 最后,就算你都改完了,你还可以像我一样莫名其妙得了65分的并且下不了测试点最后无可奈何跑过来写题解 再再继续,如果你不信邪以…
题面 Bzoj 洛谷 题解 考虑一个什么样的区间满足重组之后可以变成\(3\)的倍数.不妨设\(tot\)为一个区间内\(1\)的个数.如果\(tot\)是个偶数,则这个区间一定是\(3\)的倍数,接着考虑奇数的情况. 如果只有\(1\)个\(1\),那么无论如何都不行,只需考虑\(3\)个\(1\)的情况,因为其他的\(1\)可以看做偶数个\(1\)的情况.不难发现,当只有\(3\)个\(1\)的时候,我们需要有至少\(2\)个\(0\),接着就可以用线段树来维护了. 我们考虑记录三个数组,\…
洛谷P1198:https://www.luogu.org/problemnew/show/P1198 思路 一道水水的线段树 20分钟A掉 这道题只涉及到单点修改和区间查询 所以这道题甚至不用Lazy-Tag 每次加入一个新的点就是修改一个节点 总区间长为操作次数m (假设所有操作都为添加一个节点) 因此题目就简单多了 代码 #include<iostream> using namespace std; #define ll long long #define Max 200000 #def…
好,长草博客被催更了[?] 我感觉这题完全可以当作线段树3 线段树2考加法和乘法标记的下放顺序,这道题更丧心病狂[?] 很多人可能跟我一样,刚看到这道题秒出思路:打一个当前最大值一个历史最大值不就完事了吗 实际上这样做会死得很惨.节点保留的信息可能来不及下传就被父节点更新掉,导致一部分信息被覆盖而丢失,这样就有可能查不到正确的历史最大值.比如历史最大值是由add更新的,但是set覆盖下来把add变成了0. 为了保留这些信息,我们需要记录历史修改标记的最大值.标记hset(history-set)…
题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a vacation on the sunny shores of Lake Superior. Bessie, ever the competent travel agent, has named the Bullmoose Hotel on famed Cumberland Street as th…
 P3373 [模板]线段树 2 47通过 186提交 题目提供者HansBug 标签 难度提高+/省选- 提交  讨论  题解 最新讨论 为啥WA(TAT) 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含三个整数N.M.P,分别表示该数列数字的个数.操作的总个数和模数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接下来M行每行包含3或4…
题意 题目链接 Sol TJOI怎么全是板子题 对时间开个线段树,然后就随便做了.... #include<bits/stdc++.h> using namespace std; const int MAXN = 1e6 + 10; int mod; template<typename A, typename B> inline A mul(A x, B y) { return 1ll * x * y % mod; } inline int read() { char c = ge…
题目分析: 首先这题的询问和位(bit)有关,不难想到是用线段树维护位运算. 现在我们压32位再来看这道题. 对于一个加法操作,它的添加位置可以得到,剩下的就是做不超过32的位移.这样根据压位的理论.它最多只会对线段树的两个叶子产生影响,我们分开来考虑两个叶子. 对于一个加法的进位,它实际就是把它之后连续的全为1的位赋值成0,然后更改第一个不是全为1的位,不难想到用lazytag实现. 减法操作与加法操作相反.所以我们要两个标记和两个lazy标记. 对于一个询问,在线段树上查找即可. 代码: #…
题意 题目链接 Sol 题解好神仙啊qwq. 一般看到这种考虑最大值的贡献的题目不难想到单调数据结构 对于本题而言,我们可以预处理出每个位置左边第一个比他大的位置\(l_i\)以及右边第一个比他大的位置\(r_i\) 那么\((l_i, r_i)\)会产生\(p1\)的贡献 \([l_i + 1, i - 1]\)和\(r_i\)会产生\(p2\)的贡献 \([i + 1, r_i - 1]\)和\(l_i\)会产生\(p2\)的贡献 这样我们直接上区间加线段树就能统计到每个点的贡献了. 然后统…
题意 题目链接 Sol 首先猜一个结论:对于每次询问,枚举一个起点然后不断等到某个点出现时才走到下一个点一定是最优的. 证明不会,考场上拍了3w组没错应该就是对的吧... 首先把数组倍长一下方便枚举起点,然后就是一个单调队列的模型了.整理一下我们需要求的东西就是这个 \[n - 1 + \min_{i=1}^n i + (\max_{j=i}^{2n} t[j] - j)\] (\(t[j]\)表示第\(j\)个位置出现的时间,其实\(\max\)的上界应该是\(i + n - 1\)的,但是显…
题意 题目链接 Sol 线段树合并板子题,目前我看到两种写法,分别是这样的. 前一种每次需要新建一个节点,空间是\(O(4nlogn)\) 后者不需要新建,空间是\(O(nlogn)\)(面向数据算空间你懂得),但是需要离线,因为共用节点的缘故,之后的修改可能会修改到不需要修改的节点(好绕啊): 这题就是把向上向下的贡献分开算,然后移一下项发现只与深度有关 可以直接二维数点,也可以线段树合并 #include<bits/stdc++.h> using namespace std; const…
题目大意:维护一个二维平面,给定若干条线段,支持询问任意整数横坐标处对应的纵坐标最靠上的线段的 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…