[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\ ...
随机推荐
- 【linux基于Postfix和Dovecot邮件系统的搭建】
一:PostFixe和Dovecot的简单介绍 Postfix postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件.postfix是Wietse Ven ...
- C#5.0异步编程 HttpClient IP代理验证原码
//访问HttpClient 代码 public async Task<string> VerifyProxy(string url, string proxy = "" ...
- 第五课:PHP echo和print 语句
PHP echo 和 print 语句 PHP 是通过 print 和 echo 语句来动态输出 HTML 内容,虽然 print 和 echo 语句两者的功能几乎是完全一样,但是还是有一点差别的. ...
- Go web表单验证
开发Web的一个原则就是,不能信任用户输入的任何信息,所以验证和过滤用户的输入信息就变得非常重要 必填字段 if len(r.Form["username"][0])==0{ // ...
- 001---C/S架构
C/S 架构介绍 什么是C/S架构 C:client,客户端 S:server,服务端 实现客户端和服务端之间的网络通信 什么是网络 人与人之间交流是通过语言,才能彼此理解对方的意思.但是地球上有多个 ...
- Java8新特性(一)——Lambda表达式与函数式接口
一.Java8新特性概述 1.Lambda 表达式 2. 函数式接口 3. 方法引用与构造器引用 4. Stream API 5. 接口中的默认方法与静态方法 6. 新时间日期 API 7. 其他新特 ...
- Scala学习笔记(四):从文件里读取文本行
第一个版本: import scala.io.Source if(args.length>0){ for(line<-Source.fromFile(args(0)).getLines) ...
- hdu1505City Game(动态规划)
City Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- Qt 加载Leap motion 手势识别软件 二次开发 hello world
研发需要对收拾是被进行精确定位,实现收拾的识别,和在虚拟现实中精确的显示手势在实际世界中的位置. 开始使用的Qt mingw的版本开发,总是函数没有定义,最后发现是leap sdk中需要代育vs的库文 ...
- Selenium驱动Firefox浏览器
用Maven构建Selenium依赖: <dependency> <groupId>org.seleniumhq.selenium</groupId> <ar ...