Codeforces 610D Vika and Segments 线段树+离散化+扫描线
可以转变成上一题(hdu1542)的形式,把每条线段变成宽为1的矩形,求矩形面积并
要注意的就是转化为右下角的点需要x+1,y-1,画一条线就能看出来了
#include<bits/stdc++.h>
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f; int mark[N<<];//某区间下底边个数
ll sum[N<<];//某区间下底边总长度
ll Hash[N];//离散化数组
//把横坐标作为线段进行扫描
//扫描是为了更新下底边个数和下底边总长度,记录答案
struct tree{
ll l,r,h;//l,r左右端点,h从x轴到该边的高
int d;//-1上底边/1下底边
tree(){}
tree(ll x,ll y,ll z,int a):l(x),r(y),h(z),d(a){}
bool operator <(const tree &a)const
{
return h<a.h;
}
}s[N];
void pushup(int l,int r,int rt)
{
if(mark[rt])sum[rt]=Hash[r+]-Hash[l];
else if(l==r)sum[rt]=;
else sum[rt]=sum[rt<<]+sum[rt<<|];
}
void update(int L,int R,int d,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
mark[rt]+=d;//如果是上底边mark-1,下底边mark+1
pushup(l,r,rt);
return ;
}
int m=(l+r)>>;
if(L<=m)update(L,R,d,ls);
if(R>m)update(L,R,d,rs);
pushup(l,r,rt);
}
int Search(ll key,int n)
{
int l=,r=n-;
while(l<=r)
{
int m=(l+r)/;
if(Hash[m]==key)return m;
if(Hash[m]>key)r=m-;
else l=m+;
}
return -;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
cout<<setiosflags(ios::fixed)<<setprecision();
int n;
cin>>n;
int k=;
for(int i=; i<n; i++)
{
ll x1,x2,y1,y2;
cin>>x1>>y1>>x2>>y2;
if(x1==x2)
{
if(y1<y2)swap(y1,y2);
x2++;
y2--;
}
else
{
if(x1>x2)swap(x1,x2);
x2++;
y2--;
}
Hash[k]=x1;
s[k++]= {x1,x2,y1,}; //上底边
Hash[k]=x2;
s[k++]= {x1,x2,y2,-}; //下底边
}
sort(Hash,Hash+k);
sort(s,s+k);
int m=;
for(int i=; i<k; i++) //离散化
if(Hash[i]!=Hash[i-])
Hash[m++]=Hash[i];
ll ans=;
memset(sum,,sizeof sum);
memset(mark,,sizeof mark);
for(int i=; i<k; i++) //如果两个下底边重合,但是上底边可能不一样,必须更新mark,而sum不会改变
{
int l=Search(s[i].l,m);//利用hash表查找
int r=Search(s[i].r,m)-;//这里的l,r实际上是Hash表的标号
update(l,r,s[i].d,,m-,);//维护mark和sum的值
ans+=sum[]*(s[i+].h-s[i].h);//sum[1]当前的下底边长度总和
}
cout<<ans<<endl;
return ;
}
/********************* *********************/
Codeforces 610D Vika and Segments 线段树+离散化+扫描线的更多相关文章
- hdu1542 矩形面积并(线段树+离散化+扫描线)
题意: 给你n个矩形,输入每个矩形的左上角坐标和右下角坐标. 然后求矩形的总面积.(矩形可能相交). 题解: 前言: 先说说做这道题的感受: 刚看到这道题顿时就懵逼了,几何 烂的渣渣.后来从网上搜题解 ...
- 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)
[POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- Codeforces Round #337 (Div. 2) D. Vika and Segments (线段树+扫描线+离散化)
题目链接:http://codeforces.com/contest/610/problem/D 就是给你宽度为1的n个线段,然你求总共有多少单位的长度. 相当于用线段树求面积并,只不过宽为1,注意y ...
- Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树扫描线
D. Vika and Segments 题目连接: http://www.codeforces.com/contest/610/problem/D Description Vika has an i ...
- Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树 矩阵面积并
D. Vika and Segments Vika has an infinite sheet of squared paper. Initially all squares are whit ...
- Codeforces 1108E (Array and Segments) 线段树
题意:给你一个长度为n的序列和m组区间操作,每组区间操作可以把区间[l, r]中的数字都-1,请选择一些操作(可以都不选),使得序列的最大值和最小值的差值尽量的大. 思路:容易发现如果最大值和最小值都 ...
- POJ1151Atlantis 矩形面积并[线段树 离散化 扫描线]
Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21734 Accepted: 8179 Descrip ...
- POJ 1151Atlantis 矩形面积并[线段树 离散化 扫描线]
Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21734 Accepted: 8179 Descrip ...
- hdu1542线段树+离散化+扫描线
参考博客: http://blog.csdn.net/xingyeyongheng/article/details/8927732 总的来说就是用一条(假想的)线段去平行x轴从下往上扫描,扫描的过程中 ...
随机推荐
- python面试题(七)
1 什么是局域网.广域网.城域网? ①局域网LAN(Local Area Network):一般指覆盖范围在10公里以内,一座楼房或一个单位内部的网络.由于传输距离直接影响传输速度,因此,局域网内的通 ...
- xx云网络实施方案案例
由于xx云在我公司进行试用,对接我方存储,于是乎就负责网络实施方案,下面是具体方案介绍 ip分配 具体网络拓扑如下: 下面是两台交换机配置 IPMI交换机配置如下: [Quidway]di cu !S ...
- 0201-开始使用Spring Cloud实战微服务准备工作
1.Spring Cloud是什么 基于spring boot,之上快速构建分布式系统的工具集 服务注册和发现[eureka.Consul.Zookeeper].服务负载均衡[Ribbon,feign ...
- Java基础—序列化与反序列化(转载)
转载自: Java序列化与反序列化 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化 ...
- 剑指offer 面试15题
面试15题: 题目:二进制中1的个数 题:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解题思路一: 最佳方法:把一个整数减去1,再和原整数做“与运算”,会把该整数最右边的1变成0 ...
- gearman管理
通常,Gearman被用来分发任务,以便实现异步操作.下面捋捋如何管理Gearman. 说明:请自行安装好Gearman和PHP PECL Gearman. (我之前安装的gearman php的c语 ...
- asp.net mvc webform和razor的page基类区别
接触过asp.net mvc的都知道,在传统的webform的模式下,page页面的基类是这样声明的: <%@ Page Language="C#" MasterPageFi ...
- npm-folders
npm-folders Executable(可执行程序) 在全局模式下,可执行程序被链接到Unix的{prefix}/bin目录下,或者是Windows的{prefix}目录下. 在本地模式下,可执 ...
- SpringMVC:学习笔记(4)——处理模型数据
SpringMVC—处理模型数据 说明 SpringMVC 提供了以下几种途径输出模型数据: – ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添 ...
- Eclipse运行错误:Failed to load the JNI shared library的解决办法
出现上述错误的原因是环境变量配置出问题,查看JAVA_HOME这一环境变量的值是否正确. 操作步骤如下, 1.右键“我的电脑”->属性 ↓ 2.打开“高级系统设置”,如下图: ↓ 3.选择“环境 ...