# 威威猫系列故事——晒被子

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1592    Accepted Submission(s): 444

Problem Description
因为马拉松初赛中吃鸡腿的题目让不少人抱憾而归，威威猫一直觉得愧对大家，这几天他悄悄搬到直角坐标系里去住了。
生活还要继续，太阳也照常升起，今天，威威猫在第一象限晒了N条矩形的被子，被子的每条边都和坐标轴平行，不同被子的某些部分可能会叠在一起。这时候，在原点处突然发了场洪水，时间t的时候，洪水会蔓延到( t, t )，即左下角为( 0, 0 ) ，右上角为( t, t )的矩形内都有水。
悲剧的威威猫想知道，在时间t1, t2, t3 ... tx 的时候，他有多少面积的被子是湿的？

Input

[Technical Specification]
T <= 5
0 < N <= 20000
1 <= x1 < x2 <= 200000
1 <= y1 < y2 <= 200000
1 <= x <= 20000
1 <= ti <= 200000 （1 <= i <= x ）

Output

Sample Input

```1
2
1 1 3 3
2 2 4 4
5
1
2
3
4
5```

Sample Output

```0
1
5
8
8```
```/*
hdu 4533 线段树(问题转化+)

(t-x1)*(t-y1)(t为正方形的边长).

1.max(x1,y1)<=t<=min(x2,y2):即正方形的直角的矩形内
->s=(t-x1)*(t-y1)=t*t-(x1+y1)*t+x1*y1
2.min(x2,y2)<=t<=max(x2,y2):假设只与上边相交(如图)
s=(t-x1)*(t-y1) - (t-x2)*(t-y1) = (-x1-y1+x2+y1)*t+(x1*y1-x2*y1)
_
____|_|_
|    | | |
|    |_| |
|        |
|________|

t1=max(x1,y1)    t2=(min(x2,y2))   ->max(t1,t2)~max(x2,y2)
_              _
| |            | |
____|_|         ___|_|__
|    |_|        |        |
|      |        |        |
|______|        |        |
|________|

hhh-2016-04-03 17:22:44
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <functional>
using namespace std;
#define lson  (i<<1)
#define rson  ((i<<1)|1)
typedef long long ll;
const int mod = 1e8+7;
const int maxn = 200050;
int limi = 200000;

struct node
{
int l,r;
ll A,B,C;
int mid()
{
return (l+r)>>1;
}
int len()
{
return (r-l+1) ;
}
} tree[maxn<<2];

void update_up(int i)
{

}

void build(int i,int l,int r)
{
tree[i].l = l,tree[i].r = r;
tree[i].A = tree[i].B = tree[i].C = 0;
if(l == r)
return ;
build(lson,l,tree[i].mid());
build(rson,tree[i].mid()+1,r);
update_up(i);
}

void update_down(int i)
{
tree[lson].A+=tree[i].A,tree[rson].A+=tree[i].A;
tree[lson].B+=tree[i].B,tree[rson].B+=tree[i].B;
tree[lson].C+=tree[i].C,tree[rson].C+=tree[i].C;
tree[i].A = tree[i].B = tree[i].C = 0;
}

void update(int i,int l,int r,ll *va)
{
if(tree[i].l >= l && tree[i].r <= r)
{
tree[i].A += va[0],tree[i].B += va[1],tree[i].C += va[2];
return ;
}
int mid = tree[i].mid();
if(l <= mid)
update(lson,l,r,va);
if(r > mid)
update(rson,l,r,va);
update_up(i);
}

ll query(int i,ll k)
{
if(tree[i].l == tree[i].r)
{
return (ll)tree[i].A*k*k+tree[i].B*k+tree[i].C;
}
int mid = tree[i].mid();
update_down(i);
if(k <= mid)
return query(lson,k);
else
return query(rson,k);
}
ll Min(ll a,ll b)
{
return a<b ? a:b;
}

ll Max(ll a,ll b)
{
return a>b ? a:b;
}
ll v[5];
void cal(ll x1,ll y1,ll x2,ll y2)
{
int a=Max(x1,y1),b = Min(x2,y2),c = Max(x2,y2);
v[0]=v[1]=v[2] =0;
v[2] = (x2-x1)*(y2-y1);
update(1,c+1,limi,v);                           //被全包围
v[0] = 1,v[1] = -(x1+y1),v[2] = x1*y1;
if(b > a)                                       //与正方形 右.上边同时相交的情况
update(1,a+1,b,v);
if(x2 < y2)                                      //只与正方形上边相交
{
v[0] = 0,v[1]+= (x2+y1),v[2]-= x2*y1;
}
else if(x2 > y2)                                 //只与正方形右边相交
{
v[0] = 0,v[1]+= (x1+y2),v[2]-=x1*y2;
}
if(a > b)    //与不同的边以不同相交 范围不一样
b = a;
update(1,b+1,c,v);
}

int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
ll x1,y1,x2,y2;
build(1,1,limi);
for(int i = 0; i < n; i++)
{
scanf("%I64d%I64d%I64d%I64d",&x1,&y1,&x2,&y2);
cal(x1,y1,x2,y2);
}
scanf("%d",&m);
while(m--)
{
ll k;
scanf("%I64d",&k);
printf("%I64d\n",query(1,k));
}
}
return 0;
}
```

