LA 4108 SKYLINE 线段树
2014-01-23 18:59
246 查看
题目
对于第i个建筑物,问当前状况下能看见第i个建筑物多长的部分,然后求和.
用一个点i表示[i,i+1]这个区间,然后瞎搞
对于第i个建筑物,问当前状况下能看见第i个建筑物多长的部分,然后求和.
用一个点i表示[i,i+1]这个区间,然后瞎搞
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; inline int input() { int ret=0;char c=getchar(); while(c<'0'||c>'9') c=getchar(); while(c>='0'&&c<='9') ret=ret*10+c-'0',c=getchar(); return ret; } #define N 100005 #define L t<<1 #define R t<<1|1 struct node { int l,r,Min,Max,lazy; }root[N<<2]; int t,n,l,r,h; int ans; inline void build(int t,int x,int y) { root[t].l=x,root[t].r=y; root[t].Min=root[t].Max=0,root[t].lazy=-1; if(x!=y) { int mid=(x+y)>>1; build(L,x,mid),build(R,mid+1,y); } } inline void modefiy(int t,int x,int y,int h,int tag) { int l=root[t].l,r=root[t].r,mid=(l+r)>>1; if(root[t].Min>h) return; if(l==r) { if(root[t].Max<=h) { if(tag)ans++; root[t].Max=root[t].Min=h; } return; } if(l>=x&&r<=y&&root[t].Max<=h) { root[t].Min=root[t].Max=root[t].lazy=h; if(tag)ans+=r-l+1; //printf("%d %d %d xx\n",ans,r,l); return; } if(root[t].lazy!=-1) { modefiy(L,l,mid,root[t].lazy,0); modefiy(R,mid+1,r,root[t].lazy,0); root[t].lazy=-1; } if(x<=mid) modefiy(L,x,min(mid,y),h,tag); if(y>mid) modefiy(R,max(x,mid+1),y,h,tag); root[t].Min=min(root[L].Min,root[R].Min); root[t].Max=max(root[L].Max,root[R].Max); } int main() { while(1) { t=input(); if(t==0) break; while(t--) { n=input(); ans=0; build(1,1,100000); for(int i=0;i<n;i++) { l=input(),r=input(),h=input(); modefiy(1,l,r-1,h,1); } printf("%d\n",ans); } } return 0; }
相关文章推荐
- Visual Tree
- Hessian客户端
- UVa 490 旋转句子
- Sql Server中的分页Sql
- sourcemap的使用
- CATransform3D 矩阵 m11–m44每个的含义
- ToolBarTray
- DLL--显示链接调用符号表接口的非MFC动态链接库
- javascript:利用事件的阻止冒泡实现模态框的隐藏功能
- 重建二叉树
- java学习笔记21——匿名内部类
- 【46】需要类型转换时请为模版定义非成员函数
- 获取当前活动窗体
- 谷歌眼镜Mirror API开发指南之Timeline
- C++ 算法库(5) 二分法查找操作
- QQ悬浮客服跟其他JQ冲突的解决办法
- TextBox_TextChanged
- 程序员,你可以更优秀些
- 五 手游开发神器 cocos2d-x editor 之贴图(TexturePacker)
- Mysql数据库的设计.sql