题意:

  给出n个区间和m个点(点按顺序给出且强制在线)。每个区间只会被第一个他包含的点摧毁。问每个点能摧毁多少个区间以及每个区间是被哪个点摧毁的。

题解:

  将n个区间按照左端点排序,然后用vector(储存左端点,右端点,id)初始化线段树。

  初始化的方法是:对于线段树的n个叶子节点,即为排好序的n个区间。对于其他节点,将左右儿子按照右端点大小归并(归并是线性复杂度)。

  还要维护每个节点左端点的最小值(用来剪枝)和最大值(用来判断可行性)。

  每个区间只会被第一个他包含的点摧毁,所以用vis数组标记一个区间是否已被摧毁。

  每次遍历vector数组后使用erase会T掉,可以再维护一个信息表示上次遍历到的位置,这次从这个位置开始遍历。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5+;
const int mod = ;
int t, n, m;
int x, y, lst, judge;
int ans[N], vis[N];
struct node {
int l, r, id;
bool operator < (const node &a) {
return l == a.l ? r > a.r : l < a.l;
}
}a[N];
int min_L[N<<], max_L[N<<], L[N<<];
vector<node> g[N<<];
void merge(int id) {
int lch = id<<, rch = id<<|;
max_L[id] = max(max_L[lch], max_L[rch]);
min_L[id] = min(min_L[lch], min_L[rch]);
int len1 = g[lch].size(), len2 = g[rch].size();
int l1 = , l2 = ;
while(l1 < len1 || l2 < len2) {
if(l1 == len1 || l2 != len2 && g[rch][l2].r > g[lch][l1].r) g[id].push_back(g[rch][l2++]);
else g[id].push_back(g[lch][l1++]);
}
}
void build(int id, int l, int r) {
g[id].clear();
L[id] = ;
if(l == r) {
g[id].push_back(a[l]);
max_L[id] = min_L[id] = a[l].l;
return ;
}
int mid = l+r >> ;
build(id<<, l, mid);
build(id<<|, mid+, r);
merge(id);
}
int query(int id, int l, int r, int ql, int num) {
if(min_L[id] > ql) return ;
if(max_L[id] <= ql) {
int cnt = L[id], tot = ;
int len = g[id].size();
while(cnt < len && g[id][cnt].r >= ql) {
int v = g[id][cnt].id;
if(!vis[v]) {
lst = 1ll*lst*v%mod;
judge++;
ans[v] = num;
vis[v] = ;
tot++;
}
cnt++;
}
L[id] = cnt;
return tot;
}
int res = ;
int mid = l+r>>;
res += query(id<<, l, mid, ql, num);
res += query(id<<|, mid+, r, ql, num);
return res;
}
int main() {
scanf("%d", &t);
for(int casee = ; casee <= t; casee++) {
printf("Case #%d:\n", casee);
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++) {
scanf("%d%d", &a[i].l, &a[i].r);
ans[i] = vis[i] = ;
a[i].id = i;
}
sort(a+, a+n+);
build(, , n);
lst = ;
for(int i = ; i <= m; i++) {
scanf("%d", &y);
x = y^(lst % mod);
lst = , judge = ;
printf("%d\n", query(, , n, x, i));
if(!judge) lst = ;
}
for(int i = ; i < n; i++) printf("%d ", ans[i]);
printf("%d\n", ans[n]);
}
}

