http://poj.org/problem?id=3277

线段树,离散化,成段更新

 #include <stdio.h>
#include <stdlib.h> #define lson l, m, root<<1
#define rson m+1, r, root<<1|1 const long long N = ;
const long long inf = (<<)-; long long max1[N<<], color[N<<]; long long max(long long x, long long y)
{
return x>y? x: y;
} void push_up(long long root)
{
max1[root] = max(max1[root<<], max1[root<<|]);
} void push_down(long long l, long long r, long long root)
{
color[root<<] = max(color[root<<], color[root]);
color[root<<|] = max(color[root<<|], color[root]);
color[root] = -;
max1[root<<] = max(max1[root<<], color[root<<]);
max1[root<<|] = max(max1[root<<|], color[root<<|]);
} void build(long long l, long long r, long long root)
{
long long m;
color[root] = -;
if(l == r)
{
max1[root] = ;
return;
}
m = (l + r) >> ;
build(lson);
build(rson);
push_up(root);
} void update(long long L, long long R, long long x, long long l, long long r, long long root)
{
long long m;
if(L <= l && r <= R)
{
color[root] = max(color[root], x);
max1[root] = max(max1[root], color[root]);
return;
}
m = (l + r) >> ;
if(color[root] != -)
{
push_down(l, r, root);
}
if(L <= m)
{
update(L, R, x, lson);
}
if(m+ <= R)
{
update(L, R, x, rson);
}
push_up(root);
} long long query(long long L, long long R, long long l, long long r, long long root)
{
long long m, result = ;
if(L <= l && r <= R)
{
return max1[root];
}
m = (l + r) >> ;
if(color[root] != -)
{
push_down(l, r, root);
}
if(L <= m)
{
result = max(result, query(L, R, lson));
}
if(m+ <= R)
{
result = max(result, query(L, R, rson));
}
push_up(root);
return result;
} struct B
{
long long x, y;
long long h;
}b[N>>]; long long a[N], hash[N]; long long bs(long long l, long long r, long long x)
{
long long m;
while(l < r)
{
m = (l + r) >> ;
if(hash[m] == x)
{
return m;
}
if(hash[m] < x)
{
l = m + ;
}
else
{
r = m;
}
}
} int cmp0(const void *a, const void *b)
{
return *(long long *)a - *(long long *)b;
} int main()
{
long long n, i, j, temp, result = ;
long long k;
scanf("%lld", &n);
for(i=; i<=n; i++)
{
scanf("%lld%lld%lld", &b[i].x, &b[i].y, &b[i].h);
a[(i-)*+] = b[i].x;
a[(i-)*+] = b[i].y;
}
qsort(a+, *n, sizeof(a[]), cmp0);
j = ;
hash[j] = a[];
for(i=; i<=*n; i++)
{
if(a[i] != a[i-])
{
j = j + ;
hash[j] = a[i];
}
}
// for(i=1; i<=j; i++)
// {
// printf("%5d", i);
// }
// printf("\n");
// for(i=1; i<=j; i++)
// {
// printf("%5d", hash[i]);
// }
// printf("\n");
build(, j-, );
for(i=; i<=n; i++)
{
// printf("update %lld %lld %lld\n", bs(1, j+1, b[i].x), bs(1, j+1, b[i].y)-1, b[i].h);
update(bs(, j+, b[i].x), bs(, j+, b[i].y)-, b[i].h, , j, );
// for(k=1; k<=j-1; k++)
// {
// printf("%4d", k);
// }
// printf("\n");
// for(k=1; k<=j-1; k++)
// {
// temp = query(k, k, 1, j, 1);
// result += (temp * (hash[k+1]-hash[k]));
// printf("%4d", temp);
// }
// printf("\n");
}
result = ;
for(i=; i<=j-; i++)
{
temp = query(i, i, , j, );
result += (temp * (hash[i+]-hash[i]));
// printf("%lld %lld %lld\n", i, temp, hash[i+1]-hash[i]);
}
printf("%lld\n", result);
return ;
}

