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

Problem Description
Maybe you have heard of Super Cow AC who is the great general of ACM Empire. However, do you know where he is from?
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.
 
Input
The first line of the inputs is T(no more than 10), which stands for the number of test cases you need to solve. 
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.
 
Output
For each instruction of type 2, output the corresponding result, which should be printed accurately rounded to three decimals.
It is guaranteed that the result is less than 1e8.
 
Sample Input
1
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
 
Sample Output
0.000
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 线段树+多边形的更多相关文章

  1. 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)

    转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...

  2. [转载]完全版线段树 by notonlysuccess大牛

    原文出处:http://www.notonlysuccess.com/ (好像现在这个博客已经挂掉了,在网上找到的全部都是转载) 今天在清北学堂听课,听到了一些很令人吃惊的消息.至于这消息具体是啥,等 ...

  3. 【转】线段树完全版~by NotOnlySuccess

    线段树完全版  ~by NotOnlySuccess 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉 ...

  4. [IOI2018]排座位——线段树

    题目链接: IOI2018seat 题目大意:给出一个$H*W$的矩阵,将$0 \sim W*H-1$分别填入矩阵的格子里(每个格子里一个数),定义一个子矩阵是美妙的当且仅当这个子矩阵包含且仅包含$0 ...

  5. HDU 1542 - Atlantis - [线段树+扫描线]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  6. 《完全版线段树》——notonlysuccess

    转载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文 ...

  7. 【转】 线段树完全版 ~by NotOnlySuccess

    载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章 ...

  8. 【转载】完全版线段树 by notonlysuccess大牛

    原文出处:http://www.notonlysuccess.com/ 今晚上比赛就考到了 排兵布阵啊,难受. [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时 ...

  9. HDU 3340 Rain in ACStar(线段树+几何)

    HDU 3340 Rain in ACStar pid=3340" target="_blank" style="">题目链接 题意:给定几个多 ...

随机推荐

  1. python控制流 If-else

        控制流 If-else 我们处理现实生活中的问题时会做出决定,就像决定买哪种相机或者怎样更好的打篮球.同样我们写计算机程序的时候也要做相同的事情.我们通过 if-else 语句来做决定,我们使 ...

  2. ES6常用新特性

    https://segmentfault.com/a/1190000011976770?share_user=1030000010776722 该文章为转载文章!仅个人喜好收藏文章! 1.前言 前几天 ...

  3. django models的点查询/跨表查询/双下划线查询

    django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...

  4. Python内置函数(43)——type

    英文文档: class type(object) class type(name, bases, dict) With one argument, return the type of an obje ...

  5. split 过滤空的元素

    命令形式: split(str='',number=string.count(str))[n] str 分隔符 number 切分几次,[n] 获取第几个值. 1.如果切分的可迭代对象中包含空元素的解 ...

  6. Easyui Datagrid 修改显示行号列宽度

    EasyUI中Datagrid的第一列显示行号,可是如果数据量大的的时候,显示行号的那一列数据会显示不完全的. 可以通过修改Datagrid的样式来解决这个问题,在样式中加入下面这个样式,就可以自己修 ...

  7. Mac 中配置Apache

    使用的mac版本是10.10.1,mac自带的Apache环境 分为两部分: 1.启动Apache 2.设置虚拟主机 启动Apache 打开终端, >>sudo apachectl -v, ...

  8. VirtualBox的共享文件夹功能的使用演示

    演示环境 虚拟机 Oracle VM VirtualBox 宿主机 Windows 客户机 Linux 以下图片演示中使用的Linux客户机为CentOS.对于Debian系统的客户机,主要在安装增强 ...

  9. IT技术有感

    今天看技术文章,spring相关的,某一个点以前每次看一直不理解, 可是不知道为什么隔了1年左右,中间什么都没做,现在却都懂了. 在看懂的那一刻,笼罩在我心上的躁动突然平静了许多,我的心这一年来前所未 ...

  10. Django Form组件 学生管理系统

    from django.db import models # Create your models here. class Classes(models.Model): title=models.Ch ...