Rain in ACStar

Time Limit: 1 Sec  Memory Limit: 256 MB

题目连接

http://acm.hust.edu.cn/problem/show/1385

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.

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

HINT

题意

下凸包雨,每次会下3-6个点组成的凸包雨

然后查询l-r区间的凸包面积和

题解:

直接把凸包变成矩形面积求和就好了,我们对于大于上一个点的x轴的点记为正面积,对于小于的记为负面积

然后随便搞一搞就好了

代码:

//qscqesze
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define maxn 100001
#define mod 10007
#define eps 1e-9
//const int inf=0x7fffffff; //无限大
const int inf=0x3f3f3f3f;
/*
inline ll read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int buf[10];
inline void write(int i) {
int p = 0;if(i == 0) p++;
else while(i) {buf[p++] = i % 10;i /= 10;}
for(int j = p-1; j >=0; j--) putchar('0' + buf[j]);
printf("\n");
}
*/
//************************************************************************************** struct node
{
int x[],y[],z,n;
};
node op[maxn];
vector<int> po;
char str[];
int t,n,k;
map<int,int> H;
struct tree
{
int l,r,len;
double add1,add2,step,sum;
void init() { add1=add2=step=sum=; }
void fun(double a,double b,double c)
{
add1+=a; add2+=b; step+=c;
sum+=(a+b)*len/;
}
};
tree tree[maxn*]; double calu(int st,int ed,double add1,double step)
{
int len=po[ed]-po[st];
return add1+len*step;
}
void PushUp(int ind)
{
tree[ind].sum=tree[ind<<].sum+tree[ind<<|].sum;
}
void PushDown(int ind)
{
double add1=tree[ind].add1,add2=tree[ind].add2,step=tree[ind].step;
double tmp=calu(tree[ind].l,(tree[ind].l+tree[ind].r)/,add1,step);
tree[ind<<].fun(add1,tmp,step);
tree[ind<<|].fun(tmp,add2,step);
tree[ind].add1=tree[ind].add2=tree[ind].step=;
}
void build(int lft,int rht,int ind)
{
tree[ind].l=lft; tree[ind].r=rht;
tree[ind].init(); tree[ind].len=po[rht]-po[lft];
if(lft+!=rht)
{
int mid=tree[ind].l+tree[ind].r>>;
build(lft,mid,ind<<);
build(mid,rht,ind<<|);
}
}
void updata(int st,int ed,int ind,double add1,double add2,double step)
{
int lft=tree[ind].l,rht=tree[ind].r;
if(st<=lft&&rht<=ed) tree[ind].fun(add1,add2,step);
else
{
PushDown(ind);
int mid=tree[ind].l+tree[ind].r>>;
if(ed<=mid) updata(st,ed,ind<<,add1,add2,step);
else if(st>=mid) updata(st,ed,ind<<|,add1,add2,step);
else
{
double tmp=calu(st,mid,add1,step);
updata(st,mid,ind<<,add1,tmp,step);
updata(mid,ed,ind<<|,tmp,add2,step);
}
PushUp(ind);
}
}
double query(int st,int ed,int ind)
{
int lft=tree[ind].l,rht=tree[ind].r;
if(st<=lft&&rht<=ed) return tree[ind].sum;
else
{
PushDown(ind);
int mid=tree[ind].l+tree[ind].r>>;
double sum=;
if(st<mid) sum+=query(st,ed,ind<<);
if(ed>mid) sum+=query(st,ed,ind<<|);
PushUp(ind);
return sum;
}
}
void init()
{
memset(tree,,sizeof(tree));
po.clear();
memset(op,,sizeof(op));
H.clear();
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%s",str);
if(str[]=='R')
{
op[i].z=;
scanf("%d",&op[i].n);
for(int j=;j<op[i].n;j++)
{
scanf("%d%d",&op[i].x[j],&op[i].y[j]);
po.push_back(op[i].x[j]);
}
}
else
{
op[i].z=;
scanf("%d%d",&op[i].x[],&op[i].y[]);
po.push_back(op[i].x[]);
po.push_back(op[i].y[]);
}
}
sort(po.begin(),po.end());
po.erase(unique(po.begin(),po.end()),po.end());
for(int i=;i<po.size();i++)
H[po[i]]=i;
}
void solve()
{
for(int i=;i<n;i++)
{
int x1,y1,x2,y2;
if(op[i].z==)
{
for(int j=;j<op[i].n;j++)
{
x1=op[i].x[j];
y1=op[i].y[j];
x2=op[i].x[(j+)%op[i].n];
y2=op[i].y[(j+)%op[i].n];
if(x1>x2)
swap(x1,x2),swap(y1,y2);
else
y1=-y1,y2=-y2;
double step=(y1*1.0-y2*1.0)/(x1*1.0-x2*1.0);
updata(H[x1],H[x2],,y1,y2,step);
}
}
else
{
x1=op[i].x[],y1=op[i].y[];
printf("%.3lf\n",query(H[x1],H[y1],));
}
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
init();
build(,po.size()-,);
solve();
}
}

