主席树
loveicecola
AFO
展开
-
主席树模板(支持修改)
#include<bits/stdc++.h>using namespace std;const int N=2e6+10;int n,m,sz,tot,a[N],b[N],rt[N],s[N],ls[N*30],rs[N*30],sum[N*30],rootl[40],rootr[40],cntl,cntr;struct Que{ int opt,i,j,k;}q...原创 2019-01-01 09:31:14 · 303 阅读 · 0 评论 -
CODEFORCES ROUND #406 (DIV. 2) E. TILL I COLLAPSE
考虑暴力怎么做?对于每一个kkk,贪心地双指针扫一遍。如果加入下一个点就超过kkk个,那就结束当前段,并且将lll指针移到当前位置的下一位。考虑如何优化寻找的过程。整体二分可以在log n的时间复杂度找到区间第k大值在哪里。假如我们确定了某一个右端点,那么是不是可以快速的跳若干个点,并且保证这个区间是满足不超过kkk个的最长区间。因此我们用主席树做这道题。处理和HH项链那道题是一样的,钦定...原创 2019-04-02 16:17:12 · 263 阅读 · 0 评论 -
[SDOI2009]HH的项链
给定一个序列,多组询问,每次给定[l,r],求区间内本质不同的数的个数。写这道题是为了解决后面的一个问题,废话不多说。这题看着,其实思路挺多的。分块、莫队、树状数组、主席树……但对我后面有用的是树状数组和主席树,所以只讨论它们。一个thick是当右端点确定的时候,对于一个数出现多次,我们知道只有最靠右的是有用的,然后只需要求区间和就好了。询问排序,树状数组,完事。考虑在线怎么做。其实和那...原创 2019-04-02 14:36:03 · 183 阅读 · 0 评论 -
可持久化数组
嘿嘿,题目只是一个幌子,我还是肝主席树233。但是,为什么会有这样一个名字?考虑假如不管空间,我们有一个最暴力的写法。开一个m∗nm*nm∗n的数组,每次修改某一时刻某一位置的值,我们直接把它修改掉就好。然后把它当成新的时刻,所以需要O(n)O(n)O(n)的赋值。这个算法无论是空间还是时间,复杂度我们都无法接受。有了之前可持久化的思路,我们考虑能不能有一种可持久的数组,把空间和时间都降低呢...原创 2019-04-02 10:10:32 · 1057 阅读 · 0 评论 -
[FJOI2016]神秘数
^ _ ^可能是之前写过这道题(菜鸡当然是看题解的),有点印象的缘故,这次再看,思考了1h左右独立解决了问题qwq。本题的关键在于一个区间组成的数集的子集mexmexmex如何快速找出。假如子集mexmexmex为ans+1ans+1ans+1,那么[1,ans][1,ans][1,ans]这个区间内的数都可以组成。并且我们还知道这[1,ans][1,ans][1,ans]的数是由[1,le...原创 2019-04-02 08:48:16 · 446 阅读 · 0 评论 -
[SCOI2016]美味
这道题之前首先有一个最简化的版本,给定一个序列,求最大区间异或和。首先,区间[l,r]的异或和可以是[1,r]xor[1,l−1][1,r]xor[1,l-1][1,r]xor[1,l−1]。我们可以维护一个前缀异或和,每次将它插入之前贪心得从高位向低位尽可能选择最优的值与当前值异或。做完以后将这个前缀插入01trie里面。加强一点的:给定一个序列,多组询问,每次给定l,r,xl,r,xl...原创 2019-04-02 06:44:29 · 207 阅读 · 0 评论 -
主席树模板(带修改)
P2617 Dynamic Rankings显然单单写一个主席树是不够的,主席树可以维护的是静态区间第k大。本题要求动态修改,所以考虑带修改的主席树怎么写。首先很显然一个小thick是,我们把修改的部分和原本静态的分开,单独形成新的主席树。这样的好处有很多:处理方便,思路清晰,更好理解题目。如果暴力修改的话,每次修改一个点,我们最多需要修改n棵线段树。所以复杂度太高,无法接受。其实带修改的...原创 2019-04-01 19:30:33 · 992 阅读 · 0 评论 -
主席树模板
#include<bits/stdc++.h>using namespace std;const int N=2e5+10;int n,m,tot,sz,a[N],b[N],sum[N*20],ls[N*20],rs[N*20],rt[N];void discrete(){ sort(b+1,b+n+1); sz=unique(b+1,b+n+1)-b-1; for(in...原创 2019-04-01 15:59:49 · 122 阅读 · 0 评论 -
bzoj4571
这道题的简化版是没有加d的。如果是那样的话,我们只需要做一个可持久化trie树就好了。把要异或的数划分为二进制,从高位向低位匹配,如果当前位为0,我们查询区间内的数当前位能否为1;如果当前位为1,我们查询区间内的数当前位能否为0。具体来说,假设现在已经匹配了x(这个x是拿来与b匹配的x而不是匹配后的值),现在要匹配第h位,并且b的第h位为1,我们要确定当前位能否为0,其实就是找【x,x+2...原创 2019-01-03 07:18:51 · 159 阅读 · 0 评论 -
[JSOI2018]列队
性质1:把若干个人塞到一个连续区间内,那么从左向右依次对应一定是最优的。性质2:一定存在一个分界点,左边的人都是在区间点的左边,右边的人都是在区间点的右边。因此,很显然有一个nlog2nnlog^2nnlog2n的做法,二分分界点,主席树查询第kkk大判断。但是,其实我们的二分是多余的,直接在主席树上二分就好了,边二分边计算答案。#include<bits/stdc++.h&g...原创 2019-04-02 21:01:38 · 238 阅读 · 0 评论