题目大意:在平面直角坐标系的第一象限中,给出n个矩形(可能重叠)。有m次询问,每次询问点(t,t)的左下方的正方形区域中矩形的总面积(重叠部分重叠几次就得统计几次)。

题目分析:线段树的叶子节点x维护的是点(x,x)左下方的正方形区域中矩形的总面积。每添加一个矩形,便做一次区间更新。

代码如下:

# include<bits/stdc++.h>
using namespace std;
# define LL long long
# define mid (l+(r-l)/2) const int N=200000; LL lazy[N*4+1];
LL lazy_a0[N*4+1],lazy_d[N*4+1];
LL lazy_a[N*4+1],lazy_b[N*4+1],lazy_c[N*4+1]; void read(int &x)
{
x=0;
char c;
while((c=getchar())&&(c<'0'||c>'9'));
x=c-'0';
while(c=getchar()){
if(c<'0'||c>'9') break;
x=x*10+c-'0';
}
} void pushDown(int rt,int l,int r)
{
lazy[rt<<1]+=lazy[rt];
lazy[rt<<1|1]+=lazy[rt];
lazy[rt]=0; lazy_a0[rt<<1]+=lazy_a0[rt];
lazy_a0[rt<<1|1]+=lazy_a0[rt]+(LL)(mid-l+1)*lazy_d[rt];
lazy_d[rt<<1]+=lazy_d[rt];
lazy_d[rt<<1|1]+=lazy_d[rt];
lazy_a0[rt]=lazy_d[rt]=0; lazy_a[rt<<1]+=lazy_a[rt];
lazy_a[rt<<1|1]+=lazy_a[rt];
lazy_a[rt]=0; lazy_b[rt<<1]+=lazy_b[rt];
lazy_b[rt<<1|1]+=lazy_b[rt];
lazy_b[rt]=0; lazy_c[rt<<1]+=lazy_c[rt];
lazy_c[rt<<1|1]+=lazy_c[rt];
lazy_c[rt]=0;
} void build(int rt,int l,int r)
{
lazy[rt]=0;
lazy_a0[rt]=lazy_d[rt]=0;
lazy_a[rt]=lazy_b[rt]=lazy_c[rt]=0;
if(l==r) return ;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
} void update1(int rt,int l,int r,int L,int R,LL x)
{
if(L<=l&&r<=R){
lazy[rt]+=x;
}else{
if(L<=mid) update1(rt<<1,l,mid,L,R,x);
if(R>mid) update1(rt<<1|1,mid+1,r,L,R,x);
}
} void update2(int rt,int l,int r,int L,int R,LL a0,int d)
{
if(L<=l&&r<=R){
LL a1=(LL)a0+(LL)d*(LL)(l-L);
lazy_a0[rt]+=(LL)a1;
lazy_d[rt]+=(LL)d;
}else{
if(L<=mid) update2(rt<<1,l,mid,L,R,a0,d);
if(R>mid) update2(rt<<1|1,mid+1,r,L,R,a0,d);
}
} void update3(int rt,int l,int r,int L,int R,int lowx,int lowy)
{
if(L<=l&&r<=R){
++lazy_a[rt];
lazy_b[rt]-=(LL)(lowx+lowy);
lazy_c[rt]+=(LL)lowx*(LL)lowy;
}else{
if(L<=mid) update3(rt<<1,l,mid,L,R,lowx,lowy);
if(R>mid) update3(rt<<1|1,mid+1,r,L,R,lowx,lowy);
}
} LL query(int rt,int l,int r,int x)
{
if(l==r){
LL ans=0;
ans+=lazy[rt];
LL last=lazy_a0[rt]+(r-l)*lazy_d[rt];
ans+=(r-l+1)*(lazy_a0[rt]+last)/2;
ans+=lazy_a[rt]*l*l+lazy_b[rt]*l+lazy_c[rt];
return ans;
}else{
pushDown(rt,l,r);
if(x<=mid) return query(rt<<1,l,mid,x);
return query(rt<<1|1,mid+1,r,x);
}
} int main()
{
int T,n;
read(T);
while(T--)
{
build(1,0,N);
scanf("%d",&n);
int x1,x2,y1,y2;
while(n--){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
int dltx=x2-x1;
int dlty=y2-y1;
update1(1,0,N,max(x2,y2)+1,N,(LL)dltx*(LL)dlty);
if(y1>=x2)
update2(1,0,N,y1,y2,0,dltx);
else if(y2<=x1)
update2(1,0,N,x1,x2,0,dlty);
else if(y2>x1&&y1<x2){
if(y2<x2&&y1<=x1){
update3(1,0,N,x1,y2-1,x1,y1);
update2(1,0,N,y2,x2,(LL)dlty*(y2-x1),dlty);
}else if(y2>=x2&&y1<=x1){
update3(1,0,N,x1,x2-1,x1,y1);
update2(1,0,N,x2,y2,(LL)dltx*(LL)(x2-y1),dltx);
}else if(y2>=x2&&y1>x1){
update3(1,0,N,y1,x2-1,x1,y1);
update2(1,0,N,x2,y2,(LL)dltx*(x2-y1),dltx);
}else if(y2<x2&&y1>x1){
update3(1,0,N,y1,y2-1,x1,y1);
update2(1,0,N,y2,x2,(LL)dlty*(LL)(y2-x1),dlty);
}
}
}
scanf("%d",&n);
while(n--)
{
scanf("%d",&x1);
printf("%lld\n",query(1,0,N,x1));
}
}
return 0;
}

  