hdu 3340 Rain in ACStar 线段树区间等差数列更新的更多相关文章

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

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

  2. HDU.1556 Color the ball (线段树 区间更新 单点查询)

    HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...

  3. HDU.1689 Just a Hook (线段树 区间替换 区间总和)

    HDU.1689 Just a Hook (线段树 区间替换 区间总和) 题意分析 一开始叶子节点均为1,操作为将[L,R]区间全部替换成C,求总区间[1,N]和 线段树维护区间和 . 建树的时候初始 ...

  4. hdu 5475 An easy problem(暴力 || 线段树区间单点更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=5475 An easy problem Time Limit: 8000/5000 MS (Java/Others ...

  5. HDU 1698 Just a Hook(线段树 区间替换)

    Just a Hook [题目链接]Just a Hook [题目类型]线段树 区间替换 &题解: 线段树 区间替换 和区间求和 模板题 只不过不需要查询 题里只问了全部区间的和,所以seg[ ...

  6. HDU 1556 Color the ball(线段树区间更新)

    Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...

  7. (简单) HDU 1698 Just a Hook , 线段树+区间更新。

    Description: In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of ...

  8. HDU 1698 Just a Hook(线段树区间更新查询)

    描述 In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes ...

  9. hdu 1556 Color the ball(线段树区间维护+单点求值)

    传送门:Color the ball Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/3276 ...

随机推荐

  1. 3-Python内置结构-列表

    目录 1 Python内置数据结构 1.1 数值型 1.2 math模块 1.3 round圆整 1.4 常用的其他函数 1.5 类型判断 2 列表 2.1 索引访问 2.2 列表和链表的区别 2.3 ...

  2. Python3 断言

    #!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author:CarsonLi ''' 断言一般用于后面有非常重要的操作,需要使用前面的数据,而且不容许出 ...

  3. [001] leap_stage

    [Description] There is a number in each stages that indicates the most stages you can leap up. Now, ...

  4. 分布式队列Celery入门

    Celery 是一个简单.灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具.它是一个专注于实时处理的任务队列,同时也支持任务调度.Celery 是语言无关的,虽然它是用 Py ...

  5. 安装Https证书

    安装证书 IIS 6 支持PFX格式证书,下载包中包含PFX格式证书和密码文件.以沃通证书为例: 文件说明: 1. 证书文件214083006430955.pem,包含两段内容,请不要删除任何一段内容 ...

  6. yum和head一起用,报错“由于管道被破坏而退出”

    当要打印 [yum list ]时, 加上了管道符 以及 head 会出现报错 “由于管道被破坏而退出” 是因为 yum 与 head 连用 存在bug ,如果使用tail 则没有出现 具体什么bug ...

  7. 设计模式(一)工厂模式Factory(创建型)(转)

    原文链接:http://blog.csdn.net/hguisu/article/details/7505909 设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符 ...

  8. 当array_filter函数的callback留空时 他会过滤掉所有键值为false的键

    当array_filter函数的callback留空时 他会过滤掉所有键值为false的键

  9. Django的自带认证系统——auth模块

    Django自带的用户认证 auth模块 from django.contrib import auth 备注:使用auth模块时,我们默认使用Django提供的auth_user表,创建数据时,可以 ...

  10. IEEEXtreme 10.0 - Goldbach's Second Conjecture

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Goldbach's Second Conjecture 题目来源 第10届IEEE极限编程大赛 https ...