poj 3277 City Horizon
2012-03-02 17:21
369 查看
//数据很大,需要先离散化,然后线段树。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=80005;
struct node{
int left, right, mid, cover;
};
struct seg{int x[2], h;}p[40005];
struct HAS{int x, id;}a[80005];
node seg_tree[4*MAXN];
int n, hash[80005];
void make(int l, int r, int num){
seg_tree[num].left=l;
seg_tree[num].right=r;
seg_tree[num].mid=(l+r)/2;
seg_tree[num].cover=0;
if(l+1!=r){
make(l, seg_tree[num].mid, num*2);
make(seg_tree[num].mid, r, num*2+1);
}
}
void insert(int l, int r, int h, int num){
if(seg_tree[num].left==l&&seg_tree[num].right==r){
if(seg_tree[num].cover<h)
seg_tree[num].cover=h;
return;
}
if(r<=seg_tree[num].mid)
insert(l, r, h, 2*num);
else if(l>=seg_tree[num].mid)
insert(l, r, h, 2*num+1);
else {
insert(l, seg_tree[num].mid, h, 2*num);
insert(seg_tree[num].mid, r, h, 2*num+1);
}
}
long long cal(int h, int num){ //由于已经离散化,必须到根节点才能计算
if(h>seg_tree[num].cover)
seg_tree[num].cover=h;
if(seg_tree[num].left+1==seg_tree[num].right)
return (long long)(hash[seg_tree[num].right]-hash[seg_tree[num].left])*seg_tree[num].cover;
return cal(seg_tree[num].cover, num*2)+cal(seg_tree[num].cover, num*2+1);
}
bool cmp(HAS t1, HAS t2){
return t1.x<t2.x;
}
void init(){ //离散化
int i, l, r, h, t;
for(i=0; i<n; i++){
scanf("%d%d%d", &p[i].x[0], &p[i].x[1], &p[i].h);
a[i*2].x=p[i].x[0];
a[i*2+1].x=p[i].x[1];
a[i*2].id=i*2;
a[i*2+1].id=i*2+1;
}
sort(a, a+2*n, cmp);
t=1;
hash[t]=p[a[0].id/2].x[a[0].id%2];
p[a[0].id/2].x[a[0].id%2]=1;
for(i=1; i<2*n; i++){
if(a[i].x>a[i-1].x){
hash[++t]=p[a[i].id/2].x[a[i].id%2];
p[a[i].id/2].x[a[i].id%2]=t;
}
else {
hash[t]=p[a[i].id/2].x[a[i].id%2];
p[a[i].id/2].x[a[i].id%2]=t;
}
}
}
int main(){
//freopen("1.txt", "r", stdin);
scanf("%d", &n);
make(1, 80000, 1);
init();
for(int i=0; i<n; i++)
insert(p[i].x[0], p[i].x[1], p[i].h, 1);
printf("%lld\n", cal(0, 1));
return 0;
}
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=80005;
struct node{
int left, right, mid, cover;
};
struct seg{int x[2], h;}p[40005];
struct HAS{int x, id;}a[80005];
node seg_tree[4*MAXN];
int n, hash[80005];
void make(int l, int r, int num){
seg_tree[num].left=l;
seg_tree[num].right=r;
seg_tree[num].mid=(l+r)/2;
seg_tree[num].cover=0;
if(l+1!=r){
make(l, seg_tree[num].mid, num*2);
make(seg_tree[num].mid, r, num*2+1);
}
}
void insert(int l, int r, int h, int num){
if(seg_tree[num].left==l&&seg_tree[num].right==r){
if(seg_tree[num].cover<h)
seg_tree[num].cover=h;
return;
}
if(r<=seg_tree[num].mid)
insert(l, r, h, 2*num);
else if(l>=seg_tree[num].mid)
insert(l, r, h, 2*num+1);
else {
insert(l, seg_tree[num].mid, h, 2*num);
insert(seg_tree[num].mid, r, h, 2*num+1);
}
}
long long cal(int h, int num){ //由于已经离散化,必须到根节点才能计算
if(h>seg_tree[num].cover)
seg_tree[num].cover=h;
if(seg_tree[num].left+1==seg_tree[num].right)
return (long long)(hash[seg_tree[num].right]-hash[seg_tree[num].left])*seg_tree[num].cover;
return cal(seg_tree[num].cover, num*2)+cal(seg_tree[num].cover, num*2+1);
}
bool cmp(HAS t1, HAS t2){
return t1.x<t2.x;
}
void init(){ //离散化
int i, l, r, h, t;
for(i=0; i<n; i++){
scanf("%d%d%d", &p[i].x[0], &p[i].x[1], &p[i].h);
a[i*2].x=p[i].x[0];
a[i*2+1].x=p[i].x[1];
a[i*2].id=i*2;
a[i*2+1].id=i*2+1;
}
sort(a, a+2*n, cmp);
t=1;
hash[t]=p[a[0].id/2].x[a[0].id%2];
p[a[0].id/2].x[a[0].id%2]=1;
for(i=1; i<2*n; i++){
if(a[i].x>a[i-1].x){
hash[++t]=p[a[i].id/2].x[a[i].id%2];
p[a[i].id/2].x[a[i].id%2]=t;
}
else {
hash[t]=p[a[i].id/2].x[a[i].id%2];
p[a[i].id/2].x[a[i].id%2]=t;
}
}
}
int main(){
//freopen("1.txt", "r", stdin);
scanf("%d", &n);
make(1, 80000, 1);
init();
for(int i=0; i<n; i++)
insert(p[i].x[0], p[i].x[1], p[i].h, 1);
printf("%lld\n", cal(0, 1));
return 0;
}
相关文章推荐
- poj 3277 city horizon 线段树
- POJ 3277 City Horizon 扫描线+离散化+线段树
- POJ 3277 City Horizon
- POJ训练计划3277_City Horizon(扫描线/线段树+离散)
- (离散化 + 线段树) poj 3277 City Horizon
- poj 3277 City Horizon 线段树
- POJ 3277 - City Horizon
- 离散化+线段树 POJ 3277 City Horizon
- POJ 3277 City Horizon
- poj 3277 City Horizon(线段树#2----离散化)
- poj 3277 City Horizon
- POJ 3277 City Horizon 线段染色
- POJ 3277 City Horizon(线段树+扫描线+离散化)
- poj 3277 City Horizon
- poj 3277 City Horizon (线段树 扫描线 矩形面积并)
- Poj 3277 City Horizon - 线段树
- poj 3277 City Horizon
- poj 3277 City Horizon 线段树加上离散化
- POJ 3277 City Horizon
- POJ 3277 City Horizon(矩形面积并)