用线段树维护区间最小值和最小值个数来求一段区间里0的个数,把横的和竖的边分别拿出来,排序,然后每次查一下重复部分的长度即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define MAXN 5000
#define MAXL 10000
#define mid (T[k].l+T[k].r)/2
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-''; ch=getchar();}
return x*f;
} int n,cnt=,ans=;
struct sq{
int x1,y1,x2,y2;
}s[MAXN+];
struct line{
int k,l,r,x;
}l[MAXL+];
struct TREE{
int l,r,x,num,val;
}T[MAXL*]; bool cmp(line x,line y){return x.x<y.x||(x.x==y.x&&x.k<y.k);} void pushdown(int k)
{
int ls=k<<,rs=(k<<)+;
T[ls].x+=T[k].val;T[rs].x+=T[k].val;
T[ls].val+=T[k].val;T[rs].val+=T[k].val;
T[k].val=;
} void combine(int k)
{
int ls=k<<,rs=(k<<)+;
if(T[ls].x==T[rs].x) T[k].x=T[ls].x,T[k].num=T[ls].num+T[rs].num;
else if(T[ls].x<T[rs].x) T[k].x=T[ls].x,T[k].num=T[ls].num;
else T[k].x=T[rs].x,T[k].num=T[rs].num;
} void renew(int k,int l,int r,int ad)
{
if(T[k].l==l&&T[k].r==r)
{T[k].x+=ad;T[k].val+=ad;return;}
if(T[k].val) pushdown(k);
if(r<=mid) renew(k<<,l,r,ad);
else if(l>mid) renew((k<<)+,l,r,ad);
else {renew(k<<,l,mid,ad);renew((k<<)+,mid+,r,ad);}
combine(k);
} int query(int k,int l,int r)
{
// cout<<"q"<<k<<" "<<l<<" "<<r<<endl;
if(T[k].l==l&&T[k].r==r)
{
if(T[k].x>) return T[k].r-T[k].l+;
else return T[k].r-T[k].l+-T[k].num;
}
if(T[k].val) pushdown(k);
if(r<=mid) return query(k<<,l,r);
else if(l>mid) return query((k<<)+,l,r);
else return query((k<<)+,mid+,r)+query(k<<,l,mid);
} void init(int k,int l,int r)
{
//cout<<"init"<<k<<" "<<r<<endl;
T[k].l=l;T[k].r=r;T[k].val=;
if(l==r){T[k].x=;T[k].num=;return;}
init(k<<,l,mid);init((k<<)+,mid+,r);
combine(k);
} int main()
{
n=read();
for(int i=;i<=n;++i)
{
s[i].x1=read()+;s[i].y1=read()+;
s[i].x2=read()+;s[i].y2=read()+;
ans+=(s[i].x2+s[i].y2-s[i].y1-s[i].x1)*;
l[++cnt].k=;l[cnt].x=s[i].x1;l[cnt].l=s[i].y1+;l[cnt].r=s[i].y2;
l[++cnt].k=;l[cnt].x=s[i].x2;l[cnt].l=s[i].y1+;l[cnt].r=s[i].y2;
}
sort(l+,l+cnt+,cmp);init(,,);
// for(int i=1;i<=cnt;i++)
// {
// cout<<l[i].k<<" "<<l[i].x<<" "<<l[i].l<<" "<<l[i].r<<endl;
// }
for(register int i=;i<=cnt;i++)
{
if(!l[i].k){ans-=query(,l[i].l,l[i].r);renew(,l[i].l,l[i].r,);}
else {renew(,l[i].l,l[i].r,-);ans-=query(,l[i].l,l[i].r);} }
cnt=;
for(register int i=;i<=n;++i)
{
l[++cnt].k=;l[cnt].x=s[i].y1;l[cnt].l=s[i].x1+;l[cnt].r=s[i].x2;
l[++cnt].k=;l[cnt].x=s[i].y2;l[cnt].l=s[i].x1+;l[cnt].r=s[i].x2;
}
sort(l+,l+cnt+,cmp);init(,,);
// for(int i=1;i<=cnt;i++)
// {
// cout<<l[i].k<<" "<<l[i].x<<" "<<l[i].l<<" "<<l[i].r<<endl;
// }
for(register int i=;i<=cnt;i++)
{
if(!l[i].k){ans-=query(,l[i].l,l[i].r);renew(,l[i].l,l[i].r,);}
else {renew(,l[i].l,l[i].r,-);ans-=query(,l[i].l,l[i].r);}
}
printf("%d",ans);
return ;
}

