艾莎女王又开始用冰雪魔法盖宫殿了。

她决定先造一堵墙,于是释放魔法让形为直角梯形的冰砖从天而降,定入冻土之中。

现在你将回答女王的询问:某段冻土上冰砖的面积。

注:多块冰砖之间会互相重叠,重叠部分要多次计算。

Input

第一行一个整数n,表示有n个冰砖先后定入了冻土之中。

冻土上刚开始并没有冰砖。

接下来n行,每行6个整数,x1i,h1i,x2i,h2i,li,ri。

表示一次如图所示的冰砖下落,并询问在这之后,落在[li,ri]内冰砖的总面积。

2≤n≤100000,−108≤li<ri≤108,−108≤x1i<x2i≤108,0≤h1i,h2i≤10000,x2i−x1i≤105

Output

输出n行,每行输出一个浮点数,作为对该询问的回答。误差小于1e-6的回答都被当作正确回答

解题报告

首先由于范围很大,我们对X轴上的点进行离散化

注意到这个四边形就是给一段区间增加一段等差数列.

并且注意到等差数列叠加后依然还是等差数列

那么我们在线段树中就存储四个值:

1.double st; //该区间左端应该加的值

2.double ed; //该区间右端应该加的值

3.double k;  //等差数列的k值,不多说

4.double sum; //该区间的面积之和

那么面积我们就转换成梯形计算:

SUM = (st + ed) * 0.5 * Len; //注意到这个Len是这个区间的实际长度!!

这样.

还有两点需要注意!

1.区间建立的时候是[L,R] → [L,mid] + [mid,R]

2. updata操作有三种情况,三种情况的更新各不同,这点需要注意

分别对应ql ,qr 在mid 的左 / 右 / 中三种情况,需分开讨论

注意上以上几点,那么本题也就迎刃而解了.

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + ;
int n;
int pos[maxn*];
int hashpos[maxn*]; typedef struct Query
{
int l,r,x1,y1,x2,y2,id[];
}; typedef struct Data
{
int l,r,len;
double sum,st,ed,k;
void updata(const double &x,const double &y,const double &z)
{
st += x;
ed += y;
k += z;
sum += (double)(x+y)*len*0.5;
}
}; Query q[maxn*];
Data tree[maxn*];
int size = ; void push_up(int cur)
{
tree[cur].sum = tree[cur*].sum + tree[cur*+].sum;
} inline double get_(int x1,int x2,double st,double k)
{
return (double)(hashpos[x2]-hashpos[x1]) * k + st;
} void push_down(int cur)
{
double st = tree[cur].st;
double ed = tree[cur].ed;
double k = tree[cur].k;
int l = tree[cur].l;
int r = tree[cur].r;
int mid = l + (r-l)/;
double news = get_(tree[cur].l,mid,st,k);
tree[*cur].updata(st,news,k);
tree[*cur+].updata(news,ed,k);
tree[cur].st = tree[cur].ed = tree[cur].k = .;
} void build_tree(int cur,int l,int r)
{
tree[cur].l = l , tree[cur].r = r;
tree[cur].len = hashpos[r] - hashpos[l];
tree[cur].st = tree[cur].ed = tree[cur].k = tree[cur].sum = .;
if (r -l > )
{
int mid = l + (r-l)/;
build_tree(*cur,l,mid);
build_tree(*cur+,mid,r);
}
} void updata(int ql,int qr,int cur,double st,double ed,double k)
{
int l = tree[cur].l , r = tree[cur].r;
if (l >= ql && r <= qr)
{
tree[cur].updata(st,ed,k);
}
else
{
push_down(cur);
int mid = l + (r-l) / ;
//三种情况,分开讨论
if (qr <= mid) updata(ql,qr,*cur,st,ed,k);
else if(ql >= mid) updata(ql,qr,*cur+,st,ed,k);
else
{
double news = get_(ql,mid,st,k);
updata(ql,mid,*cur,st,news,k);
updata(mid,qr,*cur+,news,ed,k);
}
push_up(cur);
}
} double query(int ql,int qr,int cur)
{
int l = tree[cur].l , r = tree[cur].r;
if (l >= ql && r <= qr)
return tree[cur].sum;
else
{
push_down(cur);
double res = .;
int mid = l + (r-l)/;
if (mid > ql)
res += query(ql,qr,*cur);
if (mid < qr)
res += query(ql,qr,*cur+);
push_up(cur);
return res;
}
} inline double getk(int x1,int x2,int y1,int y2)
{
return (double)(y2-y1) / (double)(x2-x1);
} int main(int argc,char *argv[])
{
scanf("%d",&n);
for(int i = ; i < n ; ++ i)
{
int x1,y1,x2,y2,l,r;
scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&l,&r);
q[i].id[] = size;
pos[size++] = x1;
q[i].id[] = size;
pos[size++] = x2;
q[i].id[] = size;
pos[size++] = l;
q[i].id[] = size;
pos[size++] = r;
q[i].x1 = x1;
q[i].x2 = x2;
q[i].y1 = y1;
q[i].y2 = y2;
q[i].l = l;
q[i].r = r;
}
memcpy(hashpos,pos,sizeof(int)*size);
sort(hashpos,hashpos+size);
int c = unique(hashpos,hashpos+size) - hashpos;
for(int i = ; i < size ; ++ i)
pos[i] = lower_bound(hashpos,hashpos+c,pos[i]) - hashpos;
build_tree(,,c-);
for(int i = ; i < n ; ++ i)
{
int x1 = q[i].x1;
int y1 = q[i].y1;
int x2 = q[i].x2;
int y2 = q[i].y2;
double k = getk(x1,x2,y1,y2);
updata(pos[q[i].id[]],pos[q[i].id[]],,(double)y1,(double)y2,k);
double res = query(pos[q[i].id[]],pos[q[i].id[]],);
printf("%.9lf\n",res);
}
return ;
}

