最近尝试了一下动态开点线段树,英文直译就是Dynamic Open Point Segment Tree,太SB了。

就跟之前的主席树写法差不多。

 if(!x || x == y) {
x = ++tot;
}

主席树

 if(!o) {
o = ++tot;
}

动态开点线段树

实际上当普通线段树用就行了......

例题:洛谷P1908 逆序对

我们可以不离散化,使用动态开点,直接在1e9上开值域线段树。吸氧后堪堪A掉。

 // luogu-judger-enable-o2
#include <cstdio> typedef long long LL;
const int N = ; int sum[N * ], tot, ls[N * ], rs[N * ], a[N], root; void add(int L, int R, int l, int r, int &o) {
if(!o) {
o = ++tot;
}
if(L <= l && r <= R) {
sum[o]++;
return;
}
int mid = (l + r) >> ;
if(L <= mid) {
add(L, R, l, mid, ls[o]);
}
if(mid < R) {
add(L, R, mid + , r, rs[o]);
}
sum[o] = sum[ls[o]] + sum[rs[o]];
return;
} int ask(int L, int R, int l, int r, int o) {
if(!o) {
return ;
}
if(L <= l && r <= R) {
return sum[o];
}
int mid = (l + r) >> ;
int ans = ;
if(L <= mid) {
ans += ask(L, R, l, mid, ls[o]);
}
if(mid < R) {
ans += ask(L, R, mid + , r, rs[o]);
}
return ans;
} int main() {
//printf("%d", sizeof(sum) / 1024 / 1024 * 3);
int n, m = 1e9; scanf("%d", &n);
for(int i = ; i <= n; i++) {
scanf("%d", &a[i]);
} LL ans = ;
for(int i = ; i <= n; i++) {
ans += ask(a[i] + , m, , m, );
add(a[i], a[i], , m, root);
}
printf("%lld", ans);
return ;
}

AC代码

例题:洛谷P2471 降雨量

这个题的难点TM在于分类讨论......大毒瘤。

对于未知的位置,我们用一个bool数组维护就行了。

询问的时候查x,y,(x,y)三段,然后暴力讨论.....

 #include <cstdio>
#include <algorithm> const int N = , E = 1e9 + ; int root, large[N * ], tot, ls[N * ], rs[N * ];
bool maybe, sure[N * ]; void change(int p, int v, int l, int r, int &o) {
//printf("change : %d %d %d %d \n", p, v, l, r);
//getchar();
if(!o) {
o = ++tot;
}
if(l == r) {
large[o] = v;
sure[o] = ;
return;
}
int mid = l + (r - l) / ;
if(p <= mid) {
change(p, v, l, mid, ls[o]);
}
else {
change(p, v, mid + , r, rs[o]);
}
large[o] = std::max(large[ls[o]], large[rs[o]]);
sure[o] = sure[ls[o]] & sure[rs[o]];
return;
} int ask(int L, int R, int l, int r, int o) {
//printf("%d %d %d %d \n", L, R, l, r);
if(!o) {
maybe = ;
return ;
}
if(L <= l && r <= R) {
if(!sure[o]) {
maybe = ;
}
return large[o];
}
int mid = l + (r - l) / ;
int ans = ;
if(L <= mid) {
ans = std::max(ans, ask(L, R, l, mid, ls[o]));
}
if(mid < R) {
ans = std::max(ans, ask(L, R, mid + , r, rs[o]));
}
return ans;
} int main() {
int n, limit = E << , x, y;
scanf("%d", &n);
for(int i = ; i <= n; i++) {
scanf("%d%d", &x, &y);
change(x + E, y, , limit, root);
}
scanf("%d", &n);
while(n--) {
scanf("%d%d", &y, &x);
if(y == x) {
printf("true\n");
continue;
}
int c = ask(y + E, y + E, , limit, root);
int cc = maybe;
maybe = ;
int d = ask(x + E, x + E, , limit, root);
int dd = maybe;
maybe = ;
//printf("%d %d %d %d \n", c, cc, d, dd); false -> maybe
if(y + == x) {
if(cc || dd){
printf("maybe\n");
}
else {
if(c >= d) {
printf("true\n");
}
else {
printf("false\n");
}
}
continue;
}
int e = ask(y + + E, x - + E, , limit, root);
int ee = maybe;
maybe = ;
//printf("%d %d \n", e, ee);
if(dd) {
if(cc) {
printf("maybe\n");
}
else {
if(e >= c) {
printf("false\n");
}
else {
printf("maybe\n");
}
}
continue;
}
if(cc) {
if(e >= d) {
printf("false\n");
}
else {
printf("maybe\n");
}
continue;
}
if(ee) {
if(e >= d || c < d) {
printf("false\n");
}
else {
printf("maybe\n");
}
continue;
}
if(e >= d || c < d) {
printf("false\n");
}
else {
printf("true\n");
}
} return ;
}

