题意:

给定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. Codeforces Round #547 (Div. 3) A.Game 23

    链接:https://codeforces.com/contest/1141/problem/A 题意: 给n和m,有两种操作:将n×2 或 n×3,求最少的乘法次数由n得到m. 不能得到时为-1. ...

  2. Technocup 2017 - Elimination Round 1 (Unofficially Open for Everyone, Rated for Div. 2) C

    This is an interactive problem. You should use flush operation after each printed line. For example, ...

  3. 2017 Multi-University Training Contest - Team 1 Add More Zero

    Problem Description There is a youngster known for amateur propositions concerning several mathemati ...

  4. 【aspnetcore】使用TagHelper制作分页组件

    自定义TageHelper并不难,只要记住几个点: 继承TagHelper 定义需要在TagHelper中传入的参数,如果不需要参数,可忽略 重写Process方法 在Process中拼接要输出的HT ...

  5. 复习线程——状态和几个Thread方法

    一.线程的状态 (参考文章:https://blog.csdn.net/a58220655/article/details/76695142) 状态介绍 新建(new):处于该状态的时间很短暂.已被分 ...

  6. Codeforces Round #202 (Div. 1) A. Mafia 推公式 + 二分答案

    http://codeforces.com/problemset/problem/348/A A. Mafia time limit per test 2 seconds memory limit p ...

  7. C#连接Oracle中文乱码问题解决方法

    1.打开注册表:开始-运行-regedit       HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/KEY_OraDb11g_home1/OLEDB    在右侧点鼠标右键- ...

  8. python flask学习(2)

    本文主要整理下几个Flask扩展: 0.Flask-Bootstrap:集成Twitter开发的一个开源框架Bootstrap.1.Flask-Script:为Flask程序添加一个命令行解析器2.F ...

  9. debian中sudo无法使用问题

    原文链接:http://sharadchhetri.com/2013/08/07/sudo-command-not-found-debian-7/ To solve this issue instal ...

  10. ionic2 tabs 自定义图标

    ionic2 tabs 自定义图标 一.准备资源 tabs icon 的svg格式的矢量图片 二.生成字体样式文件 打开icoMoon网站去制作字体文件. 三.使用字体文件 解压下载的文件,将其中的f ...