题目链接:https://codeforces.com/gym/101982/attachments

要你求覆盖奇数次的矩形面积并,每次更新时减去原先的值即可实现奇数次有效,下推时为保证线段长度不变左儿子的值为x[mid]-x[l]再减原来的值,右儿子的值为x[r]-x[mid]再减原来的值

#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define maxn 200005
struct seg{
ll l,r,h,s;
seg(){}
seg(ll l,ll r,ll h,ll s):l(l),r(r),h(h),s(s){};
bool operator <(const seg &a)const{
return h<a.h;
}
}se[maxn];
ll sum[maxn<<],lazy[maxn<<],x[maxn];
void pushup(ll rt)
{
sum[rt]=sum[rt<<]+sum[rt<<|];
}
void pushdown(ll rt,ll l,ll r)
{
if(lazy[rt])
{
lazy[rt<<]^=;
lazy[rt<<|]^=;
ll mid=l+r>>;
sum[rt<<]=x[mid]-x[l]-sum[rt<<];
sum[rt<<|]=x[r]-x[mid]-sum[rt<<|];
lazy[rt]=;
}
}
void update(ll L,ll R,ll l,ll r,ll rt)
{
if(L<=l&&R>=r)
{
lazy[rt]^=;
sum[rt]=x[r]-x[l]-sum[rt];
return ;
}
ll mid=l+r>>;
pushdown(rt,l,r);
if(L<mid)update(L,R,l,mid,rt<<);
//因为往右更新时是mid到r 不是mid+1到r 所以L<=mid 会造成死循环 如l=l r=2 L=2 R=3 mid=1
if(R>mid)update(L,R,mid,r,rt<<|);
pushup(rt);
}
int main()
{
int n,x1,x2,y1,y2,tot=;
cin>>n;
for(int i=;i<=n;i++)
{
cin>>x1>>y1>>x2>>y2;
x[tot]=x1;
se[tot++]=seg(x1,x2,y1,);
x[tot]=x2;
se[tot++]=seg(x1,x2,y2,-);
}
x[]=-;
sort(x+,x+tot);
sort(se+,se+tot);
int nx=unique(x,x+tot)-x;
ll ans=;
for(int i=;i<tot-;i++)
{
ll l=lower_bound(x,x+nx,se[i].l)-x;
ll r=lower_bound(x,x+nx,se[i].r)-x;
update(l,r,,nx,);
ans+=sum[]*(se[i+].h-se[i].h);
}
cout<<ans<<endl;
return ;
}

Gym - 101982F 扫描线+线段树的更多相关文章

  1. HDU 3642 - Get The Treasury - [加强版扫描线+线段树]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3642 Time Limit: 10000/5000 MS (Java/Others) Memory L ...

  2. 【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树

    [BZOJ3958][WF2011]Mummy Madness Description 在2011年ACM-ICPC World Finals上的一次游览中,你碰到了一个埃及古墓. 不幸的是,你打开了 ...

  3. HDU 3265/POJ 3832 Posters(扫描线+线段树)(2009 Asia Ningbo Regional)

    Description Ted has a new house with a huge window. In this big summer, Ted decides to decorate the ...

  4. 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树

    题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...

  5. hdu1542 Atlantis(扫描线+线段树+离散)矩形相交面积

    题目链接:点击打开链接 题目描写叙述:给定一些矩形,求这些矩形的总面积.假设有重叠.仅仅算一次 解题思路:扫描线+线段树+离散(代码从上往下扫描) 代码: #include<cstdio> ...

  6. P3722 [AH2017/HNOI2017]影魔(单调栈+扫描线+线段树)

    题面传送门 首先我们把这两个贡献翻译成人话: 区间 \([l,r]\) 产生 \(p_1\) 的贡献当且仅当 \(a_l,a_r\) 分别为区间 \([l,r]\) 的最大值和次大值. 区间 \([l ...

  7. Codeforces Gym 101480C - Cow Confinement(扫描线+线段树)

    题面传送门 题意: 有一个 \(10^6\times 10^6\) 的地图.其中 \(m\) 个位置上有花,\(f\) 个矩形外围用栅栏围了起来.保证 \(f\) 个矩形两两之间没有公共点. \(q\ ...

  8. BZOJ 2584: [Wc2012]memory(扫描线+线段树)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2584 题意:给出平面n个线段,任意两个线段严格不相交,且每个线段不平行于坐标轴.移 ...

  9. Codeforces Gym 100231B Intervals 线段树+二分+贪心

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...

随机推荐

  1. H3C DHCP中继配置示例

  2. Vue基础练习之Todo List

    <body> <div id = "app"> <input type="text" v-model="inputVal ...

  3. vue中动态class写法

    <div class="wrap" :class="{active:index==current}"></div> <div cl ...

  4. JS异步解决方案

    前言 异步最早的解决方案是回调函数,如ajax,事件的回调,setInterval/setTimeout中的回调.但是回调函数有回调地狱的问题; 为了解决回调地狱的问题,社区提出了Promise解决方 ...

  5. Online Classification

    Another challenging trend in Internet evolution is the tremendous growth of the infrastructure in ev ...

  6. windows编译caffe2遇到的问题

    首先介绍下window编译caffe2整体流程: 说明:如果不需要python支持只需3.4即可,而且编译亦不会出现问题. 1. 安装python2.7,. 我使用的是anaconda python2 ...

  7. 两种方法,轻松上手ConfigMap!

    属性配置文件在任何应用程序中都非常重要.它们不仅可以让应用程序具备灵活性,还能够根据文件中配置的值产生不同的功能.实际上,在staging.开发.测试.UAT或生产环境中,我们都使用属性配置文件来驱动 ...

  8. Nginx与PHP交互过程 + Nginx与PHP通信的两种方式

    一.Nginx与PHP交互过程的7步走(用户对动态PHP网页访问过程) step1:用户将http请求发送给nginx服务器(用户和nginx服务器进行三次握手进行TCP连接) step2:nginx ...

  9. hibernate 大对象类型的hibernate映射

    在 Java 中, java.lang.String 可用于表示长字符串(长度超过 255), 字节数组 byte[] 可用于存放图片或文件的二进制数据. 此外, 在 JDBC API 中还提供了 j ...

  10. Java8 Date API

    一 .Clock 时钟 Clock类提供了访问当前日期和时间的方法,Clock是时区敏感的,可以用来取代 System.currentTimeMillis() 来获取当前的微秒数.某一个特定的时间点也 ...