随笔分类 - 数据结构——线段树和树状数组
摘要:和sdoi的相关分析很像qwq,推柿子然后线段树搞搞
阅读全文
摘要:"ref" cpp include include include using namespace std; int n, a[500005], fa[500005], siz[500005], cnt[500005], ans[500005]; int hmn[500005]; double k;
阅读全文
摘要:pkusc 快到了……做点题涨涨 rp。 初见时 yy 了一个类似于归并的东西,$O(n^2)$,50 分。 50 分 yy 做法 对于一个点,枚举他能到达的权值(假设这个权值在左子树,在右子树是一样的),选上这个点的概率就是“在左子树选上这个点的概率 $\times$ (选择子结点最大值的概率 $
阅读全文
摘要:"ref" cpp include include include using namespace std; int n, m, a[100005], sum[400005], tag[400005], q; struct Node{ int opt, lll, rrr; }nd[100005];
阅读全文
摘要:"线段树合并" 好写好调,隔壁老王的treap+启发式合并难写难调 cpp include include using namespace std; int n, m, fa[100005], val[100005], rot[100005], uu, vv, fan[100005], cnt; i
阅读全文
摘要:做了 [JSOI2008]Blue Mary开公司 以后发现这 tm 不就是个傻逼树剖+李超线段树吗,做了以后发现我才是傻逼……树剖竟然写错了……这题是我目前写过最长的代码了qwq cpp include include using namespace std; typedef long long
阅读全文
摘要:"ref" 好像叫什么李超线段树?……这篇不是太通用……
阅读全文
摘要:定义区间是内部只含有乘号的区间。 对于区间左端点是 $l \geq 2$ 的情况,左端点前头是加号的情况和前头是减号的情况的个数是相同的。因此这些区间不对答案产生贡献。 所以区间左端点必定是 $1$。当 $r=n$ 时,这个区间产生一次贡献。当 $r include include using na
阅读全文
摘要:枚举右端点,然后看左端点合法情况。 先预处理每个颜色 $i$ 的最大出现位置 $max_i$ 和最小出现位置 $min_i$。对于枚举右端点在一个位置 $i$,凡是 $max_k i$ 的颜色 $k$ 都是不能要的。那么要满足右端点往右都合法,就要找出一个 $j i$ 这样的最大的 $j$。那么左端
阅读全文
摘要:鬼畜线段树…… "Orz Capella" cpp include include using namespace std; int n, m, uu, vv, opt; double xx[100005], yy[100005], ss, tt, faq[4]; struct SGT{ doubl
阅读全文
摘要:二分一下,然后从左到右扫描,扫到左端点就把区间 push 到堆里。 每次有点不符合二分的值时,就贪心地选择右端点最远的 add。
阅读全文
摘要:看 "这里" cpp include include include using namespace std; int n, s[100005], a[100005], c[2][1000005], ans; int lb(int x){ return x& x; } void add(int x,
阅读全文
摘要:扫描线水题。 cpp include include include using namespace std; typedef long long ll; int n, m, dx[300005], dy[300005], cntx, cnty, cnt, uu, vv, ww, aa, bb; l
阅读全文
摘要:看到一坨矩形就要想到扫描线。(poj atantis) 我们把横边竖边分开计算,因为横边竖边其实没有区别,以下论述全为考虑竖边的。 怎样统计一个竖边对答案的贡献呢?答:把这个竖边加入线段树,当前的总覆盖长度 减去 加入前的总覆盖长度 的绝对值 即为这个竖边的贡献。 这样做有一个要求,横坐标相同的竖边
阅读全文
摘要:跟线段树求区间最值一样每个节点维护左边开始的最大连续空房间数、右边开始的最大连续空房间数、这个区间内的最大连续空房间数 cpp include include using namespace std; int n, m, opt, uu, vv; struct SGT{ int lma[200005
阅读全文
摘要:倒序 处理,线段树保存有多少空位 cpp include include using namespace std; int n, ans[200005], uu[200005], vv[200005]; struct SGT{ int sum[800005]; void build(int o, i
阅读全文
摘要:大凡两个标记,无非是先乘再加,与先加再乘的区别罢了。 先加再乘 我们以 $val$ 来表示这个结点原始的值,$add$ 和 $mul$ 顾名思义是两个标记。这样,这个结点的值就被更新成了 $(val+add) \times mul$。(其实 $add$ 还要跟区间长度搞一搞,这里就省略了)。我们就知
阅读全文
摘要:扫描线应该打懒标记的…… cpp include include include using namespace std; typedef long long ll; int T, n, m, w, h, cnt, uu, vv, ww, zdz[80005], ans, tag[80005]; l
阅读全文
摘要:题目: "poj1151" 建议先参考参考别的扫描线文档。 考虑这样一些矩形: 拿一根扫描线从左往右扫,扫描线被矩形覆盖的长度会变化当扫过矩形的左右边界时。 我们就剥离出来左右边界。我们把所有的 $y$ 值都保存下来离散化。 我们拿线段树维护扫描线。线段树结点应保存从第几个 $y$ 开始到第几个 $
阅读全文

浙公网安备 33010602011771号