hdu 1556 线段树
2016-05-11 17:42
225 查看
题目链接
本来做了个稍微难的线段树区间更新,发现自己还是太菜,感谢前人思路
裸的区间更新
这道题有点不一样,懒惰标记可以在最后向下增加
本来做了个稍微难的线段树区间更新,发现自己还是太菜,感谢前人思路
裸的区间更新
这道题有点不一样,懒惰标记可以在最后向下增加
#include <string.h> #include <stdio.h> #define max(a,b) a>b?a:b #define N 1005 #include<iostream> using namespace std; struct node { int l,r,sum,n,az; } t[400000]; int n,m; void build (int i,int l,int r) { t[i].l=l; t[i].r=r; t[i].sum=0; if(l==r) { return; } int mid=(l+r)/2; build(i*2,l,mid); build(i*2+1,mid+1,r); } void update(int i,int l,int r) { if(t[i].l==l&&t[i].r==r) {//这里是核心,类似懒惰标记,在中序遍历时向下附加 t[i].sum+=1; return ; } int mid=(t[i].l+t[i].r)/2; if(r<=mid) update(i*2,l,r); else if(l>mid) update(i*2+1,l,r); else { update(i*2,l,mid); update(i*2+1,mid+1,r); } } void sum(int i) {//二叉树中序遍历 if(t[i].l==t[i].r) { m++; printf("%d",t[i].sum); if(m!=n)printf(" "); return ; } t[i*2].sum+=t[i].sum; t[i*2+1].sum+=t[i].sum; sum(i*2); sum(i*2+1); } int main() { while(cin>>n&&n) { build(1,1,n); for(int j=0; j<n; j++) { int x,y; scanf("%d%d",&x,&y); update(1,x,y); } m=0; sum(1); printf("\n"); } return 0; }
相关文章推荐
- selenium java等待alert对话框弹出,并关闭对话框
- 自动匹配HTTP请求中对应实体参数名的数据(性能不是最优)
- 网游中的网络编程3:在UDP上建立虚拟连接
- 资料
- 两个数组实现堆栈
- Oracle12c中功能及性能新特点之with子句的增强
- js 数组的深浅拷贝 js对象的深浅拷贝
- 自动溜坡
- java枚举类型enum的使用
- android string.xml中显示特殊符号
- LeetCode 345
- SASS用法指南-阮一峰
- Python学习笔记-json解析
- thinkphp的create()方法出错原因
- 修改状态栏的背景色
- FTU几种保护逻辑研究
- android判断手机有没有安装微博
- Coroutine,你究竟干了什么?
- UILabel自适应分行显示
- leetcode.148. Sort List