2018牛客多校第六场 I.Team Rocket的更多相关文章

  1. 2018牛客多校第六场 G.Pikachu

    题意: 给出一棵n个点的树,每条边有边权.对这个树加边变成一个完全图.新加的边的权值为边上两点在树上的距离.求完全图上任意两点的最大流之和. 题解: 一共有C(n,2)个点对.假设当前求s到t之间的最 ...

  2. 牛客多校第六场 C Generation I 组合数学 阶乘逆元模板

    链接:https://www.nowcoder.com/acm/contest/144/C来源:牛客网 Oak is given N empty and non-repeatable sets whi ...

  3. 牛客多校第六场 J Heritage of skywalkert 随即互质概率 nth_element(求最大多少项模板)

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

  4. 牛客多校第六场-H-Pair

    链接:https://ac.nowcoder.com/acm/contest/887/H来源:牛客网 题目描述 Given three integers A, B, C. Count the numb ...

  5. 同构图+思维构造——牛客多校第六场E

    考的其实是同构图的性质: 1.同构图的顶点数,边数相等 2.同构图通过点的映射后邻接矩阵相同 这篇博客讲的很好https://www.jianshu.com/p/c33b5d1b4cd9 本题还需要一 ...

  6. 2018牛客多校第五场 H.subseq

    题意: 给出a数组的排列.求出字典序第k小的b数组的排列,满足1<=bi<=n,bi<bi+1,a[b[i]]<a[b[i+1]],m>0. 题解: 用树状数组倒着求出以 ...

  7. 2018牛客多校第五场 E.room

    题意: 一共有n个宿舍,每个宿舍有4个人.给出第一年的人员分布和第二年的人员分布,问至少有多少人需要移动. 题解: 对于第一年的每个宿舍,向今年的每种组合连边.流量为1,费用为(4 - 组合中已在该宿 ...

  8. 2018牛客多校第四场 J.Hash Function

    题意: 给出一个已知的哈希表.求字典序最小的插入序列,哈希表不合法则输出-1. 题解: 对于哈希表的每一个不为-1的数,假如他的位置是t,令s = a[t]%n.则这个数可以被插入当且仅当第s ~ t ...

  9. 2018牛客多校第三场 C.Shuffle Cards

    题意: 给出一段序列,每次将从第p个数开始的s个数移到最前面.求最终的序列是什么. 题解: Splay翻转模板题.存下板子. #include <bits/stdc++.h> using ...

随机推荐

  1. SSM-Spring-23:概念《Spring中的事务是什么?》

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客会详细讲述Spring中的事务,会展开来用语言解释,用于了解概念和准备面试 事务的概念: 一个或者一组 ...

  2. cocos2d-x3.7 cclabel文字破碎,异常,变乱

    效果图如下: 无论是按钮(control button),还是普通的label都有小概率出现这种情况. 该问题发现于cocos2d-x3.7 原因: 在3.x中使用ttfconfig创建的label, ...

  3. 开胃小菜——impress.js代码详解

    README 友情提醒,下面有大量代码,由于网页上代码显示都是同一个颜色,所以推荐大家复制到自己的代码编辑器中看. 今天闲来无事,研究了一番impress.js的源码.由于之前研究过jQuery,看i ...

  4. lintcode112 删除排序链表中的重复元素

    删除排序链表中的重复元素   给定一个排序链表,删除所有重复的元素每个元素只留下一个. 您在真实的面试中是否遇到过这个题? Yes 样例 给出 1->1->2->null,返回 1- ...

  5. 《Effective C++》读书笔记 被你忽略的关于构造析构赋值

    如果程序员没有定义,那么编译器会默认隐式为你创建一个copy构造函数,一个copy赋值操作符,一个析构函数.另外如果你没有声明任何构造函数,编译器会为你声明一个default构造函数. 但是只有当这些 ...

  6. usdt信息小结

    https://blog.csdn.net/weixin_42208011/article/details/80499536 https://blog.csdn.net/weixin_42208011 ...

  7. [leetcode-775-Global and Local Inversions]

    We have some permutation A of [0, 1, ..., N - 1], where N is the length of A. The number of (global) ...

  8. 小茜(xi)的减肥之路

    Description 今天,多年未见的小钧和小江在街头偶遇,小江想看看当年那个蠢蠢的小钧有没有变聪明一些,他灵机一动,说:“当初小茜立了个flag,说一定要减肥,她想着第一天跑一米,第二天跑两米,第 ...

  9. Ubuntu 基础操作 基础命令 热键 man手册使用 关机 重启等命令使用

    . : 关机, 如果将Linux默认运行等级设置为0, 系统将无法启动; -- : 多用户模式, 允许使用网络文件系统, 一般不使用图形界面登陆就是这种模式; -- : 多用户图形界面模式, 该模式下 ...

  10. java — 垃圾回收

    1. 垃圾回收的意义 在java中,当没有对象指向原先分配给某个对象的内存的时候,这片内存就变成了垃圾,JVM的一个系统级线程就会自动释放这个内存块,垃圾回收意味着程序不再需要的对象是“无用的信息”, ...