01 2018 档案

摘要:【题解】 1,先说说莫队算法。 莫队算法是用来离线处理区间问题的算法。非常易于理解和使用,且运用十分广泛。 假设我们现在已知区间[L,R]的答案,如果我们能以较低的时间复杂度扩展得到区间$[L-1,R],[L+1,R],[L,R-1],[L,R+1]$的答案,我们就可以使用莫队算法。通常可以接受的扩 阅读全文
posted @ 2018-01-31 21:58 Driver_Lao 阅读(165) 评论(0) 推荐(0) 编辑
摘要:【题解】 1,本题要求维护一个序列,支持区间加k,询问区间平均数和方差。 2,询问平均数显然很好处理,在线段树上维护区间和sum以及区间长度len即可。 3,方差的处理就相对麻烦一些。需要研究一下公式。 我们先看看方差的公式: 那就是1/n乘上这个式子: 也就是区间平方和Sqr-区间和Sum的两倍+ 阅读全文
posted @ 2018-01-31 10:17 Driver_Lao 阅读(191) 评论(0) 推荐(0) 编辑
摘要:【题解】 我们用sum[i]表示1~i的奇偶性,这样,我们要知道每个点的情况就必须知道每一个sum[i]. 如果我们当前已知sum[i-1],我们就可以通过查询i~j的情况知道sum[j],即查询i~j的操作是sum[i-1]与sum[j]相互转化的途径。那么我们可以把查询操作当成一条连接i-1与j 阅读全文
posted @ 2018-01-30 19:49 Driver_Lao 阅读(152) 评论(0) 推荐(0) 编辑
摘要:【题解】 水题。。 保存连接方式,按顺序处理即可。 阅读全文
posted @ 2018-01-30 10:36 Driver_Lao 阅读(128) 评论(0) 推荐(0) 编辑
摘要:【题解】 显然每个位置的贡献是它前面比它小的数的个数乘上它后面比它大的数的个数。 那么离散化之后用树状数组维护即可。 阅读全文
posted @ 2018-01-30 10:16 Driver_Lao 阅读(120) 评论(0) 推荐(0) 编辑
摘要:【题解】 显然是个多重背包。但直接写背包会超时。所以我们试着优化。 怎么优化?我们发现,每个物品的个数$ai$可以拆分成几个数的和,用这些数中的某几个之和可以表示出$1$到$ai$的所有整数,并且不会超过$ai$ 这样我们可以把ai个相同的物品拆分成若干个互相独立的物品,然后跑01背包。 那么如何对 阅读全文
posted @ 2018-01-22 20:38 Driver_Lao 阅读(854) 评论(0) 推荐(0) 编辑
摘要:推荐两个讲得很好的博客: http://blog.sina.com.cn/s/blog_70811e1a01014esn.html https://segmentfault.com/a/1190000003914228 1 #include<cstring> 2 #include<cstdio> 3 阅读全文
posted @ 2018-01-22 14:16 Driver_Lao 阅读(145) 评论(0) 推荐(0) 编辑
摘要:【题解】 容易想到用线段树维护,但是无脑开T棵线段树会导致时间超限。怎么办呢?我们可以把一个区间的状态用30位2进制数表示。第$i$位为$1$表示这个区间有第$i$种颜色,为$0$表示没有。 这样我们只需要维护区间或的结果,并支持区间设为一个数即可。 1 #include<cstdio> 2 #in 阅读全文
posted @ 2018-01-22 13:45 Driver_Lao 阅读(155) 评论(0) 推荐(0) 编辑
摘要:【题解】 我们先把边按照$a$值从小到大排序,并按照这个顺序加边。 如果当前要加入的边连接的两点$u$与$v$已经是连通的,那么直接加入这条边就会出现环。这时我们需要删除这个环中$b$值最大的边。因此我们需要维护区间最大值,以及最大值的位置。 如果当前$1$与$n$已经连通,就更新$ans$,当前从 阅读全文
posted @ 2018-01-12 20:21 Driver_Lao 阅读(169) 评论(0) 推荐(0) 编辑
摘要:【题解】 这道题可以用Link-Cut Tree写。。 首先建立一个虚拟节点N+1,$i$与$N+1$连边表示$i$被弹飞了 对于修改操作,先$cut(i,min(n+1,i+k[i]))$,然后再$link(i,min(n+1,i+newk))$ 对于询问操作,先$makeroot(x)$,然后$ 阅读全文
posted @ 2018-01-11 21:54 Driver_Lao 阅读(248) 评论(0) 推荐(0) 编辑
摘要:【题解】 动态树模板题,只要求维护森林的连通性,直接上板子即可。 1 #include<cstdio> 2 #include<algorithm> 3 #define N 500010 4 #define ls (c[u][0]) 5 #define rs (c[u][1]) 6 using nam 阅读全文
posted @ 2018-01-11 20:00 Driver_Lao 阅读(203) 评论(0) 推荐(0) 编辑
摘要:1 #include<cstdio> 2 #include<algorithm> 3 #define N 500010 4 #define rg register 5 #define ls (c[u][0]) 6 #define rs (c[u][1]) 7 using namespace std; 阅读全文
posted @ 2018-01-11 19:06 Driver_Lao 阅读(173) 评论(0) 推荐(0) 编辑
摘要:1 #include<cstdio> 2 #include<algorithm> 3 #define ls (a[u].l) 4 #define rs (a[u].r) 5 #define fa (a[u].f) 6 using namespace std; 7 const int maxn=200 阅读全文
posted @ 2018-01-09 21:18 Driver_Lao 阅读(187) 评论(0) 推荐(0) 编辑
摘要:【题意概述】 维护一个数列,要求支持以下6种操作: 【题解】 大Boss。。。可以用Treap解决 需要用到垃圾回收、线性建树。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define ls (a[u].l) 5 阅读全文
posted @ 2018-01-07 20:30 Driver_Lao 阅读(144) 评论(0) 推荐(0) 编辑
摘要:【题解】 这是一道区间覆盖的题目,我们可以用树状数组或者线段树来解决。显然,每个区间 [L,R] 被多少条线段覆盖这样计算:R左边的线段的左端点数-L左边的线段的右端点数 这样,我们分别维护1~Pos位置上左端点、右端点的个数即可。 1 #include<cstdio> 2 #include<alg 阅读全文
posted @ 2018-01-05 20:04 Driver_Lao 阅读(196) 评论(0) 推荐(0) 编辑
摘要:【题解】 用线段数维护差分数组即可。 1 #include<cstdio> 2 #include<algorithm> 3 #define ls (u<<1) 4 #define rs (u<<1|1) 5 #define mid ((a[u].l+a[u].r)>>1) 6 #define len 阅读全文
posted @ 2018-01-04 20:32 Driver_Lao 阅读(173) 评论(0) 推荐(0) 编辑
摘要:【题解】 本题要计算矩形组成的轮廓线,可以用线段树来实现。 由于区间长度很大,不能直接开线段数记录,我们要先进行离散化。(显然拐点只可能出现在矩形的左右两边上)然后逐个加入矩形并维护每个位置的最大值。最后对每个拐点可能的位置进行查询并统计答案即可。 1 #include<cstdio> 2 #inc 阅读全文
posted @ 2018-01-04 19:48 Driver_Lao 阅读(137) 评论(0) 推荐(0) 编辑