Description

在一个平面上放置一些矩形,所有的边都为垂直或水平。每个矩形可以被其它矩形部分或完全遮盖,所有矩形合并成区域的边界周长称为轮廓周长。

要求:计算轮廓周长。

数据规模:

0≤矩形数目<5000;

坐标数值为整数,范围是[-10000,10000]。

Input

第一横列是墙上所贴的长方形总数。之后每一横列是一个长方形的左下角与右上角的整数坐标。个各坐标的x值在前,y值在后。

Output

应有一非负整数,即为长方形覆盖图形的总周长

Sample Input

7

-15 0 5 10

-5 8 20 25

15 -4 24 14

0 -6 16 4

2 15 10 22

30 10 36 20

34 0 40 16

Sample Output

228


线段树+扫描线,参考[Baltic 2001]Mars Maps

不过还是要讲一个东西,关于排列方式的问题。

排序的时候,在同一位置的起始边需要在终止边之前枚举

为什么?

首先本题统计答案的时候,应该是计算每次操作后,添加或删除的区间大小。

然后扫描线从两个方向扫描一下即可。

那么如果我们将终止边排在起始边之前的话,两条线之间必然会有因为时间差而导致的空隙,也就是程序实现的时候,先加了终止边,又加了起始边,等于是把这条边算了两次,但是实际是不能算的!!!

所以说我们在排序的时候,要将起始边排在终止边的前面,这样就不会出现多加的问题了。

(ps:这个代码是我很久之前写的,所以和上一题的码风可能有所区别)

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e4;
int tree[N*10+100],cnt[N*10+100];
int ans;
int read(){
int x=0,f=1;char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x*f;
}
struct AC{
int val,first,last,cnt;
};
bool cmp(AC x,AC y){
if (x.val<y.val) return 1;
if (x.val==y.val) if (x.cnt>y.cnt) return 1;
return 0;
}
void updata(int p){
if (cnt[p]){
if (tree[p]!=-1) tree[p]+=cnt[p];
cnt[p*2]+=cnt[p];
cnt[p*2+1]+=cnt[p];
cnt[p]=0;
}
}
void change(int p,int l,int r,int x,int y,int t){
if (x<=l&&r<=y&&tree[p]!=-1){
if ((tree[p]==1&&t==-1)||(tree[p]==0&&t==1)) ans+=r-l;
tree[p]+=t; cnt[p*2]+=t; cnt[p*2+1]+=t;
return;
}
int mid=(l+r)>>1;
updata(p*2);updata(p*2+1);
if (x<mid) change(p*2,l,mid,x,y,t);
if (y>mid) change(p*2+1,mid,r,x,y,t);
if (tree[p*2]==tree[p*2+1]) tree[p]=tree[p*2];
else tree[p]=-1;
}
AC h[N+100],s[N+100];
int main(){
int n=read();
for (int i=1;i<=n;i++){
int a=read(),b=read(),c=read(),d=read();
h[i].cnt=-1; h[n+i].cnt=1;
s[i].cnt=1; s[n+i].cnt=-1;
h[i].val=d; h[i].first=a; h[i].last=c;
h[i+n].val=b; h[i+n].first=a; h[i+n].last=c;
s[i].val=a; s[i].first=b; s[i].last=d;
s[i+n].val=c; s[i+n].first=b; s[i+n].last=d;
}
sort(h+1,h+2*n+1,cmp);
sort(s+1,s+2*n+1,cmp);
ans=0;
for (int i=1;i<=n*2;i++)
change(1,-N,N,h[i].first,h[i].last,h[i].cnt);
for (int i=1;i<=n*2;i++)
change(1,-N,N,s[i].first,s[i].last,s[i].cnt);
printf("%d\n",ans);
return 0;
}

[IOI1998]Picture的更多相关文章

  1. [BZOJ1382]Mars Maps

    Description In the year 2051, several Mars expeditions have explored different areas of the red plan ...

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

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

  3. IOI1998 hdu1828 poj1177 Picture

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

  4. 基于Picture Library创建的图片文档库中的上传多个文件功能(upload multiple files)报错怎么解决?

    复现过程 首先,我创建了一个基于Picture Library的图片文档库,名字是 Pic Lib 创建完毕后,我点击它的Upload 下拉菜单,点击Upload Picture按钮 在弹出的对话框中 ...

  5. MFC Picture控件加载图片

    CStatic *pPic = (CStatic*)GetDlgItem(IDC_PICTURE); CBitmap bitmap; bitmap.LoadBitmapW(IDB_BITMAP2); ...

  6. [POJ1177]Picture

    [POJ1177]Picture 试题描述 A number of rectangular posters, photographs and other pictures of the same sh ...

  7. USACO 5.5 Picture(周长并)

    POJ最近做过的原题. /* ID: cuizhe LANG: C++ TASK: picture */ #include <cstdio> #include <cstring> ...

  8. 彩色照片转换为黑白照片(Color image converted to black and white picture)

    This blog will be talking about the color image converted to black and white picture. The project st ...

  9. HDU 1828 Picture(线段树扫描线求周长)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

随机推荐

  1. Java二维码的解码和编码

    原文:http://www.open-open.com/code/view/1430906793866 import java.io.File; import java.util.Hashtable; ...

  2. C# 获得图片的分辨率和大小

    double DPI = pictureBox1.Image.HorizontalResolution;//获得分辨率 gisoracle double w = 1.0 * pictureBox1.I ...

  3. GAN Generative Adversarial Network 生成式对抗网络-相关内容

    参考: https://baijiahao.baidu.com/s?id=1568663805038898&wfr=spider&for=pc Generative Adversari ...

  4. DacningLinks实现

    本文简单分析DancingLinks实现中的数据结构设计,给出了精确覆盖问题及其扩展问题的代码.并应用于数独问题. 先简单描写叙述一下精确覆盖问题: 给定一个N*M的01矩阵,从中选中若干行,这些行向 ...

  5. pagePiling.js - 创建美丽的全屏滚动效果

    在线演示 在线演示 本地下载 全屏滚动效果是近期很流行的网页设计形式,带给用户良好的视觉和交互体验. pagePiling.js 这款jQuery插件能够帮助前端开发者轻松实现这样的效果.支持全部的主 ...

  6. Linux性能诊断工具

    vmstat:虚拟内存状况 –swpd   free  buff  cache   si  so   in   cs 參考:http://www.cnblogs.com/ggjucheng/archi ...

  7. 【Mongodb教程 第三课 】MongoDB 删除数据库

    dropDatabase() 方法 MongoDB db.dropDatabase() 命令是用来删除一个现有的数据库. 语法: dropDatabase() 命令的基本语法如下: db.dropDa ...

  8. C控制台密码输入:输入一个字符显示一个星号

    要在c控制台中输入一个字符显示一个星号, 则不能用"stdio.h'提供的库函数,因为它们都是带回显的,比如getchar() getchar()用来接收输入的字符串,输入一个字符就回显一个 ...

  9. 20170111 ABAP技术小结(全半角转换)

    DATA: it_po LIKE it_alv OCCURS 0 WITH HEADER LINE.************************************************** ...

  10. 2.7 xargs和exec详解【转】

    本文转载自:http://ask.apelearn.com/question/13323 常用在查找中exec主要是和find一起配合使用,而xargs就要比exec用的地方要多了. exec  应用 ...