CF-558E (线段树/分块)】的更多相关文章

题面传送门 首先注意到这次行数与列数不同阶,列数只有 \(200\),而行数高达 \(5000\),因此可以考虑以行为下标建线段树,线段树上每个区间 \([l,r]\) 开一个 \(200\times 200\) 的数组 \(d_{i,j}\) 表示从 \((l,i)\) 到 \((r,j)\) 的最短路,合并暴力用类似 floyd 的方式进行转移,这样暴力时间复杂度是 \(RC^3+mC^2\log R+q\),空间复杂度 \(RC^2\),其中 \(m\) 为修改次数,一脸无法通过,而且 T…
我原来准备做方差的.. 结果发现不会维护两个标记.. 就是操作变成一个 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…
题目描述 区间查询最大值,结尾插入,强制在线. 分析 线段树可以做,但是练了一下分块,发现自己打错了两个地方,一个是分块的地方把/打成了%,还有是分块的时候标号要-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​​号城…
题解: 考虑用线段树维护楼的最大值,然后这个问题就很简单了. 每次可以向左二分出比x高的第一个楼a,同理也可以向右二分出另一个楼b,如果a,b都存在,答案就是b-a-1. 注意到二分是可以直接在线段树上进行的,所以复杂度是O(nlogn). 当然这里是用分块做的,更暴力一些. #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace st…
解题思路: 很显然突破口就是字符集比较小,分块和线段树都能A 话说线段树时间是分块5倍啊 代码(线段树): #include<cstdio> #include<cstring> #include<algorithm> #define lll spc<<1 #define rrr spc<<1|1 struct int_26{ ]; void res(void) { memset(has,,sizeof(has)); return ; } int_…
题意 http://www.ioi2013.org/wp-content/uploads/tasks/day1/wombats/Wombats%20zh%20(CHN).pdf 思路 ​ 我们设矩形的行数为 \(n(5000)\) ,列数为 \(m(200)\) ,更新次数为 \(U(500)\) ,查询次数为 \(Q(2\times 10^5)\) . ​ 最暴力的思想是一次更新处理出从一个 \(m^2\) 的数组,代表第一行的每一个点走到最后一行每一个点的最小代价,然后 \({\cal O}…
Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问l,r. Output 一行一个数,表示每个询问的答案. Sample Input 5 5 2 1 0 2 1 3 3 2 3 2 4 1 2 3 5 Sample Output 1 2 3 0 3 HINT 数据规模和约定 对于100%的数据: 1<=n,m<=200000 0<=ai&l…
如此显然的线段树,我又瞎了眼了 事实上跟以前的奇袭很像....... 只要满足公式maxn-minn(权值)==r-l即可 所以可以考虑建两颗树,一棵节点维护位置,一棵权值, 每次从一棵树树上查询信息,如果满足公式就停止,不然两颗树不断扩展区间 当然也可以用ST啦(查询O(1)优于线段树) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #…
题意: n个操作,在200000*200000的平面上加删点 find 严格在坐标右上角,x最小,再y最小的点 线段树做,区间为离散化后的 X轴坐标 ,维护区间点数 和 最小的 y 值 ( 维护最小y值是重要优化 ) #include <stdio.h> #include <string.h> #include <queue> #include <set> #include <functional> #include <map> #d…
给出长度为n的字符串,m个操作. 每一个操作有三个值 l,r,op. op==1,表示将字符串中[ l ,r ]的部分依照升序排列. op==0,表示将字符串中[ l ,r ]的部分依照降序排列. 输出终于的字符串 按小写字母建26颗线段树 对于每次改动,先记录[l,r]区间内各个字母出现的次数,并对对应区间清空,然后依照升序或者降序从新更新 #include "stdio.h" #include "string.h" char str[100010]; int n…
思路: 线段树 (分类讨论) 此题数据很水 数据很水 数据很水 但是卡个暴力还是没问题的-- //By SiriusRen #include <cstdio> #include <cstring> using namespace std; #define maxn 1500000 #define inf 1061109567 int n,tot,jy,xx,yy,tree[maxn*6],vis[maxn],cases,q[maxn]; inline int min(int x,i…
题目描述 给你一棵 $n$ 个点的树,边有边权.$m$ 次询问,每次给出 $l$ .$r$ .$x$ ,求 $\text{Min}_{i=l}^r\text{dis}(i,x)$ . $n,m\le 10^5$ . 题解 动态点分治+线段树 分块做法太傻逼了我们把它丢到垃圾桶里.树上距离考虑动态点分治. 求出这棵树的点分树,对每一棵点分树子树开一棵动态开点编号线段树,维护编号在某区间内的点到当前点距离的最大值. 对于一次查询,我们在点分树从 $x$ 到根的路径上所有点对应的线段树上查询 $[l,…
GSS4 - Can you answer these queries IV || luogu4145上帝造题的七分钟2 / 花神游历各国 GSS4 - Can you answer these queries IV 题目链接:https://www.luogu.org/problemnew/show/SP2713 线段树经典题目,然而被我用分块A了. 对于区间开根号,\(1e18\)最多会被开\(6\)次就会成为\(1\),成为\(1\)后,再开根号也是\(1\),0开根号也是0,线段树(分块…
涉及区间操作的一些套路必须要会呀 区间加减为了偷懒能不写线段树so我选择树状数组!! 但是区间乘除,最大值我想了想还是用线段树分块吧. 树状数组: 这里用网上的一张图: 这里灰色数组是原本的数组(a[i])红色数组则是树状数组(c[i])这里直接给出结论: c[i]=a[i-2^k+range[1,2^k]] k是i的二进制位从低到高位连续0的个数 与a[i]有关的 c[i+2^(k+j)] 且 i+2^(j+k)<n 这样就很好实现单点更改,区间查询了. void lowbit(int x)…
题目的打开方式是酱紫的 然而作为一只蒻蒟根本不会线段树该怎么办呢? sro  MZX  orz 是这样说的:用分块啊! 分块 根据紫萱学姐的教程,分块的打开姿势是这样的: 我们要对一个数组进行整体操作,那么我们就可以把他们分成元素相等的n部分,由于n部分的最大值很容易找,也就是我们可以预处理出最大值(更何况此题最开始数组赋初值为0)我们要查询第k1-k2个数的最大值,就返回k1-k2所对应的块的最大值即可, 好,作为一只蒻蒟根本不知所云? 用一张图解来表示一下就是酱紫 红线代表整个数组,底下数轴…
数列(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)\)个,暴力修…
题目链接:http://codeforces.com/contest/1154/problem/E 题意:两个人轮流取最大值与旁边k个数,问最后这所有的数分别被谁给取走了 分析:看这道题一点思路都没有,想不到模拟链表也该能想到线段树的啊 大部分AC代码是模拟链表的,写起来也更快,但我线段树很不熟,线段树的代码也写一份吧 另外,以后要养成一种习惯,除了主函数定义int main里有int外,其他地方统一用ll了,不要自己给自己挖坑..... 线段树: 意识到是线段树后我建树部分就拿不准怎么做,事实…
进阶指南上的做法是分块的.. 但是线段树搞起来也挺快,将磁石按照距离排序,建立线段树,结点维护区间质量最小值的下标 进行拓扑,每次在可行的范围内在线段树中找到质量最小的下标取出,取出后再将线段树对应的点设置成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的节点(这意味着该节点的下标离散化前代…
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分的并且下不了测试点最后无可奈何跑过来写题解 再再继续,如果你不信邪以…
题解 非常容易想到的线段树, 还可以用并查集来. 还有一位大神用了$O(n)$ 就过了Orz 要判断是否能染色出输入给出的序列,必须满足两个条件: 1. 序列中必须存在一个$q$ 2. 两个相同的数$x$的中间不存在比 $ x$ 小的数 首先判断输入的数列中是否存在$q$, 若不存在$q$ 且没有 $a_i = 0$, 表示序列中一定没有$q$, 直接输出NO 若存在某个$a_i = 0$ , 将任意一个染成$q$即可 然后我们再查询两个相同的数$x$ 中是否存在比$x$ 小的数,用线段树来维护…
显然最优走法是先一直停在初始位置然后一次性走完一圈.将序列倍长后,相当于找一个长度为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; ;…