hdu1556
来源:互联网 发布:怎么共享网络连wifi 编辑:程序博客网 时间:2024/06/06 12:34
//区间修改线段树,效率貌似很低#include<iostream>#include<cstring>#include<cstdio>using namespace std;int n,x,y;struct point{ int l,r,sum,add;}p[300010];void build(int o,int l,int r){ p[o].l=l; p[o].r=r; p[o].sum=0; p[o].add=0; if(l!=r) { int mid=(l+r)/2; build(o*2,l,mid); build(o*2+1,mid+1,r); }}void update(int o,int l,int r,int add){ if(p[o].l==l&&p[o].r==r) { p[o].sum=p[o].sum+r-l+1; p[o].add+=add; return; } int mid=(p[o].l+p[o].r)/2; if(l>mid)update(o*2+1,l,r,add); else if(r<=mid)update(o*2,l,r,add); else { update(o*2,l,mid,add); update(o*2+1,mid+1,r,add); } p[o].sum=p[o*2].sum+p[o*2+1].sum;}int query(int o,int i,int j){ if(p[o].l==i&&p[o].r==j)return p[o].sum; if(p[o].add>0) { p[o*2].sum+=(p[o*2].r-p[o*2].l+1)*p[o].add; p[o*2+1].sum+=(p[o*2+1].r-p[o*2+1].l+1)*p[o].add; p[o*2+1].add+=p[o].add; p[o*2].add+=p[o].add; p[o].add=-1; } int mid=(p[o].l+p[o].r)/2; if(mid>=j)return query(o*2,i,j); if(mid<i)return query(o*2+1,i,j); return query(o*2,i,mid)+query(o*2+1,mid+1,j);}int main(){ while(cin>>n,n) { build(1,1,n); for(int i=1;i<=n;i++) { scanf("%d%d",&x,&y); update(1,x,y,1); } printf("%d",query(1,1,1)); for(int i=2;i<=n;i++) { printf(" %d",query(1,i,i)); } printf("\n"); } return 0;}
0 0
- hdu1556
- hdu1556
- hdu1556
- HDU1556
- hdu1556
- hdu1556
- hdu1556
- HDU1556
- hdu1556
- HDU1556
- hdu1556
- HDU1556
- hdu1556题解
- hdu1556 D
- HDU1556 线段树入门
- hdu1556 color the ball
- hdu1556树状数组
- hdu1556--树状数组
- C语言中字符数组赋值方法
- 撒旦的点点滴滴的顶顶顶的
- 树--杂记()
- Java 利用第三方平台实现发送短信功能
- 内部类 final变量的生命周期
- hdu1556
- json乱码
- ZOJ 1655 Transport Goods
- Android用C++创建surface显示RGB数据
- 大家语言这件,当朋友巫
- mySQL1
- 如何将CComSafeArray转换为_variant_t
- 顺序9天t语塞不禁蹿
- 优化Myeclipse10 Building Workspace速度慢等问题