HDU-4533 威威猫系列故事——晒被子(区间更新)的更多相关文章

  1. hdu4533 威威猫系列故事——晒被子

    Problem Description 因为马拉松初赛中吃鸡腿的题目让不少人抱憾而归,威威猫一直觉得愧对大家,这几天他悄悄搬到直角坐标系里去住了. 生活还要继续,太阳也照常升起,今天,威威猫在第一象限 ...

  2. HDU 4533 威威猫系列故事——晒被子

    题目链接 扫描线可做,然后当时比赛后问虎哥,他说可以标记,然后拖了很久,今天从早上折腾到晚上,终于把两种情况写出来,分析太弱.改天扫描线,再来一次. 被子如果被y = x 穿过,可以分成两部分,上和下 ...

  3. HDU 4540 威威猫系列故事——打地鼠

    威威猫系列故事--打地鼠 Time Limit: 300/100 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Su ...

  4. hdu 4523 威威猫系列故事——过生日 小模拟

    威威猫系列故事——过生日 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total ...

  5. hdu 4540 威威猫系列故事——打地鼠 dp小水题

    威威猫系列故事——打地鼠 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total ...

  6. HDU 4540 威威猫系列故事——打地鼠 (状态压缩DP)

    威威猫系列故事——打地鼠 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  7. HDU--杭电--4504--威威猫系列故事——篮球梦--DP

    威威猫系列故事——篮球梦 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total ...

  8. HDUOJ----4504 威威猫系列故事——篮球梦

    威威猫系列故事——篮球梦 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  9. hdoj 4526 威威猫系列故事——拼车记

    威威猫系列故事——拼车记 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

随机推荐

  1. IntelliLock托管代码保护和许可授权管理系统软件详细介绍及下载

    IntelliLock是一个能用于控件与应用程序许可授权的100%托管的先进解决方案.与.NET Reactor提供的基于源代码保护的授权许可系统不同,IntelliLock选择了以100%托管的方式 ...

  2. [转]diskpart命令

    from: http://support.microsoft.com/kb/300415/zh-cn Diskpart 与许多命令行实用工具不同,原因是它不以单行模式操作.相反,当您启动该实用工具后, ...

  3. matlab中如何保留指定的变量的数据

    在使用matlab时,通常要将计算的结果保存到mat文件中.使用的命令是: save filename 但是用上述命令保存的时候,会将计算过程中的其他变量一起保存了.这中粗糙的保存有以下缺点: (1) ...

  4. @ResultMapping注解

    @RequestMapping注解1.url映射放在方法上:@RequestMapping("/itemsEdit")2.窄化url请求映射放在类上,定义根路径,url就变成根路径 ...

  5. SharePoint 2010 BCS - 简单实例(二)外部列表创建

    博客地址 http://blog.csdn.net/foxdave 接上篇 由于图片稍多篇幅过长影响阅读,所以分段来写. 添加完数据源之后,我们需要为我们要放到SharePoint上的数据表定义操作, ...

  6. MVC5 烂笔头

    HttpContent Controller:HttpContextBase View:HttpContext.Current View的搜寻顺序:本文件夹.本共享.根共享等 class=" ...

  7. Java中接口作为方法的返回

    在<算法>中的散列表一节,在用拉链法实现散列表的API时要求实现以下一个方法: public Iterable<Key> keys() 我们知道Iterable是一个接口,那么 ...

  8. 解决:信息中插入avi格式的视频时,提示“unsupported video format”

    [测试步骤]:新建信息,添加AVI格式的视频 [测试结果]:添加时弹出提示"unsupported video format" 该问题主要提现在手机彩信视频附件不支持该AVI格式的 ...

  9. 爬虫再探实战(四)———爬取动态加载页面——请求json

    还是上次的那个网站,就是它.现在尝试用另一种办法——直接请求json文件,来获取要抓取的信息. 第一步,检查元素,看图如下: 过滤出JS文件,并找出包含要抓取信息的js文件,之后就是构造request ...

  10. swift系统学习控件篇:UIbutton+UIlabel+UITextField+UISwitch+UISlider

    工作之余,学习下swift大法.把自己的学习过程分享一下.当中的布局很乱,就表在意这些细节了.直接上代码: UIButton+UILabel // // ViewController.swift // ...