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线程包装器
import threading import subprocess import time def need_thread(func, *args, **kwargs): def fun(): pr ...
- Can’t connect to local MySQL server through socket 解决办法
启动mysql 报错: ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/m ...
- 20170413 F110学习
F110 学习: Tcode: F110 自动付款业务, FBZP 维护收付程序设置 FBL1N 供应商行项目 XK03 显示供应商(银行信息维护) F110 ...
- (扫盲)DTO数据传输对象
DTO即数据传输对象.但从定义上看就是简单的用来传递数据的.主要用途是在框架中定义DTO来绑定表现层中的数据.学过MVC.EF实体模型的都应该知道,我们可以定义一个Model实体来实现前后台数据的交互 ...
- 【AWS】订阅AWS论坛的RSS消息获取最新公告
背景:AWS在遇到系统升级.系统故障等问题的时候,会在其官方论坛发布通知,并同步到RSS 前言:我们在项目中遇到几次AWS的RDS出现故障导致系统受影响,当系统故障时,我们的监控系统会发送一堆告警出来 ...
- LeetCode:二叉树的层次遍历||【107】
LeetCode:二叉树的层次遍历||[107] 题目描述 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如:给定二叉树 [3,9,2 ...
- LeetCode:对角线遍历【498】
LeetCode:对角线遍历[498] 题目描述 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 示例: 输入: [ [ ...
- 防止基本的XSS攻击 滤掉HTML标签
/** * 防止基本的XSS攻击 滤掉HTML标签 * 将HTML的特殊字符转换为了HTML实体 htmlentities * 将#和%转换为他们对应的实体符号 * 加上了$length参数来限制提交 ...
- Mac 环境 下使用Charles 抓包Http/Https请求
实现目标 在Mac 上 对 iOS 真机 和 模拟器 进行 Http/Https抓包 使用工具 Mac 上 Charles 4.2 安装 参考链接 1. 和 链接 2. 抓包 http 请求 (1 ...
- Linux下32位与64位数据类型大小
Redhat Enterprise Linux 32 Redhat Enterprise Linux 64