UESTC_冰雪奇缘 CDOJ 843的更多相关文章

  1. UESTC_握手 CDOJ 913

    握手 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status ...

  2. UESTC_棋盘游戏 CDOJ 578

    最近昀昀学习到了一种新的棋盘游戏,这是一个在一个N×N的格子棋盘上去搞M个棋子的游戏,游戏的规则有下列几条: 棋盘上有且仅有一个出口 开始时没有哪个棋子在出口,而且所有棋子都不相邻(这里的相邻是指上下 ...

  3. UESTC_敢说就敢做 CDOJ 631

    敢说就敢做 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

  4. UESTC_方老师的分身 II CDOJ 915

    方老师的分身 II Time Limit: 10000/5000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  5. UESTC_方老师分身 I CDOJ 914

    方老师分身 I Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit S ...

  6. UESTC_神秘绑架案 CDOJ 881

    神秘绑架案 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

  7. UESTC_方老师买表 CDOJ 885

    老师买表 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Stat ...

  8. UESTC_冬马党 CDOJ 882

    冬马党 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Statu ...

  9. UESTC_魔法少女小蟹 CDOJ 710

    小蟹是一名魔法少女,能熟练的施放很多魔法. 有一天魔法学院上课的时候出现了这样一道题,给一个6位数,让大家用自己的魔法,把这个6位数变成另一个给定的6位数. 小蟹翻了下魔法书,发现她有以下6种魔法: ...

随机推荐

  1. mysql C API 字符串玩转备份调优

  2. linux find命令-print0和xargs中-0使用技巧(转载)

    本文介绍了linux find命令中-print0和xargs中-0用法技巧,一些find命令的使用经验,需要的朋友参考下. 本节内容:linux find命令中-print0和xargs中-0的用法 ...

  3. LinQ to SQL 查询

    LINQ to SQL 是将对象关系映射到.NET框架中的一种实现.它可以将关系数据库映射为.NET Framework中的一些类. 然后,开发人员就可以通过使用 LINQ to SQL对数据库中的数 ...

  4. Unity 功夫猫

    最近在家里闲着蛋疼,突然看到一个HTML游戏感觉挺可爱的,就把素材拿过来自己写了一遍. 游戏有很多细节还是没有模仿出来. 里面有一个2DUGUI帧动画播放插件,写了我3个通宵. 还是对Unity的扩展 ...

  5. time date 基础操作

    一. 获取当前系统时间和日期并格式化输出: import java.util.Date;import java.text.SimpleDateFormat; public class NowStrin ...

  6. Subversion安装

    一.Subversion介绍 Subversion是一个集中式的信息共享系统.版本库是Subversion的核心部分,是数据的中央仓库.版本库以典型的文件和目录结构形式文件系统树来保存信息.任意数量的 ...

  7. C++中,访问字符串的三种方法

    1.用字符数组存放一个字符串 程序1:定义一个字符数组并初始化,然后输出其中的字符串. #include<iostream> using namespace std; int main() ...

  8. 制作可独立分发的Android模拟器

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6586759 如果我们编写了一个Android应 ...

  9. 文章转载至CSDN社区罗升阳的安卓之旅,原文地址:

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6720261 前面我们在分析Activity启动 ...

  10. EffectiveC#01--避免返回内部类对象的引用

    此篇是对00中第3点的再一次阐述. 1.如果一个属性返回一个引用类型,那么调用者就可以访问这个对象的公共成员,也包括修改这些属性的状态. public class MyBusinessObject { ...