原文链接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);elseDelete(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;}}elselast_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;
}

  

转载于:https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round6-I.html

2018牛客网暑假ACM多校训练赛(第六场)I Team Rocket 线段树相关推荐

  1. 2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round2-E.html 题目传送门 - 2018牛客多校赛第二场 E ...

  2. 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他...

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...

  3. 牛客网暑期ACM多校训练营(第六场)J-Heritage of skywalkert

    链接:https://www.nowcoder.com/acm/contest/144/J 来源:牛客网 题目描述 skywalkert, the new legend of Beihang Univ ...

  4. 2018牛客网暑期ACM多校训练营(第十场)A Rikka with Lowbit (树状数组)

    链接:https://ac.nowcoder.com/acm/contest/148/A 来源:牛客网 Rikka with Lowbit 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C ...

  5. 2018牛客网暑期ACM多校训练营(第十场)J Rikka with Nickname(二分,字符串)

    链接:https://ac.nowcoder.com/acm/contest/148/J?&headNav=acm 来源:牛客网 Rikka with Nickname 时间限制:C/C++ ...

  6. 2018牛客网暑期ACM多校训练营(第十场)J(二分)

    题目描述: 给你n个字符串,要让它们一个一个的合并成一个串.在合并的过程中,要保证被合并的串S是合并后的串r的前缀,模式串t是串r的子序.问你将这n个字符串合并后所得到的字典序最小的串是什么. 题目分 ...

  7. 牛客网暑期ACM多校训练营(第六场)J Heritage of skywalkert

    题目链接:https://www.nowcoder.com/acm/contest/144/J 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...

  8. 牛客网暑期ACM多校训练营(第六场) - (A,C,J)

    比赛链接:https://www.nowcoder.com/acm/contest/144#question A Singing Contest 题意:有编号1~2^n的2^n个人参加唱歌比赛,每人有 ...

  9. 牛客网暑期ACM多校训练营(第六场) C.Generation I (思维+逆元+组合数学)

    题目链接 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 Oak is given N e ...

最新文章

  1. Hadoop通过路径和和链接访问HDFS
  2. 【原创】MyEclipse反编译添加jadclipse_3.3.0 曲折的完美解决
  3. 变量 || 数据类型
  4. 南京秦淮灯会亮灯迎春 明城墙内外“飘”年味
  5. Luogu P1471 方差
  6. Oracle 发布基于 VS Code 的开发者工具,轻松使用 Oracle 数据库
  7. 字节大牛教你手撕Java学习,Java核心知识点
  8. 讯为开发板的最小LINUX系统烧写及U盘的挂载及卸载
  9. java编程入门到精通课后答案,附源代码
  10. TwinCAT与台达伺服驱动器连接调试控制电机正反转
  11. 计算机与医疗PPT,《人工智能医药》ppt课件
  12. 京东java面试流程_java京东社招面试经历
  13. 荐书 | 9本心理治疗书籍推荐
  14. Oracle greatest函数
  15. python storm连接mysql_Python ORM Storm 源码修改
  16. 我们现在有乒乓球运动员和篮球运动员,乒乓球教练和篮球教练 为了出国交流,跟乒乓球相关的人员都要学习英语 请用所有知识分析: 这个案例中有哪些具体类,哪些抽象类,哪些接口,并用代码实现
  17. python与医学图像处理_医学图像处理与深度学习(一)
  18. 绩效考核软件,强势助力二、三级公立医院绩效大考
  19. 【Graph Embedding】LINE:算法原理,实现和应用
  20. 数据迁移的几种方式 - MySQL数据库

热门文章

  1. TTL怎么计算拉电流和灌电流_预付费电表工作原理 是怎么实现断电功能
  2. element提交图片限制一张_element-ui上传图片限制图片比例
  3. android sdk 官网说明,神目人脸识别Android SDK Demo说明
  4. 数学实验matlab课后习题,数学实验练习题(MATLAB)
  5. mysql3308_mysql 多服务器范例
  6. 计算机组成原理中计算机主要包括哪几部分,计算机组成原理本科生期末试卷(五)部分答案详解...
  7. 迅捷cad_迅捷协议
  8. jsf tree组件_JSF文本组件–标签,文本字段,文本区域和密码
  9. jsf集成spring_JSF Spring Hibernate集成示例教程
  10. developerDiskImage文件提取