题目来源: IOI 1998
基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题
 收藏
 关注
给出平面上的N个矩形(矩形的边平行于X轴和Y轴),求这些矩形组成的所有多边形的周长之和。

 
 
例如:N = 7。(矩形会有重叠的地方)。
 
合并后的多边形:
 
 
多边形的周长包括里面未覆盖部分方块的周长。
Input
第1行:1个数N。(2 <= N <= 50000)
第2 - N + 1行,每行4个数,中间用空格分隔,分别表示矩形左下和右上端点的坐标。(-1000000 <= X[i], Y[i] <= 1000000)
Output
输出多边形的周长。
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
Output示例
228

思路:
矩阵周长并模板题,hdu1828不需要离散化。。51nod上数据范围变大了需要离散化处理,写法和矩阵面积并差不多,多加了几个数组维护。
#include<bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mid int m = (l + r) >> 1
const int M = 1e5+;
int cnt[M<<]; //表示这个区间被重复覆盖了几次
int len[M<<]; // 这个区间被覆盖的长度
int lp[M<<],rp[M<<]; //标记量,表示这个节点左右两个端点没有被覆盖,有则为1,无为0
int num[M<<]; //这个区间被多少线段覆盖
int x[M<<];
struct node{
int h,l,r;
int s;
node(){}
node(int a,int b,int c,int d):l(a),r(b),h(c),s(d){}
bool operator < (const node &cmp) const {
if(h == cmp.h) return s > cmp.s;
return h < cmp.h;
}
}t[M<<]; void pushup(int l,int r,int rt){
if(cnt[rt]){
lp[rt] = rp[rt] = ;
num[rt] = ;
len[rt] = x[r+] - x[l];
}
else if(l == r){
num[rt] = len[rt] = lp[rt] = rp[rt] = ;
}
else{
lp[rt] = lp[rt<<];
rp[rt] = rp[rt<<|];
len[rt] = len[rt<<] + len[rt<<|];
num[rt] = num[rt<<] + num[rt<<|];
if(lp[rt<<|]&&rp[rt<<]) num[rt] -= ; // 左右两边两条线重合,变成一条线段
}
} void update(int L,int R,int c,int l,int r,int rt){
if(L <= l&&R >= r){
cnt[rt] += c;
pushup(l,r,rt);
return;
}
mid;
if(L <= m) update(L,R,c,lson);
if(R > m) update(L,R,c,rson);
pushup(l,r,rt);
} int main()
{
int n;
while(cin>>n){
int m = ;
while(n--){
int a,b,c,d;
cin>>a>>b>>c>>d;
x[m] = a;
t[m++] = node(a,c,b,);
x[m] = c;
t[m++] = node(a,c,d,-);
}
int k = ;
sort(x,x+m); sort(t,t+m);
for(int i = ;i < m;i ++){
if(x[i] != x[i-]) x[k++] = x[i];
}
memset(cnt,,sizeof(cnt));
memset(num,,sizeof(num));
int ret = ,last = ;
for(int i = ;i < m;i ++){
int l = lower_bound(x,x+k,t[i].l)-x;
int r = lower_bound(x,x+k,t[i].r)-x-;
if(l <= r) update(l,r,t[i].s,,k-,);
ret += num[]*(t[i+].h - t[i].h);
ret += abs(len[] - last);
last = len[];
}
cout<<ret<<endl;
}
return ;
}

51nod 1206 && hdu 1828 Picture (扫描线+离散化+线段树 矩阵周长并)的更多相关文章

  1. HDU 4419 Colourful Rectangle --离散化+线段树扫描线

    题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积. 解法: 很容易想到线段树扫描线求矩形面积并,但是如何 ...

  2. Atlantis HDU - 1542 (扫描线,线段树)

    扫描线的模板题,先把信息接收,然后排序,记录下上边和下边,然后用一条虚拟的线从下往上扫.如果我扫到的是下边,那么久用线段树在这个区间内加上1,表示这个区间现在是有的,等我扫描到上边的时候在加上-1,把 ...

  3. poj 2482 Stars in Your Window + 51Nod1208(扫描线+离散化+线段树)

    Stars in Your Window Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13196   Accepted:  ...

  4. HDU 1828 Picture(长方形的周长和)

    HDU 1828 Picture 题目链接 题意:给定n个矩形,输出矩形周长并 思路:利用线段树去维护,分别从4个方向扫一次,每次多一段的时候,就查询该段未被覆盖的区间长度,然后周长就加上这个长度,4 ...

  5. 南阳理工 题目9:posters(离散化+线段树)

    posters 时间限制:1000 ms  |  内存限制:65535 KB 难度:6   描述 The citizens of Bytetown, AB, could not stand that ...

  6. 【POJ】2528 Mayor's posters ——离散化+线段树

    Mayor's posters Time Limit: 1000MS    Memory Limit: 65536K   Description The citizens of Bytetown, A ...

  7. 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树

    [BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...

  8. SGU 180 Inversions(离散化 + 线段树求逆序对)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=180 解题报告:一个裸的求逆序对的题,离散化+线段树,也可以用离散化+树状数组.因为 ...

  9. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

随机推荐

  1. JAVA程序员必看的15本书-JAVA自学书籍推荐

    作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水 ...

  2. Oracle出现与并行相关的ORA-00600时的调查方法

    出现了 ORA-00600[kxfpqsod_qc_sod], 如何调查呢? 例如:从trace 文件的 Call Stack,可以看到 Error: ORA-600 [kxfpqsod_qc_sod ...

  3. 对C++多态的一点理解

    作为一个C++新手,我浅谈一下我对多态的一点理解. 首先,引用几句话: 1.继承是一种抽象,它允许程序员在某些时候忽略相似对象的差异,又在其他时候利用这些差异.——<C++沉思录> 2.继 ...

  4. Kubernetes学习之路(十九)之Kubernetes dashboard认证访问

    Dashboard:https://github.com/kubernetes/dashboard 一.Dashboard部署 由于需要用到k8s.gcr.io/kubernetes-dashboar ...

  5. 基于vue全家桶制作的移动端音乐WebApp

    Vue.js 2.0实战项目 基于Vue + Vuex + Vue-router + Webpack 2.0 打造移动端音乐WebAPP,实现了轮播图.音乐推荐.歌手列表.音乐搜索.注册等功能. 技术 ...

  6. python常用算法实现

    排序是计算机语言需要实现的基本算法之一,有序的数据结构会带来效率上的极大提升. 1.插入排序 插入排序默认当前被插入的序列是有序的,新元素插入到应该插入的位置,使得新序列仍然有序. def inser ...

  7. 基于HTTPS的中间人攻击-BaseProxy

    前言 在上一篇文章BaseProxy:异步http/https代理中,我介绍了自己的开源项目BaseProxy,这个项目的初衷其实是为了渗透测试,抓包改包.在知识星球中,有很多朋友问我这个项目的原理及 ...

  8. js的各种正则表达式

    验证各种手机包括成都"028-"开头的座机号验证 if (!(/^(16[8]|13[0-9]|15[0|3|6|7|8|9]|18[7])\d{8}|(028-)\d{7}$/. ...

  9. jmeter:正则表达式的使用

    Jmeter中正则关联的使用是可以提取动态变化数据进行传递:关联的方式和提取器有多种,这篇先讲解正则表达式怎么来关联(?) 在需要获取数据的http请求上添加后置处理器 比如提取百度title值: 正 ...

  10. Python3 str去除空格

    一.去除str两端空格(strip()) a.去除左端空格  lstrip() str0='abcdef' str1=' abcdef' print(str0) print(str1.lstrip() ...