[IOI1998] Pictures

用线段树维护区间最小值和最小值个数来求一段区间里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的更多相关文章
- 【IOI1998】Picture(扫描线+线段树)
问题来源:IOI1998 D2T1 题意:就是在一个平面内给出n个矩形,叫你计算将这些矩形合并以后,新图形的周长. 例如: 上图是原本的矩形们 ---------->合并后的图形 解题思路:拿一 ...
- IOI1998 Polygon [区间dp]
[IOI1998]Polygon 题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘 ...
- 「IOI1998」「LuoguP4342」Polygon(区间dp
P4342 [IOI1998]Polygon - 洛谷 题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符 ...
- [IOI1998]Polygon(区间dp)
[IOI1998]Polygon 题意翻译 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘积)标记. 第一步,删除其中一条 ...
- IOI1998 hdu1828 poj1177 Picture
写了一发扫描线竟然狂WA不止,hdu死活过不了,poj和当时IOI的数据(还花了我1dsdn积分..)都过了. 然后看到谋篇blog里有评论,把数据拿下来发现WA了. 数据是 20 0 1 11 0 ...
- POJ 1179 IOI1998 Polygon
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5472 Accepted: 2334 Description Polyg ...
- luogu P4342 [IOI1998]Polygon
IOI早期这么多dp? 题目要求断掉环上的一边,我们可以断环为链,开两倍数组 容易想到dp,设\(f_{i,j}\)为区间\([i,j]\)的最大值,然后就是个枚举断点的区间dp 不过可能会有负数出现 ...
- 【洛谷P4342】[IOI1998]Polygon
Polygon 比较裸的环形DP(也可以说是区间DP) 将环拆成链,复制到后面,做区间DP即可 #include<iostream> #include<cstdio> usin ...
- 【洛谷 P4342】[IOI1998]Polygon(DP)
题目链接 题意不再赘述. 这题和合并石子很类似,但是多了个乘法,而乘法是不满足"大大得大"的,因为两个非常小的负数乘起来也会很大,一个负数乘一个很大的整数会很小,所以我们需要添加一 ...
随机推荐
- [NOI2015]软件包管理器
4621 [NOI2015]软件包管理器 题目等级 : 钻石 Diamond 题目描述 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过 ...
- 24.C++- 抽象类(存虚函数)、接口、多重继承
抽象类和接口 什么是抽象类 用来表示现实世界中的抽象概念 是一种只能定义类型,而不能产生对象的类 只能被子类继承,且抽象类的相关成员函数没有完整的体现,用来被子类重写. 比如图形(Shape)类, 就 ...
- istio入门(01)istio的优势在哪里?
Istio能做什么?Istio 试图解决微服务实施后面临的问题.Istio 提供了一个完整的解决方案,对整个服务网格行为洞察和操作控制,以满足微服务应用程序的多样化需求. Istio在服务网络中提供了 ...
- 新概念英语(1-43)Hurry up!
新概念英语(1-43)Hurry up! How do you know Sam doesn't make the tea very often? A:Can you make the tea, Sa ...
- SQL Server 2012 管理新特性:AlwaysOn 可用性组
SQL Server 2012 新特性(一)管理新特性:AlwaysOn 一.准备环境 1.准备4台计算机 域控制器DC1,IP地址192.168.1.1 主节点SQL1:IP地址192.168.1. ...
- CentOS 6.5 Tomcat安装及配置
1.安装jdk,配置jdk环境(此步骤略过) 2.下载安装tomcat 百度网盘链接: https://pan.baidu.com/s/1Ieejo7TQyzRAVPhQft8Phw 密码: dg2v ...
- JSON(二)——JavaScript中js对象与JSON格式字符串的相互转换
首先我们来看一下js中JSON格式的字符串 var JSONStr1 = "{\"name\" : \"张三\"}"; 注意以下的写法不是j ...
- final类与final方法
inal---用于类.方法前. final类---不可被继承. final方法---不可被覆盖. final类不能被继承. 如果我们不希望一个类被继承,我们使用final来修饰这个类.这个类将无法被继 ...
- 一、Python3.6+PyQt5 安装
一.安装PyQt5 方法一:使用pip3工具直接安装 直接在命令行中输入: Python 3.x pip3 install PyQt5 pip3 install PyQt5-tools Python ...
- Spark:reduceByKey函数的用法
reduceByKey函数API: def reduceByKey(partitioner: Partitioner, func: JFunction2[V, V, V]): JavaPairRDD[ ...