[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)
题目链接 题意不再赘述. 这题和合并石子很类似,但是多了个乘法,而乘法是不满足"大大得大"的,因为两个非常小的负数乘起来也会很大,一个负数乘一个很大的整数会很小,所以我们需要添加一 ...
随机推荐
- Flask Markup 上下文,request
在模板渲染中,使用Markup转换变量中的特殊字符 from flask import Markup Markup函数对字符串进行转移处理再传递给render_template()函数 在浏览器中显示 ...
- 【iOS】OC-AFNetworking 2.0 跟踪文件上传进度
我是较新的 AFNetworking 2.0.使用下面的代码片段,我已经能够成功地将一张照片上传到我的 url.我想要跟踪的增量上载进度,但我找不到这样做 2.0 版的示例.我的应用程序是 iOS 7 ...
- Codeforces 837E. Vasya's Function
http://codeforces.com/problemset/problem/837/E 题意: f(a, 0) = 0; f(a, b) = 1 + f(a, b - gcd(a, b)) ...
- IE bug:ajax请求返回304解决方案
bug说明: 同一账户下的默认收货地址只有一个,默认收货地址可以修改,修改完成后,使用ajax重新加载收货地址部分. 默认收货地址状态标记:status = 1: 在IE浏览器做了修改后,重新加载的数 ...
- Filter 和 interceptor 的区别
1. 拦截器 interceptor ● 特点:interceptor 依赖于web框架,在Spring<MV中就是依赖于springMVC框架.在实现上是基于Java的反射机制,属于面向切面编 ...
- ll的命令后面的字段详解
linux学习 命令ll后字段的解释 分类:linux | 标签: 命令ll后字段的解释 2010-10-25 15:47阅读(4513)评论(0) ls -l 列表信息详解 我们平时用ls -l ...
- Python爬虫基本原理
爬虫基本原理 1. 什么是爬虫 请求网站并提取数据的自动化程序. 2. 爬虫基本流程 发起请求 通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待 ...
- MySQL默认储存引擎修改
1.输入以下SQL语句查看当前储存引擎支持: SHOW ENGINES; 如图所示本机默认引擎为MyISAM: 2.若要修改引擎执行: ALTER TABLE 表名 ENGINE = 储存引擎名: 3 ...
- [2]十道算法题【Java实现】
前言 清明不小心就拖了两天没更了-- 这是十道算法题的第二篇了-上一篇回顾:十道简单算法题 最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下, ...
- jodatime 时间比较
public ArrayList<CalcPeriod> getCalcPeriods() { DateTime now = DateTime.now(); DateTime.Proper ...