
线段树
HbFS-
di4CoveRy
展开
-
[HDU5997] [BestCoder Round #90] rausen loves cakes启发式合并+线段树
诶手速慢了一两秒钟没了rank1 (为了速度借用了hzwer的板子,自己手写的线段树) 同BZOJ1483梦幻布丁,只是多一个区间l,r的询问 用线段树记录[l,r]区间内有多少个相同的布丁 答案等于qr-ql+1-([ql,qr]上相同的布丁)#include<cstdio>#include<iostream>#include<cstring>#define N 100005#de原创 2016-12-18 12:06:00 · 430 阅读 · 0 评论 -
[BZOJ4869][Shoi2017]相逢是问候 扩展欧拉定理+势能线段树
根据扩展欧拉定理 当x≥ϕ(p) x\geq \phi(p)时有ax≡ax%ϕ(p)+ϕ(p)(modp)a^x\equiv a^{x \% \phi(p)+\phi(p)}(mod p) 我们发现在至多进行tt次操作后,a≡ca(modp)a \equiv c^a(modp),t为进行p=ϕ(p)p=\phi(p)多少次之后p=1p=1,tt的大小为O(log2p)O(log_2p)级别的原创 2017-05-27 14:19:43 · 597 阅读 · 0 评论 -
[BZOJ3211]花神游历各国 势能线段树
势能线段树 维护区间不为1的元素数量 对于存在元素不为1的区间暴力递归修改/************************************************************** Problem: 3211 User: di4CoveRy Language: C++ Result: Accepted Time:2164 ms原创 2017-04-23 19:53:02 · 643 阅读 · 0 评论 -
[Codeforces goodbye2016] E.New Year and Old Subsequence 线段树
诶这题卡了我大半天,换了一万种写法,重新定义了好多个数组 诶这篇题解写的相当垃圾,如果是想看做法请绕路其实主要恶心的是数字6,这玩意儿好多地方能放,也有好多地方不能放,重点对它讨论的思路是没错的。 总体上来说,这个东西不能放在”201”的后面,不管是在”7”的前面还是7的后面做法是线段树节点维护一堆值,分别表示匹配2017的第i-j位且不包含2016的至少删除的字符个数,还有接在左边第i位后面的原创 2017-01-26 18:07:27 · 687 阅读 · 0 评论 -
[BZOJ4552][Tjoi2016&Heoi2016]排序 二分答案+线段树
诶看到题目我以为是很神很神的数据结构,直接想放弃了 看到题解以后发现题目确实很神,不过并不是很强的数据结构,做法很巧很棒直接处理升序和降序是没法儿做的 二分答案x,将序列里面的所有元素分成大于x的和小于等于x的,分别用0,1表示,这样区间升序/降序就能转化成为区间赋值,线段树维护即可代码几乎没难度,可是考场里要想到这个解法可能不容易#include <iostream>#include <cs原创 2017-01-30 16:45:19 · 370 阅读 · 0 评论 -
[GDKOI2016] Day1 魔卡少女 线段树
很久之前写的题,今天看到的一句话概括了这道题的精髓: xor的每一位具有独立性,分开维护即可10棵线段树+1e8+7,很好写很好过#include <iostream>#include <cstdio>#define N 2000050#define mod 100000007#define mid ( (l+r)>>1 )#define ls l,mid,(t<<1)#define rs原创 2017-01-27 23:16:28 · 718 阅读 · 0 评论 -
[codeforces] 762C - Two strings 线段树
我想这题一定有不需要线段树的做法 但是比赛的时候时间紧迫也没有去想那么多觉得线段树可做直接上了考虑留下来的区间,一定是左边一段右边一段(也可以只有左边或右边),我们需要找最长的这么两段,且这两段和A串匹配的LCS不能有交集。线段树节点[l,r]值为y表示B串从左往右匹配LCS到A串的[l,r]区间,其中位置B串匹配到最长的长度为y,从左往右处理完之后再从右往左枚举B串长度和匹配到A串的位置,两者需原创 2017-01-26 19:27:15 · 640 阅读 · 3 评论 -
[BZOJ4551][Tjoi2016&Heoi2016]树 dfs序+线段树
维护一棵只有标记的线段树 标记为二元组(x,v)表示节点和深度 定义标记加法为取v较大的那个标记#include <iostream>#include <cstdio>#include <vector>#define mid ( (l + r) >> 1 )#define ls l,mid,t<<1#define rs mid+1,r,t<<1^1 #define N 100050usi原创 2017-01-23 21:54:35 · 316 阅读 · 0 评论 -
[Codeforces343D] Water Tree 树链剖分
既然讲了这题,就写一写吧 直接剖,没啥好想的#include <iostream>#include <cstdio>#include <vector>#define mid ( (l + r) >> 1 )#define ls l,mid,t<<1#define rs mid+1,r,t<<1^1#define N 500050using namespace std;int son[N]原创 2017-01-23 18:16:53 · 409 阅读 · 0 评论 -
[BZOJ4653][Noi2016]区间 线段树
将所有区间按li-ri排序,那么答案一定是一段连续的区间 有单调性,两个指针扫 一段区间是合法的当且仅当这个区间中存在一个点被超过m个区间覆盖 线段树维护区间最大值,支持区间加法操作即可 notice:l,r达到了1e9,需要离散化/************************************************************** Problem: 4653原创 2017-01-23 13:28:44 · 376 阅读 · 0 评论 -
[BZOJ2588]Spoj 10628. Count on a tree 可持久化线段树
离散化 对每个节点,用线段树表示该节点到根的路径上的值域 然后可持久化询问的时候查询u,v,LCA(u,v),fa[ LCA(u,v)]结点上的四棵线段树 做一做减法就好notice: 1、初始的权值已经超过了int,需要long long 2、最后一组询问的换行符不要输出!(我已经邮件了一发管理员希望他改题面)写起来很好写#include <iostream>#include <cst原创 2017-01-21 18:26:41 · 339 阅读 · 0 评论 -
[BZOJ4628][BeiJing2016]IP地址 可持久化线段树+字典树
按深度建可持久化线段树/************************************************************** Problem: 4628 User: di4CoveRy Language: C++ Result: Accepted Time:3556 ms Memory:259828 kb***********原创 2017-02-27 18:24:30 · 728 阅读 · 0 评论 -
[BZOJ4722]由乃 结论+线段树
大神博客说的很好:http://blog.youkuaiyun.com/werkeytom_ftd/article/details/54429577细节不多注意一下就好#include #include #include #define mid ( (l + r) >> 1 )#define ls l,mid,t<<1#define rs mid+1,r,t<<1^1#define N原创 2017-01-17 23:50:43 · 401 阅读 · 0 评论 -
[BZOJ4355]Play with sequence 吉司机线段树
定义二元组标记(p,c)表示对区间内元素x x=max(x+p,c) x = \max{(x+p,c)} 标记支持区间加法 tag1<p1,c1>+tag2<p2,c2>=tag<p1+p2,max(c1+p2,c2)> tag1<p1,c1> + tag2<p2,c2> = tag<p1+p2,max(c1+p2,c2)> 那么标记就可以下推啦 覆盖操作可以表示成tag<−INF,c原创 2017-01-17 13:17:40 · 1240 阅读 · 0 评论 -
[BZOJ3674]可持久化并查集 可持久化线段树维护数组
对于并查集数组fa[i],可以拿可持久化线段树来维护好像要按秩合并才能过吧/************************************************************** Problem: 3674 User: di4CoveRy Language: C++ Result: Accepted Time:1748 ms原创 2017-01-16 16:08:15 · 331 阅读 · 0 评论 -
[UOJ164] V 记录历史最值线段树
令标记为表示对这个区间加p后和c取max再多来两个标记记录两次修改间这个节点所能得到的最大标记是多少诶写线段树之前真应该把标记加法和节点加法先在草稿纸上写好以后再开始敲不然写起来很难受#include #include #define N 500050#define INF (1LL<<60)#define mid ((l+r)>>1)#define ls l,mid原创 2017-01-15 23:07:29 · 1154 阅读 · 0 评论 -
[UVALive]7338 树链剖分+线段树
诶秒出正解的题目写起来就是爽有一个结论:在生成树上添加一条新边E{a,b,v}使得新图的最小生成树改变,充要条件是E和生成树形成的环中,v不是权值最大的边。对最小生成树进行树链剖分,按树链剖分序建线段树对于第n~m条边E{a,b,v},将a,b路径上的最短边求出来e{a0,b0,v0},v-v0即为该边能减小最多的值,增加最多的值为INF对于前1~n-1条边E{a,b,v}原创 2016-12-07 19:04:01 · 577 阅读 · 0 评论 -
[Codeforces div1] Round 739C. Alyona and towers 线段树+差分数组
这题应当有很多做法拿到题目以后有很多想法,光是不同的线段树就有两三种,而且我觉得分块卡一卡也是能卡过去的。最后写了最简单的方法,代码比起其它的解法都短很多。考虑查分后的数组,原问题变可以转化成求最长的一段正数后紧接一段负数的长度。若用折线将这串数字连接起来,那么每一段“合唱队形”数便可以表示成两个波谷之间的距离。线段树维护所有的波谷,维护最大的两个波谷之间的距离。修原创 2016-12-20 19:35:57 · 572 阅读 · 2 评论 -
Codeforces 240F : TorCoder
对于每一种字符分开来维护 26棵线段树,线段树节点维护区间字符出现的次数,分别维护他们的位置判断一次操作是否合法: 对于每一个字符, 查询区间内该元素的个数,若出现两个字符出现的次数同为奇数,或者区间长度为偶数并且有字符出现的次数为奇数,则该操作不合法。进行一次操作: 对于单个字符,由于操作结束之后位置一定是在两侧连续的(不考虑出现次数为奇数时中间的那一个字符),用线段树区间赋值标记即可。原创 2017-06-15 21:56:09 · 621 阅读 · 0 评论