2018牛客多校6 - I Team Rocket KD树维护空间
题意:给出n条铁路区间\([L,R]\),共有m个boom依时间顺序放置在\(k_i\)中,区间与\(k_i\)有交集的都被炸掉
求每次炸掉的铁路个数和最后输出所有id被炸的时间点
炸弹能炸到的区间满足\(L≤K≤R\)
因为\(L\)与\(R\)无关,将其关系改写为\(X≤K≤Y\),
对应于二维空间,铁路区间相当于一个点\((L,R)\),每次询问有多少个没被屏蔽的点满足\(X≤K\)且\(K≤Y\)
然后KD树乱搞剪枝就好
唯一的问题是屏蔽掉的点无法在push_up时再次更新两个维度的极左极右值\(lx,rx\)(要么再多维护次左次右值)
幸好没被卡(反而跑的贼快
#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define rrep(i,j,k) for(register int i=j;i>=k;i--)
#define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
#define print(a) printf("%lld",(ll)a)
#define println(a) printf("%lld\n",(ll)a)
#define printbk(a) printf("%lld ",(ll)a)
#define IOS ios::sync_with_stdio(0)
using namespace std;
const int MAXN = 3e5+11;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-7;
typedef long long ll;
const ll MOD = 998244353;
ll read(){
ll x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int D,CLOCK;
int ans[MAXN];
ll sum,prod;
struct POINT{
int x[2],idx;
bool operator < (const POINT &rhs) const{
return x[D]<rhs.x[D];
}
}p[MAXN];
struct KD{
int lx[MAXN][2],rx[MAXN][2];
int son[MAXN][2],size[MAXN];
int mark[MAXN];
int root;
#define lc son[o][0]
#define rc son[o][1]
void pu(int o){
size[o]=mark[o];
if(lc) size[o]+=size[lc];
if(rc) size[o]+=size[rc];
rep(i,0,1){
if(lc&&lx[lc][i]<lx[o][i]) lx[o][i]=lx[lc][i];
if(rc&&lx[rc][i]<lx[o][i]) lx[o][i]=lx[rc][i];
if(lc&&rx[lc][i]>rx[o][i]) rx[o][i]=rx[lc][i];
if(rc&&rx[rc][i]>rx[o][i]) rx[o][i]=rx[rc][i];
}
}
int build(int d,int l,int r){
int mid=l+r>>1; D=d; mark[mid]=1;
nth_element(p+l,p+mid,p+r+1);
rep(i,0,1) lx[mid][i]=rx[mid][i]=p[mid].x[i];
size[mid]=1;son[mid][0]=son[mid][1]=0;
if(l<mid) son[mid][0]=build(d^1,l,mid-1);
if(r>mid) son[mid][1]=build(d^1,mid+1,r);
pu(mid);
return mid;
}
void query(int o,int k){
if(!o) return;
if(!size[o]) return;
if(lx[o][0]>k||rx[o][1]<k) return;
if(mark[o]&&p[o].x[0]<=k&&p[o].x[1]>=k){
ans[p[o].idx]=CLOCK;
sum++; prod=(prod*p[o].idx)%MOD;
mark[o]=0;
}
if(lc) query(lc,k);
if(rc) query(rc,k);
pu(o);
}
}kd;
int main(){
int T=read(),kase=0,n,m;
while(T--){
n=read(); m=read();
rep(i,1,n){
p[i].x[0]=read();
p[i].x[1]=read();
p[i].idx=i;
}
memset(ans,0,sizeof ans);
//kd.baoli();
kd.root=kd.build(0,1,n);
ll lastans=0; CLOCK=0;
printf("Case #%d:\n",++kase);
while(m--){
sum=0; prod=1;
ll pos=lastans^read();
++CLOCK;
kd.query(kd.root,pos);
println(sum);
if(sum) lastans=prod;
else lastans=0;
}
rep(i,1,n){
if(i==n) println(ans[i]);
else printbk(ans[i]);
}
}
return 0;
}
2018牛客多校6 - I Team Rocket KD树维护空间的更多相关文章
- 牛客多校第三次B——线段树维护线性基交
写线性基交函数时调试了半天.. #include<bits/stdc++.h> using namespace std; #define ll long long #define maxn ...
- 牛客多校第3场 J 思维+树状数组+二分
牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...
- 牛客多校3 A-PACM Team(状压降维+路径背包)
PACM Team 链接:https://www.nowcoder.com/acm/contest/141/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144 ...
- 2018牛客多校第六场 I.Team Rocket
题意: 给出n个区间和m个点(点按顺序给出且强制在线).每个区间只会被第一个他包含的点摧毁.问每个点能摧毁多少个区间以及每个区间是被哪个点摧毁的. 题解: 将n个区间按照左端点排序,然后用vector ...
- 2018牛客多校2 - J farm 随机乱搞/二进制分组
题意:给定n*m的格子,每个格子有不同的种类,q次操作,每次操作使[x1,y1]到[x2,y2]的格子除了k类型的以外都删除,最后单次询问所有格子被删了几个 官方题解提到了两种有意思的做法,随机和二进 ...
- 2018牛客多校1 - J Different Integers 莫队/主席树签到
题意:给出n<5e4,a[1...n],单次1e5总次1e6次查询除去区间(L,R)的数的个数 开场5分钟:莫队是不可能莫队的,这道题是不可能莫队的 最后1小时:真香 具体操作没啥特别的,注意一 ...
- 2018牛客多校第二场a题
一个人可以走一步或者跳x步,但不能连着跳,问到这个区间里有几种走法 考虑两种状态 对于这一点,我可以走过来,前面是怎么样的我不用管,也可以跳过来但是,跳过来必须保证前一步是走的 dp[i][0]表示 ...
- 2018牛客多校第六场 G.Pikachu
题意: 给出一棵n个点的树,每条边有边权.对这个树加边变成一个完全图.新加的边的权值为边上两点在树上的距离.求完全图上任意两点的最大流之和. 题解: 一共有C(n,2)个点对.假设当前求s到t之间的最 ...
- 2018牛客多校第五场 H.subseq
题意: 给出a数组的排列.求出字典序第k小的b数组的排列,满足1<=bi<=n,bi<bi+1,a[b[i]]<a[b[i+1]],m>0. 题解: 用树状数组倒着求出以 ...
随机推荐
- JMS 之 Active MQ 的消息传输
本文使用Active MQ5.6 一.消息协商器(Message Broker) broke:消息的交换器,就是对消息进行管理的容器.ActiveMQ 可以创建多个 Broker,客户端与Active ...
- POC索引
最近在看窗口函数,接触到了POC索引,所以借此机会好好研究一下索引. 一般支持窗口函数的索引指南都遵循POC的概念,也就是Partitioning(分区).Ordering(排序)和Covering( ...
- 使用word文档直接发表博客 8 )
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...
- Word文档如何发CSDN博客
目前大部分的博客作者在写博客这件事情上都会遇到以下3个痛点:1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.2.发布到博客或公众号平台 ...
- Android新增的注解
环境 使用Android注解前需要导入相关的包 compile 'com.android.support:support-annotations:latest.integration' 注意:如果我们 ...
- hdu 4284 Travel(壮压DP&TSP&floyd)
Travel Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- 直接通过Response输出流写文件,浏览器表现为下载文件
response.setContentType("application/x-download"); response.addHeader("Content-Dispos ...
- chrome console cheat sheet
快捷键 打开console界面快捷键:ctrl+shift+J 清空log:ctrl+L 选项 Log XMLHTTPRequests:显示ajax Preserve log upon navigat ...
- Linux Shell 编程学习笔记
1:Shell Script中if语句的条件部分要以分号来分隔 2:要注意条件测试部分中的空格.在方括号的两侧都有空格 3:echo "Hi, ${a}s" 单引号中的变量不会进行 ...
- StratifiedShuffleSplit()函数 实现对数据集的划分
sklearn.model_selection.StratifiedShuffleSplit(n_splits=10, test_size=’default’, train_size=None, ra ...