【线段树】Atlantis
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 23181 | Accepted: 8644 |
Description
Input
The input file is terminated by a line containing a single 0. Don't process it.
Output
Output a blank line after each test case.
Sample Input
2
10 10 20 20
15 15 25 25.5
0
Sample Output
Test case #1
Total explored area: 180.00
Source



#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std; inline int read(){
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int MAXN=100001;
const int INF=999999;
int N,M;
double a[100001],b[100001];
int A[100001];
struct data2{
double sum,len;
int ct;
}tr[1000001];
int tmp,tmp2;
struct data{
double x,y1,y2;
bool end;
}poi[1000001];
int T; bool cmp(data a,data b){
return a.x<b.x;
}
void build(int l,int r,int rt){
tr[rt].ct=0;tr[rt].sum=0;
tr[rt].len=a[r]-a[l];
if(l+1>=r) return ;
int mid=(l+r)>>1;
build(l,mid,rt*2);
build(mid,r,rt*2+1);
return ;
}
void Update(int rt,int l,int r){
if(tr[rt].ct) tr[rt].sum=tr[rt].len;
else if(r-l>1) tr[rt].sum=tr[rt*2].sum+tr[rt*2+1].sum;
else tr[rt].sum=0;
return ;
}
void add(int l,int r,int rt,int L,int R){
if(L==l&&R==r){
tr[rt].ct++;
Update(rt,l,r);
return ;
}
int mid=(l+r)>>1;
if(L>=mid) add(mid,r,rt*2+1,L,R);
else if(R<=mid) add(l,mid,rt*2,L,R);
else{
add(mid,r,rt*2+1,mid,R);
add(l,mid,rt*2,L,mid);
}
Update(rt,l,r);
return;
}
void del(int l,int r,int rt,int L,int R){
if(L==l&&R==r){
tr[rt].ct--;
Update(rt,l,r);
return ;
}
int mid=(l+r)>>1;
if(L>=mid) del(mid,r,rt*2+1,L,R);
else if(R<=mid) del(l,mid,rt*2,L,R);
else{
del(mid,r,rt*2+1,mid,R);
del(l,mid,rt*2,L,mid);
}
Update(rt,l,r);
return;
} double ans;
int main(){
while(1){
N=read();
if(!N) break;
tmp2=tmp=0;double x1,x2,y1,y2;
for(int i=1;i<=N;i++){
cin>>x1>>y1>>x2>>y2;
poi[++tmp].x=x1;
poi[tmp].y1=y1;
poi[tmp].y2=y2;
poi[tmp].end=false;
poi[++tmp].x=x2;
poi[tmp].y1=y1;
poi[tmp].y2=y2;
poi[tmp].end=true;
}
for(int i=1;i<=tmp;i+=2){
a[tmp2]=b[tmp2]=poi[i].y1;tmp2++;
a[tmp2]=b[tmp2]=poi[i].y2;tmp2++;
}
sort(poi+1,poi+tmp+1,cmp);
sort(a,a+tmp2);
int tmp3=0,tmp4=0;
tmp3=unique(a,a+tmp2)-a;
ans=0;
build(0,tmp3-1,1);
double lasth;
for(int i=1;i<tmp;i++){
if(!poi[i].end) add(0,tmp3-1,1,lower_bound(a,a+tmp3,poi[i].y1)-a,lower_bound(a,a+tmp3,poi[i].y2)-a);
else del(0,tmp3-1,1,lower_bound(a,a+tmp3,poi[i].y1)-a,lower_bound(a,a+tmp3,poi[i].y2)-a);
ans+=(double)((poi[i+1].x-poi[i].x)*tr[1].sum);
}
printf("Test case #%d\nTotal explored area: %.2f\n\n",++T,ans);
}
}
【线段树】Atlantis的更多相关文章
- 线段树---Atlantis
题目网址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110064#problem/A Description There are se ...
- hdu 1542 Atlantis(线段树,扫描线)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- POJ 1542 Atlantis(线段树 面积 并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 参考网址:http://blog.csdn.net/sunmenggmail/article/d ...
- 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)
[题目] Atlantis Problem Description There are several ancient Greek texts that contain descriptions of ...
- 【POJ1151】Atlantis(线段树,扫描线)
[POJ1151]Atlantis(线段树,扫描线) 题面 Vjudge 题解 学一学扫描线 其实很简单啦 这道题目要求的就是若干矩形的面积和 把扫描线平行于某个轴扫过去(我选的平行\(y\)轴扫) ...
- hdu1542 Atlantis 线段树--扫描线求面积并
There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some ...
- HDU 1542 Atlantis(线段树面积并)
描述 There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. S ...
- hdu1542 Atlantis (线段树+扫描线+离散化)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1542 - Atlantis - [线段树+扫描线]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
随机推荐
- SSH ERROR: Too many Authentication Failures
来自: How to recover from "Too many Authentication Failures for user root" 其中一种可以解决的方式 eval ...
- POJ 2533 Longest Ordered Subsequence LIS O(n*log(n))
题目链接 最长上升子序列O(n*log(n))的做法,只能用于求长度不能求序列. #include <iostream> #include <algorithm> using ...
- Desert King(POJ2728+最优比率生成树+二分)
题目链接:http://poj.org/problem?id=2728 题目: 题意:求一颗生成树,使得费用与距离的比值最小,其中距离等于两点之间的平面欧拉距离,费用为z坐标之差. 思路: 由上图我们 ...
- Zen Cart、Joy-Cart、Magento、ShopEX、ECshop电子商务系统比较
1.Zen Cart 优点:历史较久,系统经过长时间充分的测试,比较成熟:免费开源便于功能二次开发:基础功能强大:安装插件简单,修改文件很少,甚至不用修改文件:应用非常广泛,插件.模块更新快,其中多为 ...
- [IOS]vmxsmc.exe已停止工作 VMware11 Unlocker for Mac OSX无法使用的解决办法.
今天我帮同事安装VMware workstation12后发现之前的unlocker已经无法进行解锁了(就是VMware新建虚拟机无App Mac选项) 使用unlocker会出现vmsxmc.exe ...
- css3动画总结
- selenium在爬虫领域的初涉(自动打开网站爬取信息)
selenium简介 Selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.这个工具的主要功能包括:测试与浏览器的兼容性--测试你的应 ...
- perl中设置POST登录时的重定向
默认地, perl提交post登录时是不会重定向的 要让它重定向, 可以用如下方法: my $cookie = HTTP::Cookies->new(); push @{$ua->requ ...
- centos_7.1.1503_src_1
http://vault.centos.org/7.1.1503/os/Source/SPackages/ 389-ds-base-1.3.3.1-13.el7.src.rpm 31-Mar-2015 ...
- 2017多校第7场 HDU 6129 Just do it 找规律
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6129 题意:求a序列后m次xor前缀和 解法: 手动对1位置对每个位置的贡献打表发现 第一次 贡献为 ...