2018牛客网暑假ACM多校训练赛(第六场)I Team Rocket 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round6-I.html
题目传送门 - https://www.nowcoder.com/acm/contest/144/I
题意
给定 $n$ 条线段,第 $i$ 条线段覆盖区间 $[L_i,R_i]$ 。
接下来 $m$ 次操作,每次操作给出一个坐标 $x$ ,使得所有覆盖到坐标 $x$ 的区间都消失。(如果之前已经消失了,那么现在就不能让他再消失一次了)
对于每一次操作,输出这次操作使得多少线段消失了。
接下来对于每一个线段,输出它是在第几次操作消失的。如果它没有消失,那么输出 $0$ 。
强制在线。方式:对于每一次操作,输入的是一个数 $y$ ,$x = y\ {\rm XOR} \ lastans$ 。其中 $lastans$ 表示上一次操作时消失的线段的编号的乘积对于 $998244353$ 取模后的值;如果上一次没有使任何线段消失或者当前这次操作是第一次,则 $lastans=0$ 。
多组数据。共 $T$ 组。
$1\leq T\leq 5,1\leq n,m\leq 2\times 10^5,-10^9\leq L_i,R_i,x\leq 10^9 $
题解
线段树。
首先对于坐标离散化一下。然后,在线段树上面覆盖每一条线段,于是每一条线段会被拆成 $\log n$ 条,覆盖在线段树上。
具体地,在线段树上的操作就是对于每一个线段树节点开一个 vector , 然后把当前线段的编号扔进去。这个相当于线段树标记永久化。
我们还要支持快速查找覆盖一个点的所有线段。这个就相当于线段树单点查询。可以见得,在单点查询的时候,每遇到一个代表的区间包含当前位置的线段树节点,这个节点的 vector 的元素都会消失。但是一个线段被拆成了 log 个,当他消失的时候,我们似乎需要修改所有的 log 个。这样显然是不行的。解决的办法:我们只需要对于每一个线段,打一个标记,记录这条线段是否已经消失。于是,如果我们在单点查询的时候遇到了已经被标记删除的线段,那么我们就不将他加入当前的答案序列中。
再具体的看代码吧。
时间复杂度 $O(n\log n)$ 。
我比较懒,离散化的时候用了比较懒的办法。于是常数不大好。注意一下,在清空 vector 的时候从后往前访问并 pop_back 会快一下。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=200005,mod=998244353;
int read(){
int x=0,f=1;
char ch=getchar();
while (!isdigit(ch)&&ch!='-')
ch=getchar();
if (ch=='-')
f=-1,ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+ch-48,ch=getchar();
return x*f;
}
int n,m;
int vis[N],L[N],R[N],ans[N];
int Ha[N*4],hs;
vector <int> t[N*4*4];
void build(int rt,int L,int R){
t[rt].clear();
if (L==R)
return;
int mid=(L+R)>>1,ls=rt<<1,rs=ls|1;
build(ls,L,mid);
build(rs,mid+1,R);
}
void cover(int rt,int L,int R,int xL,int xR,int id){
if (xL>R||xR<L)
return;
if (xL<=L&&R<=xR){
t[rt].push_back(id);
return;
}
int mid=(L+R)>>1,ls=rt<<1,rs=ls|1;
cover(ls,L,mid,xL,xR,id);
cover(rs,mid+1,R,xL,xR,id);
}
vector <int> res;
void Delete(int rt,int L,int R,int x){
while (!t[rt].empty()){
int id=t[rt].back();
t[rt].pop_back();
if (!vis[id])
vis[id]=1,res.push_back(id);
}
if (L==R)
return;
int mid=(L+R)>>1,ls=rt<<1,rs=ls|1;
if (x<=mid)
Delete(ls,L,mid,x);
else
Delete(rs,mid+1,R,x);
}
void solve(int Case){
n=read(),m=read();
hs=0;
for (int i=1;i<=n;i++){
L[i]=read(),R[i]=read();
Ha[++hs]=L[i],Ha[++hs]=L[i]-1;
Ha[++hs]=R[i],Ha[++hs]=R[i]-1;
}
Ha[++hs]=1e9+1;
sort(Ha+1,Ha+hs+1);
hs=unique(Ha+1,Ha+hs+1)-Ha-1;
build(1,1,hs);
for (int i=1;i<=n;i++){
vis[i]=ans[i]=0;
L[i]=lower_bound(Ha+1,Ha+hs+1,L[i])-Ha;
R[i]=lower_bound(Ha+1,Ha+hs+1,R[i])-Ha;
cover(1,1,hs,L[i],R[i],i);
}
printf("Case #%d:\n",Case);
int last_ans=0;
for (int k=1;k<=m;k++){
int x=read()^last_ans;
int p=lower_bound(Ha+1,Ha+hs+1,x)-Ha;
res.clear();
Delete(1,1,hs,p);
if (res.size()>0){
last_ans=1;
for (int i=0;i<res.size();i++){
int id=res[i];
ans[id]=k;
last_ans=1LL*last_ans*id%mod;
}
}
else
last_ans=0;
printf("%d\n",(int)res.size());
}
for (int i=1;i<n;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[n]);
}
int main(){
for (int T=read(),Case=1;T;T--,Case++)
solve(Case);
return 0;
}
2018牛客网暑假ACM多校训练赛(第六场)I Team Rocket 线段树的更多相关文章
- 2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round2-E.html 题目传送门 - 2018牛客多校赛第二场 E ...
- 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...
- 2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-G.html 题目传送门 - 2018牛客多校赛第三场 G ...
- 2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html 题目传送门 - 2018牛客多校赛第三场 D ...
- 2018牛客网暑假ACM多校训练赛(第七场)I Tree Subset Diameter 动态规划 长链剖分 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round7-I.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第五场)F take 树状数组,期望
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round5-F.html 题目传送门 - https://www.no ...
- 2018牛客网暑假ACM多校训练赛(第四场)B Interval Revisited 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round4-B.html 题目传送门 - https://www.no ...
- 2018牛客网暑假ACM多校训练赛(第四场)E Skyline 线段树 扫描线
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round4-E.html 题目传送门 - https://www.no ...
- 2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-H.html 题目传送门 - https://www.n ...
随机推荐
- Java中instanceof与getClass的区别
在比较一个类和另一个类是否属于同一个类实例的时候,通常可以采用instanceof和getClass两种方法比较两者是否相等来判断,但是两者在判断上面是有差别的,下面通过代码说明: public cl ...
- [记录]一个有趣的url请求(nodejs)
1 前言 IDE是webstrom,跟项目编程语言,应该没有多大关系. 2 现象 两个看起来是一样的url,但是一个能访问一个不能访问. 然后,复制url到console中发现了差异,分别是:file ...
- [PHP]flock文件IO锁的使用
一.flock概述 bool flock ( resource $handle , int $operation [, int &$wouldblock ] ) 参数 handle 文 ...
- Spring Cloud构建微服务架构(五)服务网关
通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: 我们使用Spring Cloud Netflix中的Eureka实现了服务 ...
- Truffle框架环境搭建
注意:本教程需要Truffle4.0或者是更高的版本 以太坊的智能合约只是代码,和我们的纸质代码不同,此合同需要非常精确的方式理解 如果合同编码不正确,我们的交易可能会失败,会导致gas的损失,更不用 ...
- python-函数入门(二)
一.函数对象 什么是函数? 函数是第一类对象,指的是函数名指向的值(函数)可以被当做数据去使用 1.函数的特性 1.函数可以被引用,即函数可以把值赋值给一个变量 def foo(): print('f ...
- JVM·垃圾收集器与内存分配策略之垃圾收集器!
1.Serial(串行)收集器(新生代都采用复制算法) 这是个单线程的收集器:即 当他工作的时候,会停掉虚拟机所有的线程!(Stop The World)
- Jenkins三.1 配置maven
maven配置安装下载 wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-b ...
- PID控制器开发笔记之六:不完全微分PID控制器的实现
从PID控制的基本原理我们知道,微分信号的引入可改善系统的动态特性,但也存在一个问题,那就是容易引进高频干扰,在偏差扰动突变时尤其显出微分项的不足.为了解决这个问题人们引入低通滤波方式来解决这一问题. ...
- Java的小实验——各种测试以及说明
日期:2018.10.07 星期五 博客期:014 一.Java中的位运算 代码如下: package Morts107; public class Test107 { public static v ...