hdu3340 线段树+多边形

跟着团子学SAP EPPM:项目管理常见的集成场景(PPM\PS\MS Project) 在SAP的EPPM解决方案中,针对企业战略级别的投资组合管理首先是定义合适的投资组合的层级结构,在投资组合下可以通过不同维度去定义投资篮(Portofolio Bucket)进行层层拆分,在最下层级的投资篮下可以分配明细的投资项(Portofolio Item),投资项可以是独立的一个一个具体执行的项目,也可以是单纯的一次服务等等。 今天主要聚焦在投资项的维度展开讲一下在SAP中投资项常见的几种集成模式: 集成场景1:使用PPM中的Project Management进行项目管理 第一个场景是在创建投资项 阅读详情

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;
}


【行为决策模块项目实战】解耦控制--多控制器管理与切换的方法(附C++代码) [请添加图片描述](https://img-blog.csdnimg.cn/c11300d9e4fe421e9070f474a468d1db.jpeg)本文先对多控制器管理与切换的方法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容VERTICAL_VEL, //垂直速度PID控制器VERTICAL_POS, //垂直位置PID控制器HORIZONTAL, //水平速度PID控制器YAW, //航向角yaw位置逻辑控制器。 阅读详情

相关推荐

别再自己写组件了!用uni-app的midButton属性5分钟搞定中间凸起TabBar(H5/小程序通用)

本文详细介绍了uni-app官方提供的midButton属性,帮助开发者5分钟内实现中间凸起的TabBar效果,无需编写繁琐的自定义组件代码。该方案兼容H5和微信小程序平台,配置简单且维护成本低,大幅提升开发效率和性能表现。

weixin_30431445的博客 347

hdu3340(线段树+几何)

给定N个多边形,然后每次查询一段坐标内图形的面积。 我们可以将多边形拆解为多个梯形,转化为每一次在一个区间加一个等差数列,注意这个等差数列是实数的,其实就是一个区间加一个梯形面积,而梯形面积我们只需要知道左右端点的高就好,这样打标记,累加左右的高,是可以维护的。 这里线段树是要离散化的,所以下传标记找mid高度时,要注意不是线段树区间的中点,而是实际区间的中点, #inclu

running_in_dark的博客 615

Unity中基于SkinMeshRenderer的骨骼动画换装系统优化实践

本文深入探讨了Unity中基于SkinnedMeshRenderer的骨骼动画换装系统优化实践。针对换装卡顿、显示错误等常见问题,文章剖析了SkinnedMeshRenderer的核心数据原理,对比了“数据替换”与“实体替换”两种主流方案的性能差异,并详细阐述了通过骨骼字典缓存、对象池管理、材质合并与Draw Call优化等实战技巧,构建高性能、高稳定性的生产级换装系统。

weixin_29008055的博客 314

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

HDU 3340 Rain in ACStar 题目链接 题意:给定几个多边形(3-5边形),然后中间有一些询问,询问一个区间的总面积 思路:多边形分割为梯形,梯形的面积为上底d1 + 下底d2 乘上 高度 / 2,两个梯形面积累加的话,可以等价为上底下底累加,所以就可以用线段树搞了,然后给定的多边形点是按顺序的,可以利用容斥去方便把一个询问拆分成几个询问 代码: #

Remilia's 1251

LayaBox CommandBuffer描边使用详细

项目需要使用LayaBox做一个给3D物体动态描边的一个功能,前前后后踩了一些坑算是把这个东西给做出来了把我改好的代码贴上,分享给大家。 (1)想要使用描边你的引擎版本必须 >=2.9.0 (2)你必须下载 Laya官方的BlurShader库才能使用这个功能,下载地址:https://github.com/layabox/layaair-demo/tree/master/h5/3d/ts/LayaAir3D_PostProcess/BlurShader 下载完之后把BlurShader放到自己项目的

小智队长 1733

Python+gensim【中文LDA】简洁模型

文章目录完整代码过程详解words_lsdictionarydictionary.doc2bow函数corpuslda 完整代码 from gensim import corpora, models import jieba.posseg as jp # 待分析文本集 text1 = '美国教练坦言,没输给中国女排,是输给了郎平' text2 = '中国女排世界排名第一?真实水平如何,听听巴西和美...

ArYe 2万+

HDU 3340 Rain in ACStar

HDU_3340     这个题目要查询一个区间内的面积和,很容易联想到用线段树去做,但关键的问题在于由于有添加一个多边形的操作,那么我们如何下传标记去修改一个区间的面积和?     由于涉及到下传标记就涉及到标记叠加,因此我们要设法把面积的增量转化成用可以叠加的标记进行计算的形式。     在计算几何求面积的时候有一种方法是转换成梯形的有向面积累加计算,而梯形的面积主要取决于两个底和高的长...

weixin_33699914的博客 169

MNI152 坐标空间和 fsaverage 坐标空间相互转换, 如已知fsaverage空间的坐标如何求MNI152 坐标?aparc.a2009s.annot转化到MNI152空间?

大多数神经影像学研究的结果是在体积(例如,MNI152)或表面(例如,fsaverage)坐标系中报告的。体积坐标系和表面坐标系之间的准确映射可以促进许多应用,例如将 fMRI 组分析从 MNI152 投影到 fsaverage 以进行可视化或从 fsaverage 投影静息状态 fMRI 分区对 MNI152进行新数据的体积分析。Wu et al., 2018 评估了三种在 MNI152通过模拟上述应用的 Colin27 和 fsaverage 坐标系:将组平均数据从 MNI152/Colin27 投影到

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 2966

hdu3340 线段树之多边形分解

思路很重要啊,一开始看了之后,完全不知道要维护什么,看了网上的思路,咋就没想到呢。。。 将多边形分解成梯形,每次维护当前区间面积,向下传递的梯形上下底(相似三角形)。 ACcode: #include #include #include #include #define eps 1e-4 using std::sort; using std::swap; const int nsi

丿Smilē 丶晨星灬 888

【深度学习总结_02】在自己的数据集微调SAM

使用医疗影像数据微调SAM

qq_41234663的博客 1万+

PCL 欧式聚类分割【2026最新版】

PCL中欧式聚类提取算法原理详解、代码实现以及一个大自然场景地物分割提取并保存分割结果到本地文件夹的应用案例。

点云侠的博客 40万+

hdu 3340 Rain in ACStar

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3340 题目大意:天下会掉下一些图形(三边形,四边形,五边形)在数轴上,求数轴上某一段区间落下的图形的面积和. 思路: 换了一种新写法,把初始化和算法部分分别写成init()函数和sof()函数,为什么要这样写呢?因为查错的时候相对会比较方便,也能相对提高代码的可读性.ok! 进入正题.

Go.To.AC的专栏 1182

基于激光雷达与视觉融合的四旋翼无人机室内避障方法研究

本文研究了一种基于激光雷达与视觉融合的四旋翼无人机室内避障方法。针对单一传感器在室内环境中的局限性,提出通过激光雷达提供精确几何距离、视觉相机补充语义信息的融合方案。研究内容包括:搭建ROS硬件平台集成单目相机与2D激光雷达;设计基于扩展卡尔曼滤波的传感器融合模型;改进VFH算法结合视觉深度图进行路径规划。实验验证表明,该方法在复杂室内环境下具有较高的鲁棒性、实时性与避障成功率,为解决无GPS信号环境下的无人机自主导航问题提供了有效方案。

huanghm88的专栏 347

hdu 3340 Rain in ACStar(线段树+几何)

题目链接:hdu 3340 Rain in ACStar 题目大意:给定N个多边形,然后每次查询一段坐标内图形的面积。 解题思路:很棒的一题,结合了几何的知识和线段树维护等差数列。 这篇题解写的很详细连接 #include #include #include #include #include #include using namespace std; const

不慌不忙、不急不躁 886

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

hdu 3340 线段树思路活用

开始看到这道题目的时候,神题啊。。 想了一个下午,没思路。。。 后面到网上一看这位大哥的解说,豁然开朗http://blog.youkuaiyun.com/gotoac/article/details/7588254 每个区间分割多边形是可能是三角形或者梯形或者四边形,都是上底+下底乘高除2,这个小学就会的东西,看来现在还是不能够活用的啊。。。。 View Code 1 #inc...

Andy20141210的博客 114

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

intersect 相交 范围_dtIntersectSegmentPoly2D 2D上的线段与多边形相交计算 产生结果:是否相交,线段跨越的开始和结束百分比,相交的边...

dtIntersectSegmentPoly2D(startPos, endPos, verts, nv, tmin, tmax, segMin, segMax):perp product也就是2D外积inline float dtVperp2D(const float* u, const float* v){return u[2]*v[0] - u[0]*v[2];}所有的都是映射到xz平面上进...

weixin_29671351的博客 576

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【Rain in ACStar HDU-3340】

·你正从AC星球返回,天又下起凸包雨,只好到线段树下躲雨。 ·英文题,述大意: 一个竖直平面的美丽天空,会下凸包雨。凸包雨指的是边数为3~6的多边形,并且每一个它都遵守一个神奇定律,那就是自己不会有两个横坐标相同的点(即每个凸包自己的顶点不会出现在一条垂直于x轴的直线上)。现在有Q个操作:第一种是放置一个凸包雨(即输入其边数,并从其横坐标最小点开始顺时针读入顶点坐标[x,y...

weixin_30851867的博客 105

hdu 3340 Rain in ACStar 线段树区间等差数列更新

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 w...

weixin_33834679的博客 210

hdu 3340 Rain in ACStar(成段更新)

题意:有T组测试数据,每组数据有N个操作,(1)“R P”,表示掉下了一个P边形,接下来的一行里,给出这P个点的坐标——首先是最左边的点,然后从这点开始逆时针给出其他点。(2)"Q A B“,查询数轴上区间[A,B]内面积的和。         易知,图1里的那个三角形的面积是通过,图2里红色的面积加上图3里绿色的面积,然后减去图4里黄色的面积。         这些图形都可以转化成梯

2164

HDU 3340 Rain in ACStar 线段树+简单几何?

所有的“雨点”最后都可以分解成梯形(三角形就是其中一个底为0),然后lazy标记设置成梯形的上底和下底就好。数目很大,当然要离散化,注意处理点和点之间线段的关系,而且向下更新还有下放标记的时候要注意更新的过程中标记是有可能会变的。 #include <cstdio> #include <cstring> #include <iostream> #in...

weixin_30418341的博客 162

HDU3340 Rain in ACStar 线段树+几何

LINK #include<bits/stdc++.h> using namespace std; const int N=125010; int n,xx; map<int,int>x; int q[N]; struct N { int x[7],y[7]; int n; }p[N]; struct node{ int l,r,len; double lp,...

Up Panda 192

HDU-3340-Rain in ACStar

这个题要求求多边形的面积,参考了

z309241990的专栏 537

ZOJ 3511 不相交切切多边形 线段树求最大边数

题意: n多凸边形 m刀 (把n切m刀,问切完后的图形中 最多的边数 是多少) 切a点-b点 数据保证切的刀不会相交 思路: 2点之间的剩余点数就是边数, 把a-b距离 近 排序 切完一刀就统计一下切出来的蛋糕的边数,并舍弃 [a,b] 表示a,b 点间剩下的点数(就是边数) 先计算[a,b]的点数, 然后删除(a,b) 区间的点 (注意删除的是(a,b) ,所以实际操作是 删除

九野的博客 1938
上一篇: hdu2795 线段树 贴广告
下一篇: hdu4521 线段树+dp
Tyuio28
博客等级 码龄11年 12粉丝 279原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值