题意:

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

分析:

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

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

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

#include <bits/stdc++.h>
using namespace std;
const int maxN = 2e5 + ;
const int INF = 2e9 + ;
int n, m, x, y, pos, t, cancel;
long long res;
int ans[maxN];
struct Interval {
int l, r, index;
bool operator < (const Interval& a)const {
return l < a.l;
}
} travel[maxN], tree[maxN * ]; void build(int treeIndex, int L, int R) {
// printf("%d %d\n", L , R);
if(L == R) {
tree[treeIndex].l = travel[L].l;
tree[treeIndex].r = travel[L].r;
tree[treeIndex].index = travel[L].index;
return;
}
int mid = (L + R) / ;
int lSon = treeIndex * , rSon = treeIndex * + ;
build(lSon, L, mid);
build(rSon, mid + , R);
tree[treeIndex].r = max(tree[lSon].r, tree[rSon].r);
} void query(int treeIndex, int L, int R) {
if(tree[treeIndex].r < x)
return;
if(L == R) {
cancel++;
int inIndex = tree[treeIndex].index;
res = ((long long)res * inIndex) % ;
tree[treeIndex].r = -INF;
ans[inIndex] = t;
return;
} int mid = (L + R) / ;
int lSon = treeIndex * , rSon = treeIndex * + ;
query(lSon, L, mid);
if(pos > mid)
query(rSon, mid + , R);
tree[treeIndex].r = max(tree[lSon].r, tree[rSon].r);
} int main() {
// freopen("data.txt","r", stdin);
// freopen("3.txt","w", stdout);
int T;
scanf("%d", &T);
for(int kase = ; kase <= T; kase++) {
printf("Case #%d:\n", kase);
memset(ans, , sizeof(ans));
memset(tree, , sizeof(tree));
memset(travel, , sizeof(travel));
scanf("%d %d", &n, &m);
for(int i = ; i <= n; i++) {
scanf("%d %d", &travel[i].l, &travel[i].r);
travel[i].index = i;
}
sort(travel + , travel + + n);
// for(int i = 1; i <= n; i++) printf("%d %d\n", travel[i].l, travel[i].r);
build(, , n);
res = ;
for(t = ; t <= m; t++) {
scanf("%d", &y);
x = y ^ res;
pos = upper_bound(travel + , travel + + n, (Interval) {x,,}) - (travel + );
cancel = , res = (long long);//乘积初始化为1
if(pos > ) // pos等于0说明没有任何一个左区间比x小
query(, , n);//int treeIndex, int L, int R
printf("%d\n", cancel);
if(!cancel)
res = ;
} printf("%d", ans[]);
for(int i = ; i <= n; i++) {
printf(" %d", ans[i]);
}
printf("\n");
}
return ;
}

牛客网暑期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. 【bzoj1123】BLO

    1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2222  Solved: 1090[Submit][Status ...

  2. AtCoder Regular Contest 078 C

    C - Splitting Pile Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement Snu ...

  3. Ubuntu安装指定版本的docker

    系统环境: Ubuntu 16.0.4 安装版本: docker  17.03.2 在进现在这家公司初期,需要使用rancher部署一个k8s集群,由于rancher也是由docker启动的,加上k8 ...

  4. C#泛型学习笔记

    泛型默认值default 如果T是int默认是0  str默认是null public class MyTest<T>{ public T GetValue() { T t = defau ...

  5. centos7安装mysql5.7 使用yum

    https://blog.csdn.net/z13615480737/article/details/78906598 使用yum,比较简单,不用考虑版本依赖问题

  6. Codeforces 371BB. Fox Dividing Cheese

    Two little greedy bears have found two pieces of cheese in the forest of weight a and b grams, corre ...

  7. SpringBoot 2.x (10):整合Redis

    Redis部署到阿里云: 下载redis源码,编译,允许远程访问的配置 阿里云安全组设置: SSH连过去: wget http://download.redis.io/releases/redis-4 ...

  8. centos 7 安装JDK (Linux安装jdk)

    centos 7安装JDK (Linux安装jdk) 第一部分 首先查看centos 7是否有openjdk,如没有就跳过第一部分,直接第二部分. [master@bogon ~]$ java -ve ...

  9. WebService学习之旅(四)Apache Axis2的安装

    一.Axis2简介 Axis2是目前使用较多的WebService引擎,它是Axis1.x的升级版本,不仅支持SOAP1.1和SOAP1.2,而且也提供了对REST风格WebService的支持. A ...

  10. Linux下环境搭建(三)——jmeter+ant配置

    在linux环境下,使用jmeter做接口自动化,做好了前两步的准备工作后,怎能少了主角jmeter+ant了,今天就来说下jmeter+ant的配置方式. jmeter配置 jmeter下载地址:h ...