题意:

给定n个区间, m次询问, 每次询问给一个点, 问这个点在哪些区间内, 然后删掉这些区间。

分析:

将n个区间按L大小升序排列, 然后将这些区间视为点构建一棵n个点的线段树, 树的节点记录这个区间的[l, r] 和按题目输入顺序排列的index

只有叶子节点的l, r代表这个区间本身, 他们的父亲更新他们儿子的最大r用于剪枝 (如果这个点所有儿子的最大R都小于查询的点, 就不用查了)

接下来只要二分出左区间大于x的那个区间的pos, 那么查询区间就是(1~pos)中有哪些点的右区间大于x, 记录答案并修改右区间即可。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxN = 2e5 + ;
  4. const int INF = 2e9 + ;
  5. int n, m, x, y, pos, t, cancel;
  6. long long res;
  7. int ans[maxN];
  8. struct Interval {
  9. int l, r, index;
  10. bool operator < (const Interval& a)const {
  11. return l < a.l;
  12. }
  13. } travel[maxN], tree[maxN * ];
  14.  
  15. void build(int treeIndex, int L, int R) {
  16. // printf("%d %d\n", L , R);
  17. if(L == R) {
  18. tree[treeIndex].l = travel[L].l;
  19. tree[treeIndex].r = travel[L].r;
  20. tree[treeIndex].index = travel[L].index;
  21. return;
  22. }
  23. int mid = (L + R) / ;
  24. int lSon = treeIndex * , rSon = treeIndex * + ;
  25. build(lSon, L, mid);
  26. build(rSon, mid + , R);
  27. tree[treeIndex].r = max(tree[lSon].r, tree[rSon].r);
  28. }
  29.  
  30. void query(int treeIndex, int L, int R) {
  31. if(tree[treeIndex].r < x)
  32. return;
  33. if(L == R) {
  34. cancel++;
  35. int inIndex = tree[treeIndex].index;
  36. res = ((long long)res * inIndex) % ;
  37. tree[treeIndex].r = -INF;
  38. ans[inIndex] = t;
  39. return;
  40. }
  41.  
  42. int mid = (L + R) / ;
  43. int lSon = treeIndex * , rSon = treeIndex * + ;
  44. query(lSon, L, mid);
  45. if(pos > mid)
  46. query(rSon, mid + , R);
  47. tree[treeIndex].r = max(tree[lSon].r, tree[rSon].r);
  48. }
  49.  
  50. int main() {
  51. // freopen("data.txt","r", stdin);
  52. // freopen("3.txt","w", stdout);
  53. int T;
  54. scanf("%d", &T);
  55. for(int kase = ; kase <= T; kase++) {
  56. printf("Case #%d:\n", kase);
  57. memset(ans, , sizeof(ans));
  58. memset(tree, , sizeof(tree));
  59. memset(travel, , sizeof(travel));
  60. scanf("%d %d", &n, &m);
  61. for(int i = ; i <= n; i++) {
  62. scanf("%d %d", &travel[i].l, &travel[i].r);
  63. travel[i].index = i;
  64. }
  65. sort(travel + , travel + + n);
  66. // for(int i = 1; i <= n; i++) printf("%d %d\n", travel[i].l, travel[i].r);
  67. build(, , n);
  68. res = ;
  69. for(t = ; t <= m; t++) {
  70. scanf("%d", &y);
  71. x = y ^ res;
  72. pos = upper_bound(travel + , travel + + n, (Interval) {x,,}) - (travel + );
  73. cancel = , res = (long long);//乘积初始化为1
  74. if(pos > ) // pos等于0说明没有任何一个左区间比x小
  75. query(, , n);//int treeIndex, int L, int R
  76. printf("%d\n", cancel);
  77. if(!cancel)
  78. res = ;
  79. }
  80.  
  81. printf("%d", ans[]);
  82. for(int i = ; i <= n; i++) {
  83. printf(" %d", ans[i]);
  84. }
  85. printf("\n");
  86. }
  87. return ;
  88. }