[IOI1998] Pictures的更多相关文章

  1. 【IOI1998】Picture(扫描线+线段树)

    问题来源:IOI1998 D2T1 题意:就是在一个平面内给出n个矩形,叫你计算将这些矩形合并以后,新图形的周长. 例如: 上图是原本的矩形们 ---------->合并后的图形 解题思路:拿一 ...

  2. IOI1998 Polygon [区间dp]

    [IOI1998]Polygon 题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘 ...

  3. 「IOI1998」「LuoguP4342」Polygon(区间dp

    P4342 [IOI1998]Polygon - 洛谷 题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符 ...

  4. [IOI1998]Polygon(区间dp)

    [IOI1998]Polygon 题意翻译 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘积)标记. 第一步,删除其中一条 ...

  5. IOI1998 hdu1828 poj1177 Picture

    写了一发扫描线竟然狂WA不止,hdu死活过不了,poj和当时IOI的数据(还花了我1dsdn积分..)都过了. 然后看到谋篇blog里有评论,把数据拿下来发现WA了. 数据是 20 0 1 11 0 ...

  6. POJ 1179 IOI1998 Polygon

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5472   Accepted: 2334 Description Polyg ...

  7. luogu P4342 [IOI1998]Polygon

    IOI早期这么多dp? 题目要求断掉环上的一边,我们可以断环为链,开两倍数组 容易想到dp,设\(f_{i,j}\)为区间\([i,j]\)的最大值,然后就是个枚举断点的区间dp 不过可能会有负数出现 ...

  8. 【洛谷P4342】[IOI1998]Polygon

    Polygon 比较裸的环形DP(也可以说是区间DP) 将环拆成链,复制到后面,做区间DP即可 #include<iostream> #include<cstdio> usin ...

  9. 【洛谷 P4342】[IOI1998]Polygon(DP)

    题目链接 题意不再赘述. 这题和合并石子很类似,但是多了个乘法,而乘法是不满足"大大得大"的,因为两个非常小的负数乘起来也会很大,一个负数乘一个很大的整数会很小,所以我们需要添加一 ...

随机推荐

  1. win7下,使用django运行django-admin.py无法创建网站

    安装django的步骤: 1.安装python,选择默认安装在c盘即可.设置环境变量path,值添加python的安装路径. 2.下载ez_setup.py,下载地址:http://peak.tele ...

  2. jvm垃圾收集器总结jdk1.7

    内存 ● 线程私有:程序计数器,虚拟机栈,本地方法栈 ● 线程共享: 方法区,堆 判断存活算法 ● 引用计数法:无法解决循环引用问题. ● 可达性分析算法: 从GCRoot作为起始点,向下搜索,经过的 ...

  3. highcharts 具体参数详解

    <script type="text/javascript" src="js/jquery.min.js"></script> < ...

  4. PHP截取日期

    date( 'Y-m-d ',strtotime('2017-10-9 12:23:35')) 通过时间格式,获取的是2017-10-9

  5. Microsoft Soft SQL Server 大数据----分区表性能测试

    分区表 MSSQL有一个大数据储存方案,可以提高效率那就是分区表. 使用起来跟普通表没有区别.至于具体原理自己度娘吧. 真正性能的提高,是依赖于硬件的加入.也是就说,当把一个表设置成分区表,每一个分区 ...

  6. UML开发工具Rose ralation的破解安装,

    UML开发工具Rose ralation的在windows764破解安装, 安装下载还可以参考:http://www.cnblogs.com/leaven/p/3718361.html 跟大家分享怎么 ...

  7. 不允许用(a+b)/2这种方式求两个数的均值;如下程序在Linux和32位集成开发环境中运行

    #define MAX(a,b) ((a)>(b)?(a):(b)) #include<stdio.h> int main() { int a = 10; int b = 20; i ...

  8. SpringCloud用户自定义配置信息的定义和查看

    一.概念 在SpringCloud项目中,用户自己定义的配置信息也可以放在application.*,需要以 info打头,以便使用公用基础设施 /info 查看! 本文讲解基于 ConfigServ ...

  9. C# Bootstrap table之 分页

    效果如图: 一.声明talbe <div class="container"> <table id="table" class="t ...

  10. Server.MapPath找不到命名空间,解决办法

    最近在做微信公众号开发,在网上找了个例子实现获取Access_token的值,需要读取xml文件,结果就遇到这个问题