线段树
xzxxzx401
这个作者很懒,什么都没留下…
展开
-
POJ 3321 Apple Tree
2016暑期集训4-GPOJ 3321 Apple Tree线段树 dfs序 传送门:HustOJ 传送门:POJ题意一棵树,每一个节点(子叶节点与非子叶节点)有一个苹果。两种操作:C操作,针对某个节点,如果这个节点有苹果,就把这个苹果吃了,没有苹果就长出来一个苹果。Q操作,针对区间,查询区间苹果数。思路线段树维护苹果 ,注意建图时用前向星,因为这题卡vector。代码#includ原创 2016-08-06 16:35:24 · 184 阅读 · 0 评论 -
CodeForces 703D Mishka and Interesting sum
CodeForces 703D Mishka and Interesting sum线段树,区间异或性质题意给一个长度为n的序列,m次询问。询问一段区间中,出现了偶数次的数的异或和。思路首先异或的性质:a xor a=0a\ xor\ a=0。即区间中出现偶数次的数对异或值没有贡献。然后a xor b xor a=ba\ xor\ b\ xor\ a=b。所以求偶数次数的异或值转化为求区间出现过数的原创 2017-08-13 15:32:06 · 198 阅读 · 0 评论 -
bzoj 1858: [Scoi2010]序列操作
bzoj 1858: [Scoi2010]序列操作线段树题意给一个01串,设计数据结构,支持5种操作:区间置零区间置一区间翻转,0变1,1变0查询区间1的个数查询区间内最长的连续1的个数思路线段树维护连续子区间。就是复杂一点而已。因为有翻转操作,所以要同时维护0和1的信息。 维护区间0、1的个数,区间最长连续0、1,最长前缀0、1,最长后缀0、1。 最好重载+号,pushup就相当于原创 2017-08-13 22:06:19 · 170 阅读 · 0 评论 -
POJ 3667 Hotel
POJ 3667 Hotel线段树题意设计数据结构,维护一段序列,初始全1,支持2种操作:将一段区间置1从头查找第一段长度不小于k的序列,并将这k个位置置0思路线段树维护序列。维护前缀1(pre),后缀1(suf),区间最大连续1(sum)。更新时取左右中长度大的更新。 找不小于k时有坑,必须按照下面步骤一步步来:如果跟节点的区间最大连续1小于k,那么无解如果左子区间sum大于等于k,递原创 2017-08-14 02:00:29 · 167 阅读 · 0 评论 -
HDU 5869 Different GCD Subarray Query
HDU 5869 Different GCD Subarray Query线段树,离线题目长度n的序列, m个询问区间[L, R], 问区间内的所有子段的不同GCD值有多少种。思路区间gcd收敛非常快,首先暴力处理所有区间gcd及位置,复杂度nlogA。 %%%for(int i=1;i<=n;i++){ int cur=num[i], pos=i; for(int j=0;j<原创 2017-08-14 20:46:09 · 262 阅读 · 0 评论 -
HDU 4614 Vases and Flowers
HDU 4614 Vases and Flowers线段树题意两个数n,m, n表示花瓶数量0~n-1,开始全为空。接下来有m组,每组有数k,a,b;当k=1时, 从a位置开始插花,b为花数量,当花瓶有花时,跳过当前,直到找到空花瓶再插入,输出插入第一支花的位置和最后一支花的位置,花可以没插完,当一支都没有插入则输出Can not put any one.;当k=2时,清空【a,b】的花瓶,并输出在原创 2017-08-21 23:48:57 · 201 阅读 · 0 评论 -
bzoj 2243: [SDOI2011]染色
bzoj 2243: [SDOI2011]染色树链剖分,线段树题意给定一棵有n个节点的无根树和m个操作,操作有2类:将节点a到节点b路径上所有点都染成颜色c;询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”、“222”和“1”。请你写一个程序依次完成这m个操作。思路这种东西。。感觉很套路啊,学会了之后根本不难写,顶多是代码太多写丑了需要原创 2017-08-16 00:17:48 · 245 阅读 · 0 评论 -
HDU 6162 Ch’s gift
HDU 6162 Ch’s gift线段树,离线题意给一棵树,每次询问:uv两点间的路上(包括uv),点权在ab之间的所有点点权和。思路 由于没有修改操作,一个显然的想法是离线处理所有问题 将询问拆成1-x,1-y,1-LCA(x,y),则处理的问题转化为从根到节点的链上的问题。 解决这个问题,我们可以在dfs时向treap插入当前的数,在退出时删除这个数,并且每次维护在该点上的答案原创 2017-08-23 16:30:22 · 243 阅读 · 0 评论 -
Codeforces 375D Tree and Queries
Codeforces 375D Tree and Queries数据结构,dsu on tree题意给一棵树,每个节点有颜色,给一些查询(k,v),问k及其子树中,出现大于等于v次的颜色有多少种。思路dsu on tree。复杂度O(nlog2n)O(nlog^2n),dsu的nlogn加上树状数组的logn。dsu的过程中用树状数组维护出现t次的颜色的种数。dfs完一个节点处理他的所有询问。代码#原创 2017-09-06 12:55:30 · 362 阅读 · 0 评论 -
Codeforces 570D Tree Requests
Codeforces 570D Tree Requestsdsu on tree题意给一棵树,每个节点有一个字母。一些查询Q(x,d),查询x及其子树中,与根节点距离为d的所有字母是否可以构成回文串。思路两种思路,dfs序+树状数组或dsu on tree。dfs序+树状数组 我们可以跑一遍dfs序,这样子树在dfs序中连续。dfs时同时处理出距根所有距离的节点。然后离线询问,按深度排序,开26个原创 2017-09-06 23:48:53 · 328 阅读 · 0 评论 -
HDU 1828 Picture
HDU 1828 Picture扫描线,矩形周长并题意求矩形周长并思路没有想象的难。根面积一样的离散化,线段树保存:struct Stree{ int cov;//被完全覆盖的次数 int len;//被覆盖的长度 int num;//区间内线段的数量 int lp, rp;//被覆盖的左端点和右端点}stree[MAXN<<3];保存区间内线段的数量,更新时通过原创 2017-08-29 15:11:33 · 213 阅读 · 0 评论 -
HDU 3255 Farming
HDU 3255 Farming线段树,扫描线题意二维坐标的田地,在上面按矩形区域种植。有可能一个格子种了多种作物,那么按价值最大的算。求总价值。 实际就是求立方体体积并。把作物价值想成高度。思路按价值离散化,一层层求。每次将价值大于当前考虑价值的边加入边表,在编表里面跑矩形面积并,乘个高度即可。代码#include<cstdio>#include<cstring>#include<algor原创 2017-08-29 19:14:36 · 220 阅读 · 0 评论 -
HDU 5289 Assignment
HDU 5289 Assignment单调队列、线段树题目给一个数列,求满足下列条件的子区间的个数: 对于子区间[L, R]内的任意两个元素的差值小于k。思路暴力O(nlognlogn)O(nlognlogn)(967ms): 两个set维护,双指针ij。i指向区间首端元素,j指向区间尾端元素。set统计最值。如果最大值减最小值大于k了,那么在set中吧j指向的元素移除,j++。单调栈O(n)O原创 2017-10-09 00:27:04 · 197 阅读 · 0 评论 -
bzoj 2434: [Noi2011]阿狸的打字机
bzoj 2434: [Noi2011]阿狸的打字机线段树,AC自动机应用题意初始字串为空,首先给定一系列操作序列,有三种操作:在结尾加一个字符在结尾删除一个字符打印当前字串然后多次询问第x个打印的字串在第y个打印的字串中出现了几次。思路%%%1 %%%2操作字符串的过程实际是构建Trie的过程。新建字母相当于新加节点,打印字串相当于给标记,删除字母相当于回到爸爸节点。因为Trie保存的是原创 2017-08-13 04:23:29 · 194 阅读 · 0 评论 -
BZOJ 2333 [SCOI2011]棘手的操作
BZOJ 2333 [SCOI2011]棘手的操作线段树,离线,图论题意给你N个点,每点开始时是独立的,有点权。 设计数据结构支持:加边,将点x,点y连通修改单点权值、修改整体权值、修改某一点所在连通块的权值查询单点权值、查询整体最大权值、查询某一点所在连通块的最大权值思路%%%因为两个连通块合并后就不会被拆开,所以考虑离线。处理出最后的树,进行dfs序,对每个点重新标号。这样就把连通块变原创 2017-08-12 16:57:07 · 253 阅读 · 0 评论 -
HDU 5930 GCD
HDU 5930 GCD线段树上二分题意设计数据结构支持:单点修改查询整个区间以及每个子区间有多少种不同的区间gcd思路线段树上的二分。%%%大体思路是这样:初始区间给定后,可以计算出每个gcd有多少个区间,用g数组记录一下。(因为最大的数字不超过1000000) 线段树维护区间gcd。每次修改,假设修改pos处的值,先计算所有受pos影响的区间的gcd与个数,在g数组上减去这些;在线段树单原创 2017-08-12 02:11:35 · 535 阅读 · 0 评论 -
HDU 1542 Atlantis
2016暑期集训4-IHDU 1542 Atlantis扫描线 矩形面积并 传送门:HDU 传送门:HustOJ题意给几个矩形(左下点和右上点),求面积并。思路线段树,矩形面积并。基本思路百度吧。说说细节。用一个结构体存横边。struct EDGE { //横边的结构体 double l,r,h;//左端点,右端点,纵坐标 int k;//下侧边是1,原创 2016-08-06 16:54:06 · 207 阅读 · 0 评论 -
2016多校10 HDU 5861 Road
2016多校联合训练#10HDU 5861 Road线段树 传送门:HDU题意线性的路上有1到n n个城市,相邻城市间有双向的路,每条路初始时是封闭的。每条路开启时每天有一个维护费用,而且每条路只能被开启以及封闭一次。现在m天里,每天需要从a地运货到b地,你需要保证每天ab之间所有路是开启的。求每天的最小花费。思路因为每条路只能开启一次以及封闭一次,所以需要找到每条路最早使用时间以及最晚使用原创 2016-08-21 22:53:09 · 248 阅读 · 0 评论 -
2016多校8 HDU 5828 Rikka with Sequence 线段树优化
2016多校联合训练#8HDU 5828 Rikka with Sequence线段树优化 传送门:HDU题意很明确是线段树,需要三种操作:区间更新(加值),区间开根号,区间求和。区间开根号就是区间内部每一个值开根号。思路先膜吧:我和这个大佬的代码风格很像,所以看的很舒服,大佬思路也很详细清晰,适合我这种咸鱼看。膜膜膜。区间更新和求和直接套线段树板子,问题就在于区间开跟。开跟没有什么特别好的性原创 2016-08-13 03:08:09 · 716 阅读 · 0 评论 -
[未完]2016多校10 HDU 5862 Counting Intersections
2016多校联合训练#10HDU 5862 Counting Intersections线段树,扫描线题意给一些平行与坐标轴的线段,求交点个数。线段之间没有公共端点,没有重叠,没有长度0的。思路扫描线。。线段树维护。。我是不会树状数组。。。保存竖线,保存横线的端点,记录左右。遇到左端点右端点更新线段树,遇到竖线查询。但是我为什么tmd过不去。。。。代码WA的代码!!!以后再改吧#include <i原创 2016-08-25 21:21:20 · 207 阅读 · 0 评论 -
Gym 101138J Valentina and the Gift Tree 以及树链剖分入门讲解
Gym 101138J Valentina and the Gift Tree(树链剖分)树链剖分,线段树第一次学树链剖分。。就搞了这么难一题。。各种代码看了好几天才明白。。 传送门:CodeForce 传送门:HustOJ 要是想要测试数据和别人的代码,可以去这个OJ(不要干坏事哦~) 传送门:Hackerearth题意建议读原题。 一棵树,100000节点,树原创 2017-02-08 21:15:46 · 339 阅读 · 0 评论 -
POJ 2828 Buy Tickets&POJ 2299 Ultra-QuickSort
POJ 2828 Buy Tickets线段树基本应用 传送门:HustOJ POJ2299题意2828 排队买票时候插队。 给出一些数对,分别代表某个人的想要插入的位置Pos_i和他的Val_i,求出最后的队列的val顺序 2299 求逆序对数量思路两个题都不难,都是线段树基本应用。 逆序对从前往后处理,遇到一个数,就查询比他大还在他前面出现的数的个数。所以线段树维护出现原创 2017-07-06 21:08:12 · 231 阅读 · 0 评论 -
POJ 2886 Who Gets the Most Candies?
POJ 2886 Who Gets the Most Candies?线段树基本应用 传送门:HustOJ题意约瑟夫问题。一群人标号1~N。给你k,第一次k号出来。每个人还都有一个数字,表示他出去以后下一个出去人的是谁。数字正表示向号大的方向数,负表示向号小的方向数。 第x个出去的人(x从1开始数)获得的糖果数是x的约数个数。问谁获得的糖果数最多。思路线段树维护约瑟夫环,像上一题一样。每个叶原创 2017-07-16 16:14:41 · 239 阅读 · 0 评论 -
HDU4973 A simple simulation problem
HDU4973 A simple simulation problem线段树分治 传送门:HustOJ题意设计数据结构,支持操作: 初始时给定n,表示序列123…n D l r:将序列下标lr之间的数复制一份,比如12345 D 2 4,变为12233445,在D 1 4变为112222333445。 Q l r:查询下标lr之间的数中,出现次数最多的数的出现次数。思路是个线段树分治的题原创 2017-07-21 17:17:30 · 366 阅读 · 0 评论 -
线段树基础合集
线段树基础合集codevs上的一些题,是线段树入门(裸)题,比较全面。 包括: 1080:单点修改,区间求和 1081:区间add,询问单点值 1082:区间add,区间求和 4919:复杂一点的区间修改,区间求和 4927:区间add,区间set,区间求和另外还有我不会的5037,大佬说是分块做?CodeVS-1080裸地基本线段树,当个板子吧。#include <原创 2017-07-15 15:47:17 · 289 阅读 · 0 评论 -
HDU 4913 Least common multiple
HDU 4913 Least common multiple复杂线段树 传送门:HustOJ题意给你一些数,每个数都是xi=2ai∗3bix_i=2^{a_i} * 3^{b_i}的形式。问你每个这些数的每个子集的最小公倍数之和。思路先膜%%% 线段树。 等价于求所有子集里面最大的a和b。 如果只有a,那么做法是按a排序,然后递推计算。因为算到a[i]时,它肯定是目前最大的。最大为a[i]原创 2017-07-24 02:28:37 · 254 阅读 · 0 评论 -
BZOJ 1568 [JSOI2008]Blue Mary开公司
BZOJ 1568 [JSOI2008]Blue Mary开公司线段树题意插入n条直线y=kx+by=kx+b,然后查询某x位置所有直线中的最大值。思路线段树,每个区间维护:在这个区间内,值最大的线段的k与b。有个性质:因为所有斜率非负,所以斜率是不减的。就是越往后的区间,斜率不会小。 每次加入一条直线,先判断直线的斜率和本区间记录的直线的斜率,再判断区间中点哪条直线的答案大,如果是斜率大的直线原创 2017-08-09 21:09:15 · 258 阅读 · 0 评论 -
HDU 6070 Dirt Ratio
2017多校4-4 Dirt Ratio线段树,二分法题意给你一个数列,求一个子区间,使得:区间内不同数字种类/区间内所有数字个数最小。输出最小值。思路 二分答案midmid,检验是否存在一个区间满足size(l,r)r−l+1≤mid\frac{size(l,r)}{r-l+1}\leq mid,也就是size(l,r)+mid×l≤mid×(r+1)size(l,r)+mid\times l原创 2017-08-04 16:51:47 · 219 阅读 · 0 评论 -
HDU 3874 Necklace
HDU 3874 Necklace线段树,离线询问题意给一个数组,m个询问。每次询问一个区间,求区间内数的和,重复数只计算一次。思路离线询问后按右端点排序,从左往右扫数字,开个hash记录上次该数出现的位置。线段树模拟数组,出现就在位置上放数,没出现就置零,统计区间和。这样每次扫到一个数,如果他没出现,就放到线段树上;如果他出现了,那么把它从上次出现的位置删掉,放到新的位置,更新hash数组。每次询原创 2017-10-10 00:38:17 · 201 阅读 · 0 评论