pku3277 City Horizon的更多相关文章

  1. [POJ3277]City Horizon

    [POJ3277]City Horizon 试题描述 Farmer John has taken his cows on a trip to the city! As the sun sets, th ...

  2. 离散化+线段树 POJ 3277 City Horizon

    POJ 3277 City Horizon Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 18466 Accepted: 507 ...

  3. poj City Horizon (线段树+二分离散)

    http://poj.org/problem?id=3277 City Horizon Time Limit: 2000MS   Memory Limit: 65536K Total Submissi ...

  4. 1645: [Usaco2007 Open]City Horizon 城市地平线

    1645: [Usaco2007 Open]City Horizon 城市地平线 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 315  Solved: ...

  5. bzoj1645 [Usaco2007 Open]City Horizon 城市地平线

    Description Farmer John has taken his cows on a trip to the city! As the sun sets, the cows gaze at ...

  6. BZOJ_1654_[Usaco2007 Open]City Horizon 城市地平线_扫描线

    BZOJ_1654_[Usaco2007 Open]City Horizon 城市地平线_扫描线 Description N个矩形块,交求面积并. Input * Line 1: A single i ...

  7. bzoj1645 / P2061 [USACO07OPEN]城市的地平线City Horizon(扫描线)

    P2061 [USACO07OPEN]城市的地平线City Horizon 扫描线 扫描线简化版 流程(本题为例): 把一个矩形用两条线段(底端点的坐标,向上长度,添加$or$删除)表示,按横坐标排序 ...

  8. 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树

    [BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...

  9. 【BZOJ】1645: [Usaco2007 Open]City Horizon 城市地平线(线段树+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1645 这题的方法很奇妙啊...一开始我打了一个“离散”后的线段树.............果然爆了. ...

随机推荐

  1. shell 块注释

    方法一 : ' 被注释的多行内容 ' 方法二 :<<eof 被注释的多行内容 eof 方法三 :<<! 被注释的多行内容 ! 方法四 if false ; then 被注释的多 ...

  2. create-maximum-number(难)

    https://leetcode.com/problems/create-maximum-number/ 这道题目太难了,花了我很多时间.最后还是参考了别人的方法.还少加了个greater方法.很难. ...

  3. Android高手进阶教程(二十八)之---Android ViewPager控件的使用(基于ViewPager的横向相册)!!!

      分类: Android高手进阶 Android基础教程 2012-09-14 18:10 29759人阅读 评论(35) 收藏 举报 android相册layoutobjectclassloade ...

  4. mysql 调用带返回值的存储过程

    存储过程: create procedure proc_t(out uname varchar(50),out upwd varchar(50),in uid int) BEGIN select na ...

  5. python执行mysqldump命令

    本文简单讲述如何利用python执行一些sql语句,例如执行mysqldump命令,进行数据库备份,备份成sql文件 #!/usr/bin/python#导入os模块import os#导入时间模块i ...

  6. 【英语】Bingo口语笔记(14) - 表示“不愉快”

    bail on 放弃;背弃

  7. poj 2661 Factstone Benchmark (Stirling数)

    //题意是对于给定的x,求满足n! <= 2^(2^x)的最大的n//两边同取以二为底的对数,可得: lg2(n!) <= 2^x 1.   log2(n!) = log2(1) + lo ...

  8. mysql利用存储过程批量插入数据

    最近需要测试一下mysql单表数据达到1000W条以上时增删改查的性能.由于没有现成的数据,因此自己构造,本文只是实例,以及简单的介绍. 首先当然是建表: [sql]view plaincopy CR ...

  9. 批量生成sqlldr文件,高速卸载数据

    SQL*Loader 是用于将外部数据进行批量高速加载的数据库的最高效工具,可用于将多种平面格式文件加载到Oracle数据库.SQL*Loader支持传统路径模式以及直接路径这两种加载模式.关于SQL ...

  10. 安卓 Pickers(选择器)

    概述 安卓提供了现成的对话框,让用户选择一个时间或日期.每一个选择器控制时间(小时,分钟,AM/PM)或日期(月,日,年)的每一部分的选择.使用这些选择器帮助 确保用户正确的,格式化的,和适合的选择一 ...