2013腾讯编程马拉松——复赛试题(3月29)

来源:互联网 发布:高考顶替知乎 编辑:程序博客网 时间:2024/05/12 01:41

1004威威猫系列故事——晒被子
TimeLimit:1.0Seconds MemoryLimit:65536K
因为马拉松初赛中吃鸡腿的题目让不少人抱憾而归,威威猫一直觉得愧对大家,这几天
他悄悄搬到直角坐标系里去住了。
生活还要继续,太阳也照常升起,今天,威威猫在第一象限晒了N条矩形的被子,
被子的每条边都和坐标轴平行,不同被子的某些部分可能会叠在一起。这时候,在原点
处突然发了场洪水,时间t 的时候,洪水会蔓延到(t,t ),即左下角为(0,0) ,右上角
为(t,t )的矩形内都有水。
悲剧的威威猫想知道,在时间t1,t2,t3 ...tx 的时候,他有多少面积的被子是湿的?
Input
输入数据首先包含一个正整数T,表示有T组测试数据;
每组数据的第一行首先是一个整数N,表示有N条被子;
接下来N行,每行包含四个整数x1,y1,x2,y2,代表一条被子的左下角和右上角的坐标;
然后接下来一行输入一个整数x,表示有x次询问;
再接下来x行,输入x个严格单调递增的整数,每行一个,表示威威猫想知道的时间ti。
[TechnicalSpecification]
T<=5
0<N<=20000
1<=x1<x2<=200000
1<=y1<y2<=200000
1<=x<=20000
1<=ti <=200000(1<=i <=x)
Output
对于每次询问,请计算并输出ti 时有多少面积的被子是湿的,每个输出占一行。

Sampleinput
1
2
1133
2244
5
1
2
3
4
5
Sampleoutput
0
1
5
8
8

#include <stdio.h>

void main()
{
    int T;
    scanf("%d",&T);
while(T--)
    {
int N,last,max = 0;
long s[200001]={0};
int x1,y1,x2,y2,x;
scanf("%d",&N);
while(N--)
{
int i,j,k,m;
long h;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
i = x2 - x1;
j = y2 - y1;
k = (x1>y1?x1:y1);
m = (x2>y2?x2:y2);
if(max<m)
{
last = max;
h = s[last];
max = m;
}
for(;k<=last;k++)
{
if(k<x2)
s[k] += (k-x1)*(k-y1);
else
s[k] += i*(k-y1);
}
for(;k<=max;k++)
{
if(k<x2)
{
if(k<y2)
s[k]=s[k]+h+(k-x1)*(k-y1);
else
s[k]=s[k]+h+j*(k-x1);
}
else
{
if(k<y2)
s[k]=s[k]+h+i*(k-y1);
else
s[k]=s[k]+h+i*j;
}
}
}
scanf("%d",&x);
while(x--)
{
int ti;
scanf("%d",&ti);
if(ti>max)
printf("%ld\n",s[max]);
else
printf("%d\n",s[ti]);
}
}
}
原创粉丝点击