洛谷[P3616] 富金森林公园【数据结构】【线段树】【树状数组】
来源:互联网 发布:十字绣制图软件 编辑:程序博客网 时间:2024/04/19 12:34
Description
博艾的富金森林公园里有一个长长的富金山脉,山脉是由一块块巨石并列构成的,编号从1到N。每一个巨石有一个海拔高度。而这个山脉又在一个盆地中,盆地里可能会积水,积水也有一个海拔高度,所有严格低于这个海拔高度的巨石,就会在水面下隐藏。
由于地壳运动,巨石的海拔高度可能会随时变化,每次一块的巨石会变成新的海拔高度。当然,水面的高度也会随时发生变化。
因为有这样奇妙的地质奇观,吸引了很多游客来游玩。uim作为一个游客,可以告诉你此时水位海拔,你得告诉他,能看到有几个连续露出水面的部分。(与水面持平我们也认为是露出)
题解
考虑暴力,询问的时候
代码
#include<cstdio>#include<cstring>#include<algorithm>#define maxn 400006using namespace std;inline char nc(){ static char buf[100000],*i=buf,*j=buf; return i==j&&(j=(i=buf)+fread(buf,1,100000,stdin),i==j)?EOF:*i++;}inline int _read(){ int sum=0;char ch=nc(); while(!(ch>='0'&&ch<='9'))ch=nc(); while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc(); return sum;}struct data{ int l,r,tag,num; void add(int x){tag+=x;num+=x;}}tree[maxn*4];struct init{ int k,x,y,yy,id; bool operator <(const init&b)const{return id<b.id;}}a[maxn*2];int n,tet;void build(int p,int l,int r){ tree[p].l=l;tree[p].r=r; if(l>=r)return; int mid=(l+r)>>1; build(p<<1,l,mid);build(p<<1|1,mid+1,r);}void pushdown(int p){ if(!tree[p].tag)return; tree[p<<1].add(tree[p].tag); tree[p<<1|1].add(tree[p].tag); tree[p].tag=0;}void update(int p,int l,int r,int x){ if(tree[p].l>r||tree[p].r<l)return; if(l<=tree[p].l&&r>=tree[p].r){ tree[p].add(x);return; } pushdown(p); update(p<<1,l,r,x);update(p<<1|1,l,r,x);}int query(int p,int x){ if(tree[p].l>x||tree[p].r<x)return 0; if(tree[p].l==tree[p].r)return tree[p].num; pushdown(p); return query(p<<1,x)+query(p<<1|1,x);}bool cmp(init x,init y){return x.y<y.y;}int main(){ n=_read();tet=_read(); for(int i=1;i<=n;i++)a[i].y=_read(),a[i].id=i; for(int i=n+1;i<=n+tet;i++){ a[i].k=_read(); if(a[i].k==2)a[i].x=_read(),a[i].y=_read(); else a[i].y=_read(); a[i].id=i; } sort(a+1,a+1+n+tet,cmp);a[1].yy=1; for(int i=2;i<=tet+n;i++) if(a[i].y!=a[i-1].y)a[i].yy=a[i-1].yy+1; else a[i].yy=a[i-1].yy; build(1,1,a[tet+n].yy); sort(a+1,a+1+tet+n);a[0].yy=0; for(int i=1;i<=n;i++) if(a[i-1].yy<a[i].yy)update(1,a[i-1].yy+1,a[i].yy,1); for(int i=n+1;i<=n+tet;i++){ if(a[i].k==2){ int x=a[i].x; if(a[x-1].yy<a[x].yy)update(1,a[x-1].yy+1,a[x].yy,-1); if(x!=n&&a[x].yy<a[x+1].yy)update(1,a[x].yy+1,a[x+1].yy,-1); a[x].yy=a[i].yy; if(a[x-1].yy<a[x].yy)update(1,a[x-1].yy+1,a[x].yy,1); if(x!=n&&a[x].yy<a[x+1].yy)update(1,a[x].yy+1,a[x+1].yy,1); }else printf("%d\n",query(1,a[i].yy)); } return 0;}
阅读全文
0 0
- 洛谷[P3616] 富金森林公园【数据结构】【线段树】【树状数组】
- [树状数组] 洛谷 P3616 富金森林公园
- 洛谷P3616 富金森林公园
- P3616 富金森林公园
- 线段树,树状数组
- 线段树,树状数组
- 线段树,树状数组
- 线段树,树状数组
- 树状数组-线段树
- 线段树 && 树状数组
- 线段树,树状数组
- 线段树&&树状数组
- 线段树+树状数组
- hdu 1166 敌兵布阵(数据结构:树状数组||线段树)
- CodeVS1369 xth 砍树 解题报告【数据结构】【线段树/树状数组】
- 【数据结构】树状数组模板--CODE[VS] 1080线段树练习and1081线段树练习2
- 树状数组和线段树
- 线段树and树状数组
- 正则表达式
- 单位分解有限元方法(PUFEM)
- 进程间通信--管道
- ArrayList实现中的SubList
- HDU 3652 数位DP
- 洛谷[P3616] 富金森林公园【数据结构】【线段树】【树状数组】
- 浅读K-means
- #7 处理元数据
- centos 7 mini 安装 mysql
- 使用Sublime编译C语言
- mysql 判断逻辑操作
- Dungeon Master
- HDU 2196-Computer(经典树形DP)
- DDR3中bank, 16bit和32bit等概念