hdu3340 线段树+多边形
Rain in ACStar
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 788 Accepted Submission(s): 218
This is one of the ten biggest secrets of this world! And it is time to expose the truth!
Yes, Super Cow AC is from ACStar which is ten million light-year away from our earth. No one, even AC himself, knows how AC came to our home. The only memory in his head is the strange rain in ACStar.
Because of the special gravity of ACStar, the raindrops in ACStar have many funny features. They have arbitrary sizes, color and tastes. The most interesting parts of the raindrops are their shapes. When AC was very young, he found that all the drops he saw
in air were convex hull. Once the raindrops fell to the ground, they would be absorb by the soil.

This year is set to be AC-year. In recognition of Great General AC's contribution to our empire, the Emperor decided to build a huge AC park. Inside this park there is a laboratory to simulate the rain in ACStar. As a researcher of this lab, you are appointed
to measure the volume of rain absorbed by soil. To simplify this problem, scientists put the rain into two-dimensional plane in which the ground is represented as a straight line and the raindrops are convex polygon. So the area of the graphics stands for
the volume of raindrops.
You will receive two types of instructions:
1.R P (This type of instructions tell you sufficient information about the raindrops.)
2.Q A B (Ask you to report the volume of rain absorbed by soil of [A,B].)
Instructions are given in chronological order.
After T, the inputs will be each test case. The first line of each case will be N(no more than 25000), representing for the numbers of instructions. The following N lines will give instructions of the two types.
For each instruction of type 1, it will be followed by a line listing P (at least 3 and at most 5) points representing the convex polygon of the coming raindrop. The points are started by the leftmost point and are given in counterclockwise order. It's guaranteed
that no points of the same raindrop are in the same vertical line.
All numbers are positive integer no more than 1000000000.
It is guaranteed that the result is less than 1e8.
7
Q 1 100
R 4
10 10 11 10 13 11 12 11
Q 10 11
Q 1 100
R 3
100 20 120 20 110 30
Q 1 100
Q 12 120
0.250
1.000
1.000
100.250
/*
hdu3340 线段树+多边形
R x:表示在这有个x边形
Q l r:查询在[l,r]之间的多边形的面积 所以考虑用线段树解决,那么我们就要知道如何处理区间的面积,对于一个多边形,
它的每一条边都可以在两端作垂直于x轴的垂线然后形成一个梯形,于是用图形
上半部分的边形成的梯形和- 半部分的边形成的梯形和便能得到多边形面积。
而且两个同高的梯形的面积和等同于上底和下底的叠加 hhh-2016-03-02 20:54:04 Accepted
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
typedef long double ld;
const int maxn = 500200;
map<int,int>has;
vector<int> tp;
char op[10]; struct node
{
int l,r;
int mid()
{
return l+(r-l)/2;
}
double h1,h2,k,len;
double area;
} tree[maxn]; void push_up(int r)
{
tree[r].area = tree[r<<1].area+tree[r<<1|1].area;
} void build(int i,int l,int r)
{
tree[i].l = l,tree[i].r = r;
tree[i].h1 = tree[i].h2 = tree[i].k = tree[i].area = 0;
tree[i].len = tp[r]-tp[l];
if(l == r) return;
if(l+1 != r)
{
build(i<<1,l,tree[i].mid());
build(i<<1|1,tree[i].mid(),r);
push_up(i);
}
} void push_down(int i)
{
int lson = i<<1,rson =i<<1|1;
double h1=tree[i].h1,h2=tree[i].h2,k=tree[i].k;
double md = (tp[tree[i].mid()]-tp[tree[i].l])*k+h1; tree[lson].h1+=h1,tree[lson].h2+=md,tree[lson].k+=k;
tree[lson].area += (h1+md)*tree[lson].len/2; tree[rson].h1+=md,tree[rson].h2+=h2,tree[rson].k+=k;
tree[rson].area += (md+h2)*tree[rson].len/2; tree[i].h1 = tree[i].h2 = tree[i].k = 0;
} void update(int i,int l,int r,double h1,double h2,double k)
{
if(tree[i].l >= l && tree[i].r <= r)
{
tree[i].h1+=h1,tree[i].h2+=h2,tree[i].k+=k;
tree[i].area += (h1+h2)*tree[i].len/2;
return ;
}
push_down(i);
double md= (tp[tree[i].mid()]-tp[l])*k+h1;
if(r <= tree[i].mid())
update(i<<1,l,r,h1,h2,k);
else if(l >= tree[i].mid())
update(i<<1|1,l,r,h1,h2,k);
else
{
update(i<<1,l,tree[i].mid(),h1,md,k);
update(i<<1|1,tree[i].mid(),r,md,h2,k);
}
push_up(i);
} double query(int i,int l,int r)
{
if(tree[i].l >= l && tree[i].r <= r)
{
return tree[i].area;
}
push_down(i);
double ans = 0;
if(l < tree[i].mid())
ans += query(i<<1,l,r);
if(tree[i].mid() < r)
ans += query(i<<1|1,l,r);
push_up(i);
return ans;
} struct point
{
int x[6],y[6];
int num;
void get()
{
num = 0;
scanf("%s",op);
if(op[0] == 'R')
{
scanf("%d",&num);
for(int i = 0; i < num; i++)
{
scanf("%d%d",&x[i],&y[i]);
tp.push_back(x[i]);
}
}
else
{
scanf("%d%d",&x[1],&y[1]);
tp.push_back(x[1]);
tp.push_back(y[1]);
}
}
} Point[50010]; int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
tp.clear(),has.clear();
scanf("%d",&n);
for(int i =1;i <= n;i++)
{
Point[i].get();
} sort(tp.begin(),tp.end());
tp.erase(unique(tp.begin(),tp.end()),tp.end());
for(int i = 0;i < (int)tp.size();i++)
has[tp[i]] = i;
build(1,0,tp.size()-1);
for(int i =1;i <= n;i++)
{
if(Point[i].num)
{
for(int j = 0;j < Point[i].num;j++)
{
int num = Point[i].num;
int x1=Point[i].x[j],y1=Point[i].y[j];
int x2=Point[i].x[(j+1)%num],y2=Point[i].y[(j+1)%num];
if(x1 > x2)swap(x1,x2),swap(y1,y2);
else y1=-y1,y2=-y2;
double k = (1.0*y1-1.0*y2)/(1.0*x1-1.0*x2);
update(1,has[x1],has[x2],y1,y2,k);
// printf("%.3f\n",query(1,has[1],has[100]));
}
}
else
{
int x = Point[i].x[1];
int y = Point[i].y[1];
printf("%.3f\n",query(1,has[x],has[y]));
}
}
}
return 0;
}
hdu3340 线段树+多边形的更多相关文章
- 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)
转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...
- [转载]完全版线段树 by notonlysuccess大牛
原文出处:http://www.notonlysuccess.com/ (好像现在这个博客已经挂掉了,在网上找到的全部都是转载) 今天在清北学堂听课,听到了一些很令人吃惊的消息.至于这消息具体是啥,等 ...
- 【转】线段树完全版~by NotOnlySuccess
线段树完全版 ~by NotOnlySuccess 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉 ...
- [IOI2018]排座位——线段树
题目链接: IOI2018seat 题目大意:给出一个$H*W$的矩阵,将$0 \sim W*H-1$分别填入矩阵的格子里(每个格子里一个数),定义一个子矩阵是美妙的当且仅当这个子矩阵包含且仅包含$0 ...
- HDU 1542 - Atlantis - [线段树+扫描线]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- 《完全版线段树》——notonlysuccess
转载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文 ...
- 【转】 线段树完全版 ~by NotOnlySuccess
载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章 ...
- 【转载】完全版线段树 by notonlysuccess大牛
原文出处:http://www.notonlysuccess.com/ 今晚上比赛就考到了 排兵布阵啊,难受. [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时 ...
- HDU 3340 Rain in ACStar(线段树+几何)
HDU 3340 Rain in ACStar pid=3340" target="_blank" style="">题目链接 题意:给定几个多 ...
随机推荐
- Beta冲刺Day3
项目进展 李明皇 今天解决的进度 完善了程序的运行逻辑(消息提示框等) 明天安排 前后端联动调试 林翔 今天解决的进度 向微信官方申请登录验证session以维护登录态 明天安排 继续完成维护登录态 ...
- 《高级软件测试》11.15.全组完成jira安装,开始任务的部分书写
今日任务完成情况如下: 小段:完成linux环境上jira的安装,并将jira的安装过程录制下来 小费:完成linux环境下jira的安装,开始部分任务的书写 小高:完成了jira的安装,并进一步熟悉 ...
- service层报错找不到方法Invalid bound statement (not found)
报错信息如下 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.imooc.se ...
- JAVA_SE基础——47.接口
如果一个抽象类中的所有方法都是抽象的,则可以将这个类用另一种方法来定义,即接口~ 在定义接口时,需要用interface关键字来声明,具体实例如code1 接口的定义格式:interface 接口名{ ...
- 自动化服务部署(二):Linux下安装jenkins
jenkins是一个Java开发的开源持续集成工具,广泛用于项目开发,具有自动化构建.测试和部署等功能,它的运行需要Java环境. 上篇博客介绍了Linux下安装JDK的步骤,这篇博客,介绍下Linu ...
- OAuth2.0学习(1-6)授权方式3-密码模式(Resource Owner Password Credentials Grant)
授权方式3-密码模式(Resource Owner Password Credentials Grant) 密码模式(Resource Owner Password Credentials Grant ...
- Python/ selectors模块及队列
Python/selectors模块及队列 selectors模块是可以实现IO多路复用机制: 它具有根据平台选出最佳的IO多路机制,比如在win的系统上他默认的是select模式而在linux上它默 ...
- POJ-2632 Crashing Robots模拟
题目链接: https://vjudge.net/problem/POJ-2632 题目大意: 在一个a×b的仓库里有n个机器人,编号为1到n.现在给出每一个机器人的坐标和它所面朝的方向,以及m条指令 ...
- 解决:My97DatePicker 日期插件引用在PHP文件中maxDate和minDate控制失效问题
开发环境: 语言:PHP 框架:ThinkPHP 问题:在引用插件My97DatePicker时,想实现:开始日期不能大于结束日期,结束时间不能小于开始时间 步骤一.查看文档官方文档http://ww ...
- Java知识体系纲要
最近一段时间,把Java主要涉及到的大概念都大致学习了一遍,为了让自己能够更好地形成对Java知识体系的整体把握,先把学过的知识点添加到自己画的思维导图上. 整个Java知识体系的划分,我自己主要将它 ...