
数据结构-树状数组
Endless_Way
这个作者很懒,什么都没留下…
展开
-
BZOJ 1878 [SDOI2009]HH的项链
离线+排序+树状数组先离线,按右端点排序。 记当前位置之前最后一次出现的数的位置的值为1,这玩意儿可以随位置右移而很方便地更新,询问就是求区间和了,树状数组维护。 #include<cstdio>#include<algorithm>#define lowbit(x) (x&(-x))#define N 50005#define M 200005#define C 1000005usi原创 2016-09-27 14:06:44 · 271 阅读 · 0 评论 -
BZOJ 3295 [Cqoi2011]动态逆序对
树状数组套线段树线树状数组维护一整个序列,线段树维护当前区间的元素取值。单次操作O((logn)^2)题不错,就是有点卡内存- -#include<cstdio>#include<cstring>#define N 100005#define lowbit(_i) (_i&-_i)#define ll long longusing namespace std;int n, a[N], p原创 2016-10-18 09:29:49 · 285 阅读 · 0 评论 -
BZOJ 3333 排队计划
每排序一次,减少的只能是在p的右边由所有小于等于h[p]的数构成的逆序对。用线段树维护区间最小值,没个数只需访问一次,总时间复杂度O(nlogn)#include<cstdio>#include<algorithm>#define N 500005#define ll long long#define lowbit(_i) (_i&-_i)using namespace std;stru原创 2016-10-29 13:49:05 · 393 阅读 · 0 评论 -
BZOJ 3881 [Coci2015]Divljak
AC自动机+fail树+树链求并+树状数组挺复杂的一道题。看到这题的第一反应是把S里的穿全都丢到AC自动机里,然后对于T中的每一个串在AC自动机上走,走到每一个节点时暴力往回跳fail来贡献答案所有。由于fail指针可能有很多,应该是可以卡到O(n^2)的,过不了吧。我们发现每一次贡献答案都是沿着fail边往上的,于是考虑用fail树来考虑。每一次一个节点贡献答案想到于该节点到根的路径全都贡献答案。原创 2016-12-17 18:13:48 · 1050 阅读 · 0 评论 -
BZOJ 4240 有趣的家庭菜园
树状数组+贪心感觉最近写博客有一点高产。。。考虑从小到大放。最小的要么放最左,要么放最右。由于它放左还是右不会影响中间元素的操作次数,所以直接贪心。以此类推。#include<cstring>#include<cstdio>#include<algorithm>#define N 300005#define lowbit(_i) (_i&-_i)using namespace std;n原创 2017-02-02 18:00:01 · 429 阅读 · 0 评论 -
BZOJ 3594 [Scoi2014]方伯伯的玉米田
DP+二维树状数组显然一次操作[l,r]不优于操作[l,n],然后就可以DP。方程是一个三维前缀最大值,套上二维树状数组即可。 发生了一些奇怪的事,我这么傻比,有救吗? #include<cstdio>#include<cstring>#define N 10005#define K 505#define A 5555#define lowbit(_i) (_i&-_i)#define cma原创 2017-03-19 13:58:45 · 443 阅读 · 0 评论 -
BZOJ 2989 数列
CDQ分治+树状数组注意到这题修改操作对询问的贡献独立,且修改之间互不影响,考虑CDQ分治。用左边的修改更新右边,只需按x排序所有事件点,树状数组维护y轴即可。 不知道KD树能不能搞一搞? #include<cstdio>#include<algorithm>#define lowbit(_i) (_i&-_i)#define N 800005#define BASE 400005usin原创 2017-03-16 08:00:13 · 541 阅读 · 0 评论 -
LOJ 6032 「雅礼集训 2017 Day2」水箱
线段树合并+树状数组把0设成-1,问题就变成求最大前缀和。考虑一个DP,记f[i]表示i隔板隔住了水,i之前最多满足多少条件。转移的时候枚举j表示[j,i]能是一个以j,i为左右端点的装水区间。这样的问题是每次从新的i扫到一个j都要合并一遍区间里的所有标记,也就是一个区间会被合并多次。然而能够证明,不同的装水区间不超过O(n)个,且它们之间不会有交(端点可能相同)。因此先找出这些区间,线段树维护一个原创 2017-06-28 07:54:54 · 964 阅读 · 0 评论