BZOJ4662 : Snow
首先离散化,即相邻关键点之间的部分可以压成一段。
注意到区间互不包含,因此排序后每个位置的清理影响到的是一段连续区间的清理工的工作长度。
这显然可以用线段树维护,支持区间减去一个数,单点加上$inf$,以及查询全局最小值。
对于每次清理,暴力枚举区间内所有没清理过的段,在线段树中区间修改,用并查集进行路径压缩即可。
时间复杂度$O(n\log n)$。
#include<cstdio>
#include<algorithm>
using namespace std;
typedef pair<int,int>P;
const int N=300010,M=1050000,inf=1000000010;
int n,m,i,j,x,b[N<<1],f[N<<1],tag[M];P v[M];struct E{int l,r;}a[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add(int x,int p){v[x].first+=p;tag[x]+=p;}
inline void pb(int x){if(tag[x])add(x<<1,tag[x]),add(x<<1|1,tag[x]),tag[x]=0;}
void build(int x,int a,int b){
if(a==b){v[x]=P(::a[a].r-::a[a].l,a);return;}
int mid=(a+b)>>1;
build(x<<1,a,mid),build(x<<1|1,mid+1,b);
v[x]=min(v[x<<1],v[x<<1|1]);
}
void del(int x,int a,int b,int c){
if(a==b){v[x].first+=inf;return;}
pb(x);
int mid=(a+b)>>1;
if(c<=mid)del(x<<1,a,mid,c);else del(x<<1|1,mid+1,b,c);
v[x]=min(v[x<<1],v[x<<1|1]);
}
void change(int x,int a,int b,int c,int d,int p){
if(c<=a&&b<=d){add(x,p);return;}
pb(x);
int mid=(a+b)>>1;
if(c<=mid)change(x<<1,a,mid,c,d,p);
if(d>mid)change(x<<1|1,mid+1,b,c,d,p);
v[x]=min(v[x<<1],v[x<<1|1]);
}
int F(int x){return f[x]==x?x:f[x]=F(f[x]);}
inline int lower(int x){
int l=1,r=m,mid,t;
while(l<=r)if(b[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
return t;
}
inline int getl(int c,int d){
int l=1,r=n,mid,t;
while(l<=r){
mid=(l+r)>>1;
if(a[mid].r<=c)l=mid+1;
else if(a[mid].l>=d)r=mid-1;
else r=(t=mid)-1;
}
return t;
}
inline int getr(int c,int d){
int l=1,r=n,mid,t;
while(l<=r){
mid=(l+r)>>1;
if(a[mid].r<=c)l=mid+1;
else if(a[mid].l>=d)r=mid-1;
else l=(t=mid)+1;
}
return t;
}
inline void clean(int l,int r){
int x=lower(l);
while(1){
x=F(x);
if(b[x]>=r)return;
f[x]++;
change(1,1,n,getl(b[x],b[x+1]),getr(b[x],b[x+1]),b[x]-b[x+1]);
}
}
int main(){
read(n);read(n);
for(i=1;i<=n;i++){
read(a[i].l),read(a[i].r);
b[++m]=a[i].l,b[++m]=a[i].r;
}
sort(b+1,b+m+1);
for(i=1;i<=m;i++)if(b[i]!=b[i-1])b[++j]=b[i];
m=j;
for(i=1;i<=m;i++)f[i]=i;
build(1,1,n);
for(i=1;i<=n;i++){
x=v[1].second;
printf("%d\n",x);
del(1,1,n,x);
clean(a[x].l,a[x].r);
}
return 0;
}
BZOJ4662 : Snow的更多相关文章
- POJ 3349 Snowflake Snow Snowflakes(简单哈希)
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 39324 Accep ...
- Snowflake Snow Snowflakes(哈希表的应用)
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 27312 Accep ...
- poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 30529 Accep ...
- POJ 3349 Snowflake Snow Snowflakes
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 27598 Accepted: ...
- POJ 3349:Snowflake Snow Snowflakes(数的Hash)
http://poj.org/problem?id=3349 Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K T ...
- 哈希-Snowflake Snow Snowflakes 分类: POJ 哈希 2015-08-06 20:53 2人阅读 评论(0) 收藏
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 34762 Accepted: ...
- [poj3349]Snowflake Snow Snowflakes(hash)
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 37615 Accepted: ...
- Codeforces Round #339 Div.2 C - Peter and Snow Blower
Peter got a new snow blower as a New Year present. Of course, Peter decided to try it immediately. A ...
- Codeforces Round #339 (Div. 1) A. Peter and Snow Blower 计算几何
A. Peter and Snow Blower 题目连接: http://www.codeforces.com/contest/613/problem/A Description Peter got ...
随机推荐
- 【SSO单点系列】(1):CAS4.0 环境的搭建
一.概述 今天开始写CAS相关的第一篇文章,这篇文章主要是关于CAS环境的搭配,提供给刚刚接触CAS的一个入门指南,并演示一个CAS的最简单的实例 二.环境要求 博主的环境如下: win8.1 64 ...
- 体系结构设计MVC
体系结构设计MVC(viso图)GIT: https://coding.net/u/lklzjh/p/travel/git/blob/master/%E4%BD%93%E7%B3%BB%E7%BB%9 ...
- iOS 判断第一个字符是数字还是汉字
NSString *titleStr = @"琳小兮"; //先截取字符串,拿到第一个字符 NSString *firstStr = [titleStr s ...
- 【20140113-2】MyEclipse生成javadoc时出错:编码GBK的不可映射字符
今天生成java doc文档时,出现了如下所示的错误: 正在装入软件包 com.wisdom.test 的源文件...F:\workspace\StringUtils\src\com\wisdom\t ...
- Oracle锁定和解锁用户的命令
转:http://database.51cto.com/art/200910/158576.htm 在DBA的日常工作中,经常遇到为Oracle用户解锁的操作:这篇文章给出在命令行下进行Oracle用 ...
- PostgreSQL的时间/日期函数使用
PostgreSQL的常用时间函数使用整理如下: 一.获取系统时间函数 1.1 获取当前完整时间 select now(); david=# select now(); now ----------- ...
- 攻城狮在路上(肆)How tomcat works(三) 连接器:Connector
在介绍中提到,Catalina中有两个主要的模块:连接器和容器.本章中你将会写一个可以创建更好的请求和响应对象的连接器,用来改进第2章中的程序.一个符合Servlet 2.3和2.4规范的连接器必须 ...
- [Tools] maven-eclipse安装及配置
[背景] 买了个surface,带到公司当做开发机器来用,各种环境都需要重新安装,写个笔记记录下maven安装步骤,虽然很简单,但是我这脑子,容易忘记,写下来以备用 [开工] 安装Maven 访问 M ...
- SQL Server 2016将内置R语言?
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:随着大数据成为一个BuzzWord,和大数据相关的技术也变得越来越火热,其中就包括R语 ...
- mysql无法远程连接的解决方法
在阿里云服务器上安装好MySQL后,首先想到的就是安装一款工具来管理数据库,一开始选择了phpMyAdmin,这个工具安装很简单,只要解压到能访问的目录下就行了.在浏览器中访问phpMyAdm ...