51nod 1206 && hdu 1828 Picture (扫描线+离散化+线段树 矩阵周长并)


第1行:1个数N。(2 <= N <= 50000)
第2 - N + 1行,每行4个数,中间用空格分隔,分别表示矩形左下和右上端点的坐标。(-1000000 <= X[i], Y[i] <= 1000000)
输出多边形的周长。
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
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 (扫描线+离散化+线段树 矩阵周长并)的更多相关文章
- HDU 4419 Colourful Rectangle --离散化+线段树扫描线
题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积. 解法: 很容易想到线段树扫描线求矩形面积并,但是如何 ...
- Atlantis HDU - 1542 (扫描线,线段树)
扫描线的模板题,先把信息接收,然后排序,记录下上边和下边,然后用一条虚拟的线从下往上扫.如果我扫到的是下边,那么久用线段树在这个区间内加上1,表示这个区间现在是有的,等我扫描到上边的时候在加上-1,把 ...
- poj 2482 Stars in Your Window + 51Nod1208(扫描线+离散化+线段树)
Stars in Your Window Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13196 Accepted: ...
- HDU 1828 Picture(长方形的周长和)
HDU 1828 Picture 题目链接 题意:给定n个矩形,输出矩形周长并 思路:利用线段树去维护,分别从4个方向扫一次,每次多一段的时候,就查询该段未被覆盖的区间长度,然后周长就加上这个长度,4 ...
- 南阳理工 题目9:posters(离散化+线段树)
posters 时间限制:1000 ms | 内存限制:65535 KB 难度:6 描述 The citizens of Bytetown, AB, could not stand that ...
- 【POJ】2528 Mayor's posters ——离散化+线段树
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Description The citizens of Bytetown, A ...
- 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树
[BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...
- SGU 180 Inversions(离散化 + 线段树求逆序对)
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=180 解题报告:一个裸的求逆序对的题,离散化+线段树,也可以用离散化+树状数组.因为 ...
- HDU 3016 Man Down (线段树+dp)
HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
随机推荐
- OpenGL笔记(二) 渲染管线
GLSL着色器代码分为两个部分,即Vertex Shader(顶点着色器)与Fragment Shader(片元着色器). 上下文环境搭建 OGL不负责窗口管理与上下文环境管理,该职责由平台完成.在A ...
- 基于LBS平台的iOS开发
LBS,即Location Based Services,基于位置服务,用于定位.导航等功能,比如地图应用.订外卖等的app就需要这个功能. 在这里我使用的是高德LBS开放平台,地址:http://l ...
- NYOJ 35 表达式求值
一个模板了 哈哈. 这题由于已经包括了整形.浮点形了,以后也不须要特别处理了. /* 这里主要是逆波兰式的实现,使用两个stack 这里用字符串来模拟一个stack,第一步,将中缀表达式转变为后缀表达 ...
- TClientDataSet 提交时提示 Field value Required 但是未提示具体哪个字段。
TClientDataSet 提交时提示 Field value Required 但是未提示具体哪个字段. 这个错误特别麻烦,要使用 midas 控件时,虽然很方便.但是出错了根本找不到原因,特别是 ...
- # 2017-2018-2 20155319『网络对抗技术』Exp2:后门原理与实践
2017-2018-2 20155319『网络对抗技术』Exp2:后门原理与实践 1.实验准备 一.实验说明 任务一:使用netcat获取主机操作Shell,cron启动 (0.5分) 任务二:使用s ...
- JavaEE笔记(十一)
Spring beans使用参数占位符(JDBC配置读取示例) beans.xml配置文件 <?xml version="1.0" encoding="UTF-8& ...
- 解决debug到jdk源码时不能查看变量值的问题
目录 如何跟踪jdk源码 1. 编译源码 2. 关联源码 3. 大功告成 如何跟踪jdk源码 看到这个标题大概大家都会在心里想谁还跟踪个源码呀,在eclipse中打个断点,以debug的方式运行,然后 ...
- [agc011C]Squared Graph-[二分图]
Description 传送门 Solution 我们以下考虑的情况都是原图中非孤立的点. 题目要求新图的连通块个数.这个不好算,我们考虑计算新图的联通块内的特征点(x,y),即无法通过移动找到(t, ...
- 为什么要进行阿里云云计算助理工程师认证(ACA)
阿里云助理工程师认证(ACA - Alibaba Cloud Certification Associate)是面向使用阿里云基础产品的专业技术认证,主要涉及阿里云的计算.存储.网络.安全类的核心产品 ...
- 利用Kinect实现用指尖隔空控制鼠标(源码放出)
简介 此程序为利用Kinect实现用手指隔空控制鼠标,是我另一个项目的一部分,因为在另外那个项目中鼠标的click是通过一种特殊的方式实现的,因此这个程序只实现了用手控制鼠标的移动,并没有点击的功能. ...