poj 3277 线段树求区间并1
来源:互联网 发布:古筝在线弹奏软件 编辑:程序博客网 时间:2024/05/21 12:43
所有矩形有相同的下边界,求 并 的面积
#include <stdio.h>#include <algorithm>using namespace std;#define N 80001#define L(i) i<<1#define R(i) i<<1|1struct City{ __int64 l,r,h; void input() { scanf("%I64d%I64d%I64d",&l,&r,&h); }}building[N];struct node{ int l,r; __int64 h; int mid() { return (l + r)>>1; }}st[N<<2];bool cmp(City a,City b){ return a.h < b.h;}int n,top;__int64 hash[N];__int64 sum;int bs(__int64 s){ int mid,l = 0, r = top -1; while(l <= r) { mid = (l + r)>>1; if(hash[mid] == s) return mid; if(hash[mid] < s) l = mid + 1; else r = mid - 1; } return -1;}void build(int l,int r,int id){ st[id].l = l; st[id].r = r; st[id].h = 0; if(l + 1 != r)///叶子结点 { int mid = st[id].mid(); build(l,mid,L(id)); build(mid,r,R(id)); }}void insert(int l,int r,__int64 h,int id){ if(st[id].l == l && st[id].r == r) { st[id].h = h; return ; } if(st[id].h) { st[L(id)].h = st[R(id)].h = st[id].h; st[id].h = 0; } int mid = st[id].mid(); if(mid >= r) insert(l,r,h,L(id)); else if(mid <= l) insert(l,r,h,R(id)); else { insert(l,mid,h,L(id)); insert(mid,r,h,R(id)); }}void query(int id){ if(st[id].h) { sum += st[id].h * (hash[st[id].r] - hash[st[id].l]); return ; } if(st[id].l + 1 == st[id].r) return ; query(L(id)); query(R(id));}int main(){ scanf("%d",&n); top = 0; int i; for(i = 0; i < n ; ++i) { building[i].input(); hash[top++] = building[i].l; hash[top++] = building[i].r; } sort(hash,hash+top); sort(building,building + n, cmp); int m = top; top = 1; for(i = 1;i < m; ++i)///离散化 if(hash[i] != hash[i-1]) hash[top++] = hash[i]; build(0,top - 1,1); for(i = 0;i < n; ++i) { int a = bs(building[i].l),b = bs(building[i].r); insert( a, b,building[i].h,1); } sum = 0; query(1); printf("%I64d\n",sum); return 0;}/*42 5 19 10 46 8 24 6 316*/
- poj 3277 线段树求区间并1
- poj3225(线段树求区间交,并,补)
- poj 2823 线段树 求固定区间的最大最小值
- poj 2823 线段树求区间最值
- poj 3875 RMQ或线段树求区间最值
- poj 3667 Hotel(线段树求区间连续值)
- POJ 3264(线段树求区间内最大值和最小值)
- POJ 3264 Balanced Lineup 求线段树区间最值
- poj 3468 线段树求区间和模板
- poj 1177 区间树求矩形周长并
- 线段树求区间最大值
- 线段树区间求最大值
- 线段树求区间最大值
- POJ 题目3667 Hotel(线段树,区间更新查询,求连续区间)
- poj 1750Potted Flower(线段树 区间合并 动态规划 区间求最大连续和)
- poj 2074 poj2074 区间求并
- poj 1177 Picture(线段树求矩形周长并)
- hdu 1542 poj/pku 1151(线段树求面积并)
- 设计模式学习笔记——代理模式
- iBatis小结 .
- 浅谈程序员团队建设
- 多态
- Linux内核中的等待队列--init_waitqueue_head
- poj 3277 线段树求区间并1
- 乱谈服务器编程
- Android---自定义带CheckBox的ExpandableListView实现
- Fragmented MP4 vs. MPEG2-TS
- 安豆苗:豌豆荚和棒普的混合体 无流量消耗的近场同步软件
- 魔鬼的梦魇—验证IE中的JS内存泄露模式(一)
- java中关于主函数的遐想
- 如何在15分钟内掌握JavaScript面向对象编程
- 二叉查找树