牛客网暑期ACM多校训练营(第六场) I Team Rocket(线段树)的更多相关文章

  1. 2018牛客网暑期ACM多校训练营(第二场)J Farm(树状数组)

    题意 n*m的农场有若干种不同种类作物,如果作物接受了不同种类的肥料就会枯萎.现在进行t次施肥,每次对一个矩形区域施某种类的肥料.问最后枯萎的作物是多少. 分析 作者:xseventh链接:https ...

  2. 牛客网暑期ACM多校训练营(第二场)J farm (二维树状数组)

    题目链接: https://www.nowcoder.com/acm/contest/140/J 思路: 都写在代码注释里了,非常好懂.. for_each函数可以去看一下,遍历起vector数组比较 ...

  3. 2018牛客网暑期ACM多校训练营(第二场):discount(基环树DP)

    题意:有N个不同的商品,每个商品原价是Pi元,如果选择打折,可以减少Di元.  现在加一种规则,每个商品有一个友好商品Fai,如果i用原价买,则可以免费买Fai. 现在问买到所有物品的最小价格. 思路 ...

  4. 牛客网 暑期ACM多校训练营(第二场)A.run-动态规划 or 递推?

    牛客网暑期ACM多校训练营(第二场) 水博客. A.run 题意就是一个人一秒可以走1步或者跑K步,不能连续跑2秒,他从0开始移动,移动到[L,R]的某一点就可以结束.问一共有多少种移动的方式. 个人 ...

  5. 牛客网 暑期ACM多校训练营(第一场)A.Monotonic Matrix-矩阵转化为格子路径的非降路径计数,Lindström-Gessel-Viennot引理-组合数学

    牛客网暑期ACM多校训练营(第一场) A.Monotonic Matrix 这个题就是给你一个n*m的矩阵,往里面填{0,1,2}这三种数,要求是Ai,j⩽Ai+1,j,Ai,j⩽Ai,j+1 ,问你 ...

  6. 2018牛客网暑期ACM多校训练营(第二场)I- car ( 思维)

    2018牛客网暑期ACM多校训练营(第二场)I- car 链接:https://ac.nowcoder.com/acm/contest/140/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 ...

  7. 牛客网暑期ACM多校训练营(第一场) - J Different Integers(线段数组or莫队)

    链接:https://www.nowcoder.com/acm/contest/139/J来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言1048 ...

  8. 牛客网暑期ACM多校训练营(第九场) A题 FWT

    链接:https://www.nowcoder.com/acm/contest/147/A来源:牛客网 Niuniu has recently learned how to use Gaussian ...

  9. 牛客网暑期ACM多校训练营(第九场)D

    链接:https://www.nowcoder.com/acm/contest/147/D来源:牛客网 Niuniu likes traveling. Now he will travel on a ...

  10. 牛客网暑期ACM多校训练营(第二场)B discount

    链接:https://www.nowcoder.com/acm/contest/140/B来源:牛客网 题目描述 White Rabbit wants to buy some drinks from ...

随机推荐

  1. Linux —— 压缩命令

    压缩与解压命令 .zip格式 压缩文件: zip 压缩文件名 原文件名 (压缩目录添加 -r) 解压缩文件/目录: unzip .zip压缩包 .gz格式 压缩文件: gzip 原文件名称 压缩文件为 ...

  2. python入门之实例-商品选择

    需求: 显示一系列商品,根据序号选择商品 li = ["手机","电脑","电视"] #函数enumerate在for循环遍历的时候,会默认 ...

  3. PARTITION RANGE ALL 的优化

    建议如下: 检查数据库的cpu 消耗 ,Sql_id :***** 消耗过多资源,这个新上线sql, 20号才上线,是对log 进行分析,平均每次执行时间300s.,使用的是PARTITION RAN ...

  4. elastcisearch中文分词器各个版本

    地址 https://github.com/medcl/elasticsearch-analysis-ik/releases?after=v6.0.1

  5. PHP知识点总结3

    PHP 函数 PHP 的真正威力源自于它的函数. 在 PHP 中,提供了超过 1000 个内建的函数. <html> <body> <?php function writ ...

  6. Linux下环境搭建(二)——jenkins+gitlab配置

    配置jenkins+gitlab环境,需要依托java环境,在之前的博文中,已配置好java环境,所以可以直接搭建这两个工具的环境即可. jenkins配置 jenkins的配置方法,在之前windo ...

  7. eclipse版本要求修改

    eclipse要求打开的是java1.6,而安装的是java1.7,这个时候需要修改配置 找到JAVA的安装路径, 点击前往-电脑-资源库-Java-javaVCirtualMachines-...- ...

  8. zookeeper系列 (第一章 :ubuntu 下安装zookeeper)

    1.zookeeper是分布式一致性管理服务.解决了分布式中死锁,不一致,原子性操作等问题. 2.环境:系统ubuntu,zookeeper 下载地址:http://archive.apache.or ...

  9. SIT&UAT

  10. DRP项目

    DRP(distribution resource planning)分销资源计划是管理企业的分销网络的系统,目的是使企业具有对订单和供货具有快速反应和持续补充库存的能力.解决了随着企业销售规模的逐渐 ...