## hdu 4533 线段树(问题转化+)的更多相关文章

1. hdu 5877 线段树（2016 ACM/ICPC Asia Regional Dalian Online）

Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

2. hdu 3974 线段树 将树弄到区间上

Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

3. hdu 3436 线段树 一顿操作

Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

4. hdu 3397 线段树双标记

Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

5. hdu 4578 线段树(标记处理)

Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others) ...

6. hdu 2871 线段树(各种操作)

Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

7. hdu 4052 线段树扫描线、奇特处理

Adding New Machine Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

8. hdu 1542 线段树扫描(面积)

Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

9. hdu 1828 线段树扫描线(周长)

Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

## 随机推荐

1. 如何方便的保存WinForm窗体控件的位置大小等等配置信息

由于分辨率.屏幕主题.字体大小的不同,窗体显示效果在不同机器上不尽相同.窗体的弹性设计并不能满足多样的需求.为保证在各种情况下,能有满意的效果.窗体的多样显示方式能改变,并且保存.载入配置,显得很重要 ...

2. 三个案例带你看懂LayoutInflater中inflate方法两个参数和三个参数的区别

关于inflate参数问题,我想很多人多多少少都了解一点,网上也有很多关于这方面介绍的文章,但是枯燥的理论或者翻译让很多小伙伴看完之后还是一脸懵逼,so,我今天想通过三个案例来让小伙伴彻底的搞清楚这个 ...

3. 在C#中实现Socket端口复用

转载:http://www.csharpwin.com/csharpspace/68.shtml 一.什么是端口复用:        因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在 ...

4. Java 原始数据类型转换

在开发中经常遇到数据类型转换的问题,大多数都是拿来强制转换,强制转换可能会出现你意想不到的问题: int a = -1; 我们经过多重转换之后:int b = (int)(char)(byte) a ...

5. Javascript:DOM表格操作

需求说明: /* *需求说明: *获取元素:tBodies,tHead,tFoot,rows,cells *表格的创建 *数据添加 *隔行变色 *删除操作,剩余表格重新计算,实现隔行变色 */ HTM ...

6. Material风格的Quick组件，妈妈再也不用担心我的界面不好看了

https://github.com/papyros/qml-material http://www.zhihu.com/question/38523930

7. SpringMVC拦截器 - 设置不拦截html,js等静态文件

拦截器中增加针对静态资源不进行过滤(涉及spring-mvc.xml) <mvc:resources location="/" mapping="/**/*.js& ...

8. android测试

1.测试是否知道源代码: --黑盒测试 不知道代码 --白盒测试 知道源代码 2.按照测试粒度: --方法测试 --单元测试 Junit测试 --集成测试 --系统测试 3.按照测试暴力程度 --冒烟 ...

9. Vue的学习

1.Vue是什么 参考Vue官网,一套用于构建用户界面的渐进式框架. 2.什么是渐进式框架 引用大神的话:“它给你提供足够的optional,但并不主张很多required,也不多做职责之外的事!这就 ...

10. 网络编程 生产者消费者模型 GiL

守护进程: 注意事项: 1.必须在p.start()前 2.守护进程不能开子进程 3.如果主进程的运行时间快于子进程,那么就只有主进程的结果,没有守护进程的结果,因为守护进程没有进行完.反之会得到两个 ...