[APIO2018] New Home
题面在这里
description
在一个数轴上:
给定\(n\)个商店,每个商店有一个开业时间,关门时间,坐标和销售物品的种类
同时有\(m\)个询问,每个询问给你一个时间\(t[i]\)和地点\(d[i]\)试求在\(t[i]\)时刻,一个住在\(d[i]\)的人,为了买某种商品最远需要跑多长距离。
data range
\]
solution
\(Luogu\)评测机好评,我这种大力\(Splay\)都跑得过
把每一家商店存在的区间看成一组在数轴上的插入,删除操作,使用\(Splay\)记录每家商店前一家该种类型商店的位置\(pre\),用\(set\)记一下就可以了
询问的时候二分距离\(len\)问题即检查是否有一种商店不在\([d[i]-len,d[i]+len]\)内,
即求\(min_{(d[i]+len,\infty)}pre\),于是记录一个最小值就可以了
艰苦战斗
code
#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<complex>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
//#define TEST
#define FILE ""
#define mp make_pair
#define pb push_back
#define RG register
#define il inline
using namespace std;
typedef unsigned long long ull;
typedef vector<int>VI;
typedef long long ll;
typedef double dd;
const dd eps=1e-10;
const int mod=1e9+7;
const int N=1000010;
const int inf=1e9+7;
const dd pi=acos(-1);
il ll read(){
	RG ll data=0,w=1;RG char ch=getchar();
	while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
	if(ch=='-')w=-1,ch=getchar();
	while(ch<='9'&&ch>='0')data=data*10+ch-48,ch=getchar();
	return data*w;
}
il void file(){
	freopen(FILE"102","r",stdin);
	freopen(FILE"a.out","w",stdout);
}
int n,k,q,m,ans[N];
int x[N],t[N],a[N],b[N],l[N],y[N];
struct operators{
	int opt;//0表示插入一个商店,1表示询问,2表示删除一个商店
	int pos,tim,kind;
}Q[N];
bool cmp(operators a,operators b){
	if(a.tim==b.tim)return a.opt<b.opt;
	else return a.tim<b.tim;
}
il void init(){
	n=read();k=read();q=read();
	for(RG int i=1;i<=n;i++){
		x[i]=read();t[i]=read();a[i]=read();b[i]=read();
		Q[++m]=(operators){0,x[i],a[i],t[i]};
		Q[++m]=(operators){2,x[i],b[i],t[i]};
	}
	for(RG int i=1;i<=q;i++){
		l[i]=read();y[i]=read();
		Q[++m]=(operators){1,l[i],y[i],i};
	}
	sort(Q+1,Q+m+1,cmp);
}
struct store{int pos,id;};
bool operator <(store a,store b){return a.pos<b.pos;}
multiset<store>S[N];
multiset<store>::iterator tmp;
int tot,rt;
int fa[N],s[2][N],pre[N],minpre[N],pos[N];
#define isr(i) (s[1][fa[i]]==i)
il void update(RG int i){
	minpre[i]=pre[i];
	if(pre[s[0][i]]&&pos[minpre[i]]>pos[minpre[s[0][i]]])
		minpre[i]=minpre[s[0][i]];
	if(pre[s[1][i]]&&pos[minpre[i]]>pos[minpre[s[1][i]]])
		minpre[i]=minpre[s[1][i]];
}
il void rot(RG int i){
	RG int j=fa[i],k=fa[j];
	RG bool b=isr(i);
	if(k)s[isr(j)][k]=i;fa[i]=k;
	if(s[!b][i])fa[s[!b][i]]=j;s[b][j]=s[!b][i];
	fa[j]=i;s[!b][i]=j;
	update(j);
}
il void splay(int i,int a){
	for(RG int j=fa[i];j!=a;rot(i),j=fa[i])
		if(fa[j]!=a)isr(i)^isr(j)?rot(i):rot(j);
	if(!a)rt=i;update(i);
}
il void insert(int p){
	RG int i=rt,ff=0;
	while(i){ff=i;i=s[p>pos[i]][i];}
	if(!i)i=++tot;if(!ff)rt=i;
	else s[p>pos[ff]][ff]=i;
	if(ff)fa[i]=ff;pos[i]=p;
	splay(i,0);
}
il void find(int p){
	RG int i=rt;
	while(s[p>pos[i]][i])
		i=s[p>pos[i]][i];
	splay(i,0);
}
il int Nxt(int p,bool b){
	find(p);RG int i=rt;
	if(pos[i]>p&&b)return rt;
	if(pos[i]<p&&!b)return rt;
	i=s[b][rt];while(s[!b][i])i=s[!b][i];return i;
}
il void Delete(int i){
	splay(i,0);
	RG int nxt=s[0][i],lst=s[1][i];
	while(s[1][nxt])nxt=s[1][nxt];
	while(s[0][lst])lst=s[0][lst];
	splay(nxt,0);splay(lst,nxt);
	fa[i]=s[0][lst]=0;
	update(lst);update(nxt);
}
il int query(int l){
	RG int L=Nxt(l,0);splay(L,0);
	return pos[minpre[s[1][L]]];
}
il void Ins(int pos,int kind){
	insert(pos);splay(tot,0);
	tmp=S[kind].upper_bound((store){pos,0});
	minpre[tot]=pre[tot]=pre[tmp->id];
	minpre[tmp->id]=pre[tmp->id]=tot;
	splay(tot,0);splay(tmp->id,0);
	S[kind].insert((store){pos,tot});
}
il void Del(int pos,int kind){
	tmp=S[kind].upper_bound((store){pos,0});
	pre[tmp->id]=pre[pre[tmp->id]];splay(tmp->id,0);
	tmp--;Delete(tmp->id);
	S[kind].erase(tmp);
}
il int Qry(int pos){
	RG int l=0,r=100000000,mid,ret=-1;
	while(l<=r){
		mid=(l+r)>>1;
		if(query(pos+mid+1)>=pos-mid)
			ret=mid,r=mid-1;
		else l=mid+1;
	}
	return ret;
}
int main()
{
	init();pos[0]=-inf;
	for(RG int i=1;i<=k;i++){
		insert(-inf);update(tot);S[i].insert((store){-inf,tot});
		insert(inf);S[i].insert((store){inf,tot});
		minpre[tot]=pre[tot]=tot-1;update(tot);
	}
	for(RG int i=1;i<=m;i++){
		if(Q[i].opt==0)Ins(Q[i].pos,Q[i].kind);
		if(Q[i].opt==1)ans[Q[i].kind]=Qry(Q[i].pos);
		if(Q[i].opt==2)Del(Q[i].pos,Q[i].kind);
	}
	for(RG int i=1;i<=q;i++)printf("%d\n",ans[i]);
	return 0;
}
[APIO2018] New Home的更多相关文章
- 【APIO2018】铁人两项
		[APIO2018]铁人两项 题目描述 大意就是给定一张无向图,询问三元组\((s,c,f)\)中满足\(s\neq c\neq f\)且存在\((s\to c\to f)\)的简单路径(每个点最多经 ... 
- 【APIO2018】铁人两项(圆方树,动态规划)
		[APIO2018]铁人两项(圆方树,动态规划) 题面 UOJ 洛谷 BZOJ 题解 嘤嘤嘤,APIO的时候把一个组合数写成阶乘了,然后这题的70多分没拿到 首先一棵树是很容易做的,随意指定起点终点就 ... 
- 【APIO2018】新家(线段树)
		[APIO2018]新家(线段树) 题面 UOJ 洛谷 BZOJ 题解 论比赛时想不到二分的危害,就只能Cu滚粗 既然不要在线,那么考虑离线做法. 既然时间是区间,那么显然按照时间顺序处理答案. 显然 ... 
- CTSC/APIO2018滚粗记
		CTSC/APIO2018滚粗记 前言 从\(5.5\)晚上的火车到\(5.14\)早上的高铁 \(10\)天的时间真的过去的很快. 眨眼间,就到了今天晚上的颁奖. 至于结果如何,反而并不是那么重要了 ... 
- CTSC2018&APIO2018游记
		CTSC2018&APIO2018游记 Day 0 傍晚出发,从长沙通往帝都的软卧哟. 然而长沙某中学坐高铁比我们晚出发还早到 Day 1 为了正经地写游记我决定忍住不在博客里吐槽酒店. 午饭 ... 
- APIO2018酱油记
		苟比主席树太难了学不会 还是把APIO几天的过程记下来吧...免得忘了 DAY -5 去CTSC的人都走了,机房好冷清...只有我.PSB.yasar.Chlience四个人 CSTC辣么难又辣么贵, ... 
- [APIO2018] Duathlon 铁人两项 圆方树,DP
		[APIO2018] Duathlon 铁人两项 LG传送门 圆方树+简单DP. 不会圆方树的话可以看看我的另一篇文章. 考虑暴力怎么写,枚举两个点,答案加上两个点之间的点的个数. 看到题面中的一句话 ... 
- 【LG4631】[APIO2018]Circle selection 选圆圈
		[LG4631][APIO2018]Circle selection 选圆圈 题面 洛谷 题解 用\(kdt\)乱搞剪枝. 维护每个圆在\(x.y\)轴的坐标范围 相当于维护一个矩形的坐标范围为\([ ... 
- LOJ #2585. 「APIO2018」新家
		#2585. 「APIO2018」新家 https://loj.ac/problem/2585 分析: 线段树+二分. 首先看怎样数颜色,正常的时候,离线扫一遍右端点,每次只记录最右边的点,然后查询左 ... 
- 「APIO2018新家」
		「APIO2018新家」 题目描述 五福街是一条笔直的道路,这条道路可以看成一个数轴,街上每个建筑物的坐标都可以用一个整数来表示.小明是一位时光旅行者,他知道在这条街上,在过去现在和未来共有 \(n\ ... 
随机推荐
- javaScript 字符串与unicode码之间的相互转换,函数的封装
			在我们的开发过程中,有时在对数据进行储存的时候,我们需要将字符串转成unicode. 比如,在jsp开发时,前端使用页面间传值时,将传值参数先存入cookie中,然后在使用的时候,再从ookie中取出 ... 
- p标签内不能含有块元素。
			原来一直听网上这样说.自己并没有实际遇到过.上例子. <!DOCTYPE html> <html> <head> <meta charset="ut ... 
- com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column
			com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column …… 出现这个异常的很大可能性是 数据库是没有问题的 ... 
- linux-课题练习1
			1.创建组testgroup: 2.创建用户a2012,先采用默认设置创建,然后使该用户加入testgroup组. 3.创建用户a2013,其用户主目录为/tmp/a2013,其主组为testgrou ... 
- Hadoop数据倾斜及解决办法
			数据倾斜:就是大量的相同key被partition分配到一个分区里,map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间 ... 
- 四大IO抽象类
			四大IO抽象类 InputStream/OutputStream和Reader/writer类是所有IO流类的抽象父类,我们有必要简单了解一下这个四个抽象类的作用.然后,通过它们具体的子类熟悉相 ... 
- L007- linux系统优化进阶课堂小节
			首先把这节课所讲的大概引锁一下,然后下面详细列举. 1.填加普通用户,通过sudo管理. 2.更改默认的SSH服务端口及禁止root用户远程连接. 3.定时自动更新服务器时间 4.关闭防火墙(ipta ... 
- C#属性默认值设置
			关于在MVC中view中设置默认值,可以象如下设置: 1.关于VIEWMODEL的部分 如果是C# 6.0,网上资料查到说可以 如果语法不支持,只能改回.net 2.0的写法. public cla ... 
- 网页设计简史看设计&代码“隔膜”
			本文来自网易云社区 作者:马宝 设计与代码之间隔膜所在?既然你诚心诚意地问了,我就大发慈悲地告诉你.为了防止地球被破坏,为了维护世界的和平,为了贯彻爱与真实的邪恶~,我是穿梭在前端与设计之间爱与美丽的 ... 
- mybatis <collection>标签 类型为string时无法获取重复数据错误
			1.场景: fyq_share_house 表 和 fyq_sh_tag 表 两张表是一对多的关系, 一个楼盘对应多个标签,在实体类ShareHouse中使用 /** * 楼盘标签 */ privat ... 
