分块试水--CODEVS4927 线段树练习5】的更多相关文章

模板 #include<stdio.h> #include<algorithm> #include<string.h> #include<stdlib.h> #include<math.h> //#include<bitset> //#include<iostream> using namespace std; int n,m,q; #define maxn 100011 #define maxm 361 #define…
感觉这才算入门题吧..前面那些线段树练习,改几个字符就过了一定要搞成几道题.. n<=2e5的数列,给常数K<=2e5,m<=2e5个操作,区间加,问一个区间里K的倍数. 这题空间???当成512MB吧..n*sqrt(n)开得下 每个块记cnt(x,i)表示第x个块有多少数%K=i,以及整块+标记add(x),然后回答询问时默认一个块里的数都加上了add(x)即可,修改常规. #include<stdio.h> #include<algorithm> #incl…
题目描述 Description 有n个数和5种操作 add a b c:把区间[a,b]内的所有数都增加c set a b c:把区间[a,b]内的所有数都设为c sum a b:查询区间[a,b]的区间和 max a b:查询区间[a,b]的最大值 min a b:查询区间[a,b]的最小值 输入描述 Input Description 第一行两个整数n,m,第二行n个整数表示这n个数的初始值 接下来m行操作,同题目描述 输出描述 Output Description 对于所有的sum.ma…
>>点击进入原题测试<< Input示例 Output示例 思路:刚开始以为结点存最大值就行了,然后大于左子树的最大值就能进入右子树:然后发现样例都过不了:后面发现,并不是这个样子,假如这个数小于等于右孩子最左边那个数的话,也不能进入有孩子,所以结点还得保存右孩子最左边的那个值:同时更新一个最大值,当输入值咸鱼等于a[0]或者大于最大值时跳过. #include<climits> #include<iostream> #include<algorith…
http://wikioi.com/problem/1191/ 太水的线段树了,敲了10分钟就敲完了,但是听说还有一种并查集的做法?不明觉厉. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> using namespace std; #define rep(i…
原题: ZOJ 3686 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3686 这题本来是一个比较水的线段树,结果一个mark坑了我好几个小时..哎.太弱. 先DFS这棵树,树形结构转换为线性结构,每个节点有一个第一次遍历的时间和最后一次遍历的时间,之间的时间戳都为子树的时间戳,用线段树更新这段区间即可实现更新子树的效果,用到懒操作节省时间. 坑我的地方: update时,不能写成:tree[rt].mark = 1,…
Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每一头被连续的编号为1..N, 站在一个彩色的灯下面.刚到傍晚的时候, 所有的灯都是关闭的. 奶牛们通过N个按钮来控制灯的开关; 按第i个按钮可以改变第i个灯的状态.奶牛们执行M (1 <= M <= 100,000)条指令, 每个指令都是两个整数中的一个(0 <= 指令号 <= 1).…
题目大意 给你一个环形数列,完成环形数列上区间加法和区间求最小值. 分析 算是一道比较水的线段树模板题. 如果l>r的话,那么修改l,n和1,r区间. 不然的话那么就修改l,r区间. 其他的基础操作可以看我的随笔:[传送门] 还要注意开long long. ac代码 #include <bits/stdc++.h> #define inf 0x3f3f3f3f #define N 200005 #define ll long long #define linf 9223372036854…
题目 P2801 教主的魔法 解析 成天做水题 线段树,第一问区间加很简单 第二问可以维护一个区间最大值和一个区间最小值,若C小于等于区间最小值,就加上区间长度,若C大于区间最大值,就加0 ps:求教指针线段树,我的空间怎么那么大 代码 #include <bits/stdc++.h> using namespace std; const int N = 2e6 + 10; int n, m, num; int a[N]; class tree { public : int mx, mn, s…
给定一颗树,每个节点都有忠诚和能力两个参数,随意指定一个节点,要求在它的子树中找一个节点代替它,这个节点要满足能力值大于它,而且是忠诚度最高的那个. 首先,dfs一下,处理出L[i], R[i]表示dfs序,则R[i] - L[i] + 1 就是当前i这个节点拥有的子孙个数. 对于一颗树,dfs的时候,访问节点有先后顺序,那么可以用一个struct node List[maxn];表示这课树中访问的先后顺序. 例如这颗树,我假设是先访问0 --> 3 --> 2 ---> 4 ---&g…
思路:分块 提交:2次(第一次的求解有问题) 题解: 设块长为$T$,我们开$N/T$个单调栈,维护每一块的上升斜率. 修改时暴力重构整个块,$O(T)$ 求解时记录一个最大斜率$lst$,然后块内二分,求出能看见几个,同时更新$lst$ 时间复杂度$O(N*(T+\frac{N}{T}*log_2T)$,也不知道怎么算最小值,瞎猜$T=\sqrt{N*log_2N}$(其实当时算了一下,现在发现算错了,就当是猜的吧$qwq$),后来试了试,定块长$1000$也可以. #include<cstd…
L3-002. 堆栈 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家都知道"堆栈"是一种"先进后出"的线性结构,基本操作有"入栈"(将新元素插入栈顶)和"出栈"(将栈顶元素的值返回并从堆栈中将其删除).现请你实现一种特殊的堆栈,它多了一种操作叫"查中值",即返回堆栈中所有元素的中值.对于N个元素,若N是偶数,则中值定义为第N/2个…
题目的打开方式是酱紫的 然而作为一只蒻蒟根本不会线段树该怎么办呢? sro  MZX  orz 是这样说的:用分块啊! 分块 根据紫萱学姐的教程,分块的打开姿势是这样的: 我们要对一个数组进行整体操作,那么我们就可以把他们分成元素相等的n部分,由于n部分的最大值很容易找,也就是我们可以预处理出最大值(更何况此题最开始数组赋初值为0)我们要查询第k1-k2个数的最大值,就返回k1-k2所对应的块的最大值即可, 好,作为一只蒻蒟根本不知所云? 用一张图解来表示一下就是酱紫 红线代表整个数组,底下数轴…
我原来准备做方差的.. 结果发现不会维护两个标记.. 就是操作变成一个 a*x+b ,每次维护a , b 即可 加的时候a=1 ,b=v 乘的时候a=v ,b=0 #include <cstdio> ; long long a[Maxn],n,P,l,r,c,m,type; struct Node { long long mul,add,sum,len; }tree[Maxn<<]; inline void Change(long long o,long long mul,long…
数列(seq) Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1157 Description 给出一个长度为n的数列A.现有如下两种操作: 修改操作:把数列中第i个数改为x 询问操作:给定一个位置i,问数列中有多少个位置j ( j>i ),满足位置i与位置j间所有的数都不超过Ai与Aj的较大值. 现共有m个操作,请对每个询问操作做出回答. Input 第一行两个正整数n.m.…
题目大意 请你维护一个有n个元素的整数序列,要求支持区间查询&区间修改 对于100%的数据,\(1<=n<=10^5\) 分析 正常做法是线段树维护区间修改.区间查询,今天我要讲的是一种暴力做法:分块 分块的思想并不复杂,分块把一个长度为n的区间分成num段,操作时如果是整段用标记修改,不是整段的部分暴力修改 分析时间复杂度:在这题中,每段的标记修改是\(O(1)\)的,最多有num段,整段标记修改所用时间是\(O(num)\)的:不是整段的部分最多有\(O(n/num)\)个,暴力修…
题目描述 区间查询最大值,结尾插入,强制在线. 分析 线段树可以做,但是练了一下分块,发现自己打错了两个地方,一个是分块的地方把/打成了%,还有是分块的时候标号要-1. 其他也没什么要多讲的. 代码 #include <bits/stdc++.h> #define inf 0x3f3f3f3f #pragma GCC optimize(2) #define ll long long #define linf 9223372036854775807 #define inf 0x3f3f3f3f…
题目链接:https://pintia.cn/problem-sets/1108203702759940096/problems/1108204121661857798 题目大意: 森森开了一家快递公司,叫森森快递.因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(编号.由于道路限制,第i号城市(,)与第(号城市中间往返的运输货物重量在同一时刻不能超过C​i​​公斤. 公司开张后很快接到了Q张订单,其中j张订单描述了某些指定的货物要从S​j​​号城…
进阶指南上的做法是分块的.. 但是线段树搞起来也挺快,将磁石按照距离排序,建立线段树,结点维护区间质量最小值的下标 进行拓扑,每次在可行的范围内在线段树中找到质量最小的下标取出,取出后再将线段树对应的点设置成0 查询时找区间不为0最小值的下标即可 #include<cstdio> #include<algorithm> #define N 250010 typedef long long ll; ],tmp,h=,t,q[N];ll nowr; struct P{int m,p;l…
题目链接 /* 如果用线段树,每个节点要再开k的空间,显然不行.但是分块可以(虽然空间依旧爆炸) 分块.用bloans[i][j]表示 第i块 模k为j 的有多少个 对于不是整块的,查询时应判断 A[i]+tag[belong[i]] ==k || ==0 对于整块,维护两个tag,一个是整块的加标记,另一个是整块的mod数标记tag2,初始时tag2为0 当整块+v时,tag2 -=v.因为查询的应是 模k=0 的数的个数,整块+v后,这块要查的就是 模k=k-v ((k-v+v)%k=0)的…
题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空白叫做A[i-1].data+1, 开头和最尾也要这么插,意义是如果取不了A[i-1]了,最早能取的是啥数.要把这些空白也离散化然后扔主席树里啊. 主席树维护每个数A[i]出现的最晚位置(tree[i].data),查询时查询root[R]的树中最早的data<L的节点(这意味着该节点的下标离散化前代…
这道题模拟一下可以过,但是我们发现线段树也可以安全水过...... 写的线段树只需要滋磁单点修改,区间求max即可 我一开始犯了一个很SB的错误:每次插入修改了t,然后疯狂爆0到怀疑人生... 而且我写的线段树还不明不白的碾了胡雨菲几年前写的. #include <cstdio> #include <algorithm> #include <iostream> using namespace std; ; typedef long long LL; LL mo; LL…
Sean owns a company and he is the BOSS.The other Staff has one Superior.every staff has a loyalty and ability.Some times Sean will fire one staff.Then one of the fired man’s Subordinates will replace him whose ability is higher than him and has the h…
!!!一道巨恶心的数据结构题,做完当场爆炸:) 首先,如果你用位运算的时候不小心<<打成>>了,你就可以像我一样陷入疯狂的死循环改半个小时 然后,如果你改出来之后忘记把陷入死循环后为了防止不能停下来而进行的读入操作删了,你就可以像我一样改半个小时最后发现是这个傻逼错误 并且,如果你按照样例输出,你就可以像我一样成功地获得0分的好成绩因为它其实是要每个输出一行 最后,就算你都改完了,你还可以像我一样莫名其妙得了65分的并且下不了测试点最后无可奈何跑过来写题解 再再继续,如果你不信邪以…
显然最优走法是先一直停在初始位置然后一次性走完一圈.将序列倍长后,相当于找一个长度为n的区间[l,l+n),使其中ti+l+n-1-i的最大值最小.容易发现ti-i>ti+n-(i+n),所以也就相当于是后缀最大值最小.设ti-i=ai,即要求min{l+max{al..2n}}+n-1 (l=1..n).如果没有修改的话只要扫一遍就行了. 线段树看起来很难维护,考虑分块.每一块求出仅考虑该块的ai时上述值的前缀min和ai的后缀max.对于查询,从后往前考虑所选区间左端点在哪一块.如果该块某个…
E. DZY Loves Colors time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output DZY loves colors, and he enjoys painting. On a colorful day, DZY gets a colorful ribbon, which consists of n units (they…
卿学姐种花 题目连接: http://acm.uestc.edu.cn/#/problem/show/1292 Description 众所周知,在喵哈哈村,有一个温柔善良的卿学姐. 卿学姐喜欢和她一样美丽的花.所以卿学姐家的后院有很多的花坛. 卿学姐有\(n\)个花坛,一开始第\(i\)个花坛里有\(A[i]\)朵花.每过一段时间,卿学姐都会在花坛里种上新的花. 作为一个聪明的学姐,卿学姐的种花方式也是与众不同 , 每一次,卿学姐会在第\(x\)个花坛种上\(y\)朵花,然后在第\(x+1\)…
题意 给出一个有根树(根是1),有n个结点.初始的时候每个结点的值都是0.下面有q个操作,操作有两种,操作1.将深度为L的点的值全部增加X.操作2.查询以x为根的子树的结点值得和. 其中N,Q<=1e5 分析 一看这种没有办法直接用数据结构解决得问题就要考虑分块.这个题其实也不算是分块,应该是用了分块的思想进行分类而已.场上也一直在想分块但是可能是自己太菜了,赛后看了题解补的. 分块最重要的就是算时间复杂度啊.我们按照每一层的结点数进行分类.节点数>block的为第一类,节点数<=为第二…
求大爷教线段树怎么写啊QAQ 只会写分块...一开始脑抽写成了O(NKlogN)还被CZL大爷嘲讽了一发T T f[i][j]表示在第i块中,模k为j的数有几个,然后每次修改的时候只需要打个标记,查询的时候直接加上标记查就行了 #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> using namespace std; ;…
题目链接 本质是维护斜率递增序列. 用分块的方法就是把序列分成sqrt(n)块,每个块分别用一个vector维护递增序列.查询的时候遍历所有的块,同时维护当前最大斜率,二分找到每个块中比当前最大斜率大的那个点.修改的时候只需要修改点所在的那个块即可.复杂度$O(m\sqrt nlogn)$ #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef double db; ; int n,m,h[N],in…