AC代码

DynamicSegmentTree的更多相关文章

随机推荐

  1. Android开发——为EditText添加烟花效果的实现

    )什么时候发射烟花:监听EditText的文字改变,获取文字数量的变化以确定风的方向,还有获取光标的位置确定爆炸的位置.光标的位置没有具体的方法确定坐标,要通过反射自己计算. 2.  主要实现类 库里 ...

  2. 如何完全卸载VS2010(亲自体验过) (转)

    1.首先用360卸载,当卸载完成后,提示有残余的话,就强力清除 2,接着,下载IobitUninstaller工具 3.按照下面进行卸载 1.Microsoft .NET Framework 4 框架 ...

  3. libgdx学习记录1——图片显示Texture

    libgdx底层采用opengl渲染,对图片进行了优化处理,与android原生态的bitmap不太一样. 相比而言,效率要高一些,不过只支持png,jpg,bmp三种格式. 显示中,一般将图片放在a ...

  4. [CF587F]Duff is Mad[AC自动机+根号分治+分块]

    题意 给你 \(n\) 个串 \(s_{1\cdots n}\) ,每次询问给出 \(l,r,k\) ,问在 \(s_{l\cdots r}\) 中出现了多少次 \(s_k\) . \(n,q,\su ...

  5. Windows Server 2003出现Directory Listing Denied This Virtual Directory does not allow contents to be listed.的解决方案

    Directory Listing DeniedThis Virtual Directory does not allow contents to be listed. 是目录权限无法访问的问题 解决 ...

  6. 阿里(蚂蚁,菜鸟)+百度+网易面经(JAVA)

    本人综述: 本人本科和硕士均是毕业于普通的双非院校,参加过ACM竞赛,阿里面了三次全被拒了,网易收到offer. 阿里面试: 阿里的面试问的都是很基础的东西,如操作系统的简单问题,计算机网络的基本问题 ...

  7. 当activity改变时,我们如何处理它

    用户和系统触发­的事件,可能造成一个activity状体的改变.这个文档描述了一些常见的情况,和如何去处理这些改变. 原网站:https://developer.android.google.cn/g ...

  8. 新手向:从不同的角度来详细分析Redis

    最近对华为云分布式缓存产品Redis做了一些研究,于是整理了一些基本的知识拿出来与大家分享,首先跟大家分享的是,如何从不同的角度来详细使用Redis. 小编将从以下9个角度来进行详细分析,希望可以帮到 ...

  9. .net中操作Visual SourceSafe

    最近整理一些资料,发现以前写的一段代码,提供对微软的版本管理软件visual sourcesafe的一些操作.以下简称vss. 想起以前写的时候,因为资料比较匮乏,只能边研究边测试,走了不少弯路. 由 ...

  10. 老李的blog使用日记(3)

    匆匆忙忙.碌碌无为,这是下一个作业,VS,多么神圣高大上,即使这样,有多少人喜欢你就有多少人烦你,依然逃不了被推销的命运,这抑或是它喜欢接受的,但是作为被迫接受者,能做的的也只有接受,而已. 既来之则 ...