
线段树
Sirius_Ren
▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇自己刮~~~
展开
-
BZOJ 3165 李超线段树
思路: 李超线段树 我是把线段转成斜率的形式搞得 不知道有没有更简单的方法//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int mod1=39989,mod2=1000000000;#define double long doubleint read原创 2017-01-18 09:11:08 · 986 阅读 · 3 评论 -
BZOJ 3110 线段树套线段树
思路: 外围一个权值线段树 里面是个区间线段树 搞一个标记永久化//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 100050#define int long longint n,m,op,xx,yy,zz,cnt,root[N*16原创 2017-01-09 10:04:22 · 293 阅读 · 0 评论 -
BZOJ 3083 树链剖分+倍增+线段树
思路: 先随便选个点 链剖+线段树 1操作 就直接改root变量的值 2操作 线段树上改 3操作 分成三种情况 1.new root = xx 整个子树的min就是ans 2. lca(new root,xx) !=xx query 一下 当前的标号 和当前的标号+size(链剖不就是个特殊的dfs序嘛) 3. lca(new root,xx) =xx 找一下root原创 2017-01-06 14:18:20 · 457 阅读 · 0 评论 -
BZOJ 4552 排序 Heoi2016
记得当年省选的时候 这道题连暴力都没写对(尴尬ing) (当年天真的认为sort是左闭右闭的hhhhhh) 思路: 首先 二分答案线段树 首先二分答案,然后需要知道进行m次排序后p位置上的数字是否大于mid。 对于一个mid,我们可以把序列里的数字分为两类,即大于mid的数和小于等于mid的数,分别用1和0表示。 对这些0和1进行排序时,对于一个区间[l,r]进行升序排序,等原创 2017-01-02 11:47:33 · 376 阅读 · 0 评论 -
BZOJ 3600 替罪羊树+线段树
思路: 当然是抄的黄学长的题解啦//By SiriusRen#include <cstdio>#include <algorithm>using namespace std;#define N 500005int n,m,rt,R,top,id[N],mx[N],pos[N];double a[N];char ch[11];struct data{ int l,r;原创 2017-01-02 09:07:06 · 617 阅读 · 0 评论 -
BZOJ 3196 线段树套平衡树
(代码无比丑陋)//By SiriusRen#include <cstdio>#include <algorithm>using namespace std;int n,m,L,R,xx,tx,t,root[3000050],size,ans,op,inf=0x3fffffff,a[500050];struct Treap{int ch[2],v,cnt,sz,rnd;}tr[300005原创 2016-12-05 00:34:00 · 877 阅读 · 1 评论 -
BZOJ 1146 二分+链剖+线段树+treap
思路: 恶心的数据结构题……首先 我们 链剖 把树 变成序列 再 套一个 区间 第K大就好了…… 复杂度(n*log^4n)//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 88888#define inf 1000000原创 2016-12-12 10:46:49 · 654 阅读 · 0 评论 -
COGS 577 蝗灾 线段树+CDQ分治
第一次写cdq分治 感谢hhd<y 这对CP的指导(逃)其实 就是 递归看左半部分对右半部分的贡献 //By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 666666int w,n,tree[N*16];struct Oper{i原创 2016-12-10 23:24:11 · 444 阅读 · 0 评论 -
BZOJ 3262 cdq分治 OR 树套树
注意判断 三个条件都一样的…… CDQ分治 其实就是看左半部分对右半部分的贡献 (其实并不是很难理解 只是想不到……)CDQ分治://By SiriusRen#include <cstdio>#include <algorithm>using namespace std;#define N 888888int n,k,tree[N],tot,ans[N];struct No原创 2016-12-11 15:43:39 · 741 阅读 · 0 评论 -
POJ 2823 线段树 Or 单调队列
线段树的黑暗做法。//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>#define N 1000001#define lson l,mid,pos*2#define rson mid+1,r,pos*2+1using namespace std;int n,k,xx,yy,ansmax,ansmi原创 2016-06-30 11:41:31 · 676 阅读 · 0 评论 -
POJ 2374 线段树建图+Dijkstra
题意: 思路: 线段树+Dijkstra(要堆优化的)线段树要支持打标记 一个栅栏 拆成两个点 :左和右 新加一个栅栏的时候 看看左端点有没有被覆盖过 如果有的话 就分别从覆盖的那条线段的左右向当前的左端点连一条边权为距离的边右端点同理 跑一遍Dijkstra 就好啦复杂度:O(nlogn)//By SiriusRen#include <queue>#include <c原创 2016-10-31 15:02:24 · 737 阅读 · 0 评论 -
BZOJ 4034 线段树+DFS序
思路: 先搞出来每个点的DFS序 (要有入栈和出栈两种状态的) 处理出来 线段树区间有多少入栈的和多少出栈的加区间的时候就加(入-出)*wei查前缀和//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 200050#define int原创 2016-11-11 17:08:00 · 630 阅读 · 0 评论 -
BZOJ 2836 树链剖分+线段树
思路: 链剖+线段树裸题重链的标号就是DFS序所以查子树的时候每回就 query(change[x],change[x]+size[x]-1) 就好了剩下的应该都会吧。。//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define int long lon原创 2016-11-11 16:49:42 · 825 阅读 · 0 评论 -
BZOJ 2124 线段树维护hash值
思路:http://blog.youkuaiyun.com/wzq_QwQ/article/details/47152909(代码也是抄的他的) 自己写得垃圾线段树怎么都过不了隔了两个月 再写 再挂又隔了10天 再写 终于A了………………………..//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using原创 2017-01-10 14:52:25 · 825 阅读 · 0 评论 -
BZOJ 4636 (动态开节点)线段树
思路: 偷懒 懒得离散化 搞了个动态开节点的线段树 (其实是一样的……..)注意会有a=b的情况 要判掉//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int n,xx,yy,zz,root,cnt,inf=1000000000,tree[22222原创 2017-01-10 22:44:44 · 1808 阅读 · 0 评论 -
BZOJ 2141 分块 线段树
思路: a[i]//By SiriusRen#include <cmath>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N=20050;int n,m,cpy[N],h[N],u,Block,block[N],xx,yy,ans;struct BIT{原创 2017-03-03 00:23:48 · 305 阅读 · 0 评论 -
BZOJ 4129 树上带修莫队+线段树
思路: 可以先做做BZOJ3585 是序列上的mex 考虑莫队的转移 如果当前数字出现过 线段树上把它置成1 对于询问 二分ans 线段树上查 0到ans的和 是不是ans+1 本题就是把它搞到了序列上 带了个修改… 麻烦一点 本质上是一样的//By SiriusRen#include <cmath>#include <cstdio>#include <cstring>#原创 2017-03-03 00:13:49 · 506 阅读 · 0 评论 -
BZOJ 1818 线段树+扫描线
思路: 可以把题目转化成 给你一些沿坐标轴方向的线段 让你求交点个数 然后就线段树+扫描线 搞一搞 (线段不包含断点 最后+n 这种方式 比线段包含断点+各种特判要好写得多)//By SiriusRen#include <cstdio>#include <algorithm>using namespace std;const int N=100005;int n,stkx[N]原创 2017-02-01 10:46:03 · 674 阅读 · 0 评论 -
BZOJ 2819 DFS序+线段树
非递归的DFS写炸了… 交了一个递归版的 过了………..//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N=1000050;int n,nn,q,xx,yy,stk[N],in[N],out[N],top,cnt,tree[N*4];i原创 2017-01-31 12:58:54 · 436 阅读 · 0 评论 -
BZOJ 4184 线段树+高斯消元
思路: 线段树表示的是时间 每回最多log个段 区间覆盖 一直到叶子 的线性基 xor 一下 就是答案 一开始没有思路 看了这篇题解 豁然开朗 http://www.cnblogs.com/joyouth/p/5333181.html (还是本省的前辈呢)//By SiriusRen#include <set>#include <vector>#include <cstdi原创 2017-02-15 00:08:49 · 741 阅读 · 0 评论 -
BZOJ1901 ZOJ2112 线段树+treap (线段树套线段树)
BZOJ1901://By SiriusRen#include <cstdio>#include <algorithm>using namespace std;#define N 600050char op[3];int n,m,t,root[N],size,a[N],tmp,L,R,xx;struct Treap{int ch[2],v,cnt,rnd,sz;}tr[N];void原创 2016-12-05 18:51:29 · 495 阅读 · 0 评论 -
BZOJ 2733 线段树的合并 并查集
思路: 1.线段树合并(nlogn的) 2.splay+启发式合并线段树合并比较好写 我手懒//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N=100050;int n,m,q,a[N],f[N],xx,yy,son[N*50][2]原创 2017-02-11 22:23:23 · 542 阅读 · 0 评论 -
BZOJ 2212线段树的合并
借鉴(抄)了一下题解…… 线段树合并的裸题吧…//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 4000050typedef long long LL; int n,cnt,tree[N],son[N][2],root,Root[N],a原创 2017-02-11 22:25:45 · 924 阅读 · 0 评论 -
BZOJ 3626 离线+树链剖分+线段树
思路: 抄一波yousiki的… 显然,暴力求解的复杂度是无法承受的。 考虑这样的一种暴力,我们把 z 到根上的点全部打标记,对于 l 到 r 之间的点,向上搜索到第一个有标记的点求出它的深度统计答案。观察到,深度其实就是上面有几个已标记了的点(包括自身)。所以,我们不妨把 z 到根的路径上的点全部 +1,对于 l 到 r 之间的点询问他们到根路径上的点权和。仔细观察上面的暴力不难发现,原创 2017-01-19 07:51:28 · 442 阅读 · 0 评论 -
BZOJ 1568 李超线段树
思路: 李超线段树裸题//By SiriusRen#include <cmath>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 100050int n,t;char op[10];struct Tree{double s,p;}tr[N*8];void in原创 2017-01-18 09:06:41 · 1011 阅读 · 0 评论 -
BZOJ 3339 线段树
思路: 考虑离线处理 显然 l固定时 r越大 ans越大 那我们不妨按照l从小到大排序l->l+1的时候 l到next[l]这段区间都跟a[l]取min就好了搞颗线段树维护一下//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 22222原创 2017-01-12 17:46:54 · 673 阅读 · 0 评论 -
URAL 1297 后缀数组+线段树
思路: 论文题……*n 倒过来接上 求LCP 搞棵线段树即可//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 5555int cases,pos,maxans,n,cntA[N],cntB[N],A[N],B[N],rk[N],sa[原创 2017-01-15 23:27:15 · 415 阅读 · 0 评论 -
POJ 3170 线段树优化DP
题意: 思路: 先搞一个vector 存以T2结尾的结构体 (结构体里面有开始工作的时间和花费) f[i]表示取区间[M,i)的代价 易得f[i]=min(f[k]+w,f[i]);T1<=k//By SiriusRen#include <vector>#include <cstdio>#include <cstring>#include <algorithm>u原创 2016-10-30 01:10:02 · 674 阅读 · 1 评论 -
POJ 3321 DFS序+线段树
思路: 先DFS一遍 对于每一个点 找到begin 和end(DFS进的时候的cnt 和出的时候的cnt)每回修改的时候 改begin上边的权值 查的时候查 [begin,end]呃 如果我说得不清楚 请看http://blog.youkuaiyun.com/zhang20072844/article/details/6703432//By SiriusRen#include <cstdi原创 2016-11-09 17:06:23 · 589 阅读 · 0 评论 -
POJ 3237 树链剖分+线段树
思路:树链剖分+线段树纯自己瞎想的 想到哪儿就写哪儿,,, 所以调了一下午+一晚上…..【尴尬】#include <cstdio>#include <cstring>#include <algorithm>#define N 22222using namespace std;char ch[11];int cnt=0,rec[N],top[N],fa[N],deep[N];in原创 2016-08-31 23:27:11 · 341 阅读 · 0 评论 -
POJ 1990 线段树
题意: 思路: 线段树 (一棵就够啦 不像树状数组,还得用两棵)先对v从小到大排序。每回插入的时候当前的v是最大的,只需要统计它到各个坐标的距离就好了。里面存两个东西: 这个坐标左边的坐标个数和这个坐标左边的坐标之和。 ans_num表示这个坐标左边的坐标个数ans_num表示这个坐标左边的坐标之和tot_sum表示一共的坐标之和i表示当前处理的是第i头牛ans+=(cow[i].p原创 2016-08-30 11:03:45 · 696 阅读 · 0 评论 -
NOIP 2013 T2 火柴排队 ---->求逆序对
[NOIP2013T2]火柴排队背景noip2013day1描述涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。 现在将每盒中的火柴各 自 排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:∑(ai-bi)2,其中 ai 表示第一列火柴中第 i 个火柴的高度, bi 表示第二列火柴中第 i 个火柴的高度。每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之原创 2016-07-15 23:54:33 · 583 阅读 · 0 评论 -
POJ 3368 线段树
思路: 先统计在第i个位置当前数字已经出现的次数。 维护两个数组,一个是当前位置的数字最后一次出现的位置,另一个是当前位置的数字第一次出现的位置 查找的时候分为两种情况:没有和边界相交(意会意会)的数字中的最大值,注意右边界一定要不小于左边边界。统计一下和边界相交的数字出现的次数… 如果整个区间是一个数的话要特判。// by SiriusRen#include <cstdio>#i原创 2016-08-06 17:53:06 · 258 阅读 · 0 评论 -
AHOI 2009 (BZOJ1798)维护序列 seq (线段树好题?)
我是不会说这个题很坑的。。 改了一晚上。。。 // by SiriusRen#include <cstdio>#define N 150000#define LSON l,mid,lson#define RSON mid+1,r,rson#define LL long longusing namespace std;LL n,m,mod,xx,yy,zz,jy;LL mul[N*原创 2016-07-06 22:48:53 · 892 阅读 · 0 评论 -
NOIP2012 D2 T2 借教室 线段树 OR 二分法
思路:1.线段树 维护区间的最小值,每次修改可以运用打标记的方法节省时间(关于节省时间 我后面有话说)。。。2.二分?(可惜并不会写,不知道怎么二分)。晚上补了个二分的程序。(若要看正解,请直接翻至页面底部。。 中间废话多)原创 2016-07-04 21:04:55 · 2453 阅读 · 2 评论 -
TYVJ 1427 线段树的基本操作
题意: 单点修改,区间最值 思路: 线段树 原题请戳这里//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>#define LSON l,mid,lson#define RSON mid+1,r,rson#define N 500000 #define inf 0x3fffffffusing原创 2016-07-06 20:18:35 · 1459 阅读 · 0 评论 -
POJ 2299 求逆序对个数 归并排序 Or数据结构
题意: 求逆序对个数 没有重复数字 线段树实现: 离散化。 单点修改,区间求和// by SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;long long ans=0;int n,t,f[2555555],sum[2555555],a[2555555];bo原创 2016-07-16 00:16:08 · 413 阅读 · 0 评论 -
POJ 3264 线段树 ST
题意:给你一个数列,从中挑一段,问你这段数的最大值减最小值是多少。 思路:线段树。// by Sirius_Ren#include <cstdio>#include <algorithm>#define N 50000using namespace std;int n,q,xx,yy,tree[N*4],MAX[N*4],MIN[N*4],ansmax,ansmin;void buil原创 2016-06-29 19:59:24 · 514 阅读 · 0 评论 -
POJ 3468 线段树+状压
题意:给你n个数,有对区间的加减操作,问某个区间的和是多少。 思路:状压+线段树(要用lazy标记,否则会TLE)//By SiriusRen#include <cstdio>#include <cstring>#define N 100001using namespace std;long long tree[N*4],lazy[N*4];int xx,yy,zz,n,q;char原创 2016-06-29 19:42:11 · 729 阅读 · 0 评论 -
POJ 2777 线段树
一道线段树。lazy标记+位运算……(第一次写这个什么lazy标记,抄了一发题解)我们发现:“或”操作在这里用正合适。 原题请戳这里// by Sirius_Ren#include <cstdio>#include <algorithm>#define N 100010using namespace std;int l,t,o,xx,yy,zz;char jy;struct segt原创 2016-06-28 20:54:49 · 719 阅读 · 0 评论