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. 题解: 用树状数组倒着求出以 ...
随机推荐
- Python 与 Javascript 比较
最近由于工作的需要开始开发一些Python的东西,由于之前一直在使用Javascript,所以会不自觉的使用一些Javascript的概念,语法什么的,经常掉到坑里.我觉得对于从Javascript转 ...
- Python爬虫实战三之实现山东大学无线网络掉线自动重连
综述 最近山大软件园校区QLSC_STU无线网掉线掉的厉害,连上之后平均十分钟左右掉线一次,很是让人心烦,还能不能愉快地上自习了?能忍吗?反正我是不能忍了,嗯,自己动手,丰衣足食!写个程序解决掉它! ...
- Oracle 用户
1.关于创建用户; 2.用户配置文件; 3.创建用户; 4.更改用户; 5.删除用户; 1.关于创建用户: 1.1 用户名:创建数据库用户必须具有 Create user 系统权限,必须指定用户名和密 ...
- WireShark抓包的pcap文件格式分析
http://www.360doc.com/content/14/0220/11/15257968_354157537.shtml http://www.360doc.com/content/14/0 ...
- RabbitMQ的四种ExChange
在message到达Exchange后,Exchange会根据route规则进入对应的Queue中,message可能进入一个Queue也可能进入对应多个Queue,至于进入哪个Queue或者是说哪个 ...
- redis 缓存用户账单策略
最近项目要求分页展示用户账单列表,为提高响应使用redis做缓存,用到的缓存策略和大家分享一下. 需求描述:展示用户账单基本信息以时间倒序排序,筛选条件账单类型(所有,订单收入.提现.充值...). ...
- 编写高质量代码改善C#程序的157个建议——建议130:以复数命名枚举类型,以单数命名枚举元素
建议130:以复数命名枚举类型,以单数命名枚举元素 枚举类型应该具有负数形式,它表达的是将一组相关元素组合起来的语义.比如: enum Week { Monday, Tuesday, Wednesda ...
- Python之安装第三方扩展库
PyPI 地址:https://pypi.python.org/pypi 如果你知道你要找的库的名字,那么只需要在右上角搜索栏查找即可. 1.pip安装扩展库 (1)安装最新版本的扩展库: cmd&g ...
- ARM汇编程序中的伪指令
转自http://blog.chinaunix.net/uid-13701930-id-336459.html 4.1 ARM汇编器所支持的伪指令 在ARM汇编语言程序里,有一些特殊指令助记符,这些助 ...
- DRBD 数据镜像软件
1>DRBD介绍 1>数据镜像软件DRBD介绍 分布式块设备复制(Distributed Relicated Block Deivce,DRBD),是一种基于软件.基于网络的块复制存储解 ...