题意:

  给出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. 吴裕雄 python 机器学习——混合高斯聚类GMM模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import mixture from sklearn.metrics ...

  2. 180710-MySql插入唯一键冲突的三种可选方式

    MySql插入时唯一键冲突的几种处理方式 MySql插入一条记录,结果提示主键冲突,怎么办? 批量插入数据时,发现插入的这批数据中,有某些记录存在唯一键冲突,一个一个跳出来就比较麻烦了,有什么好的办法 ...

  3. 博客美化—添加萌萌的live2D看板娘(不能再简单了)

    看着很多博客都有live2D的萌萌哒看板娘,我闲着有空说干就干. 从参考博客的附件中下载资源文件 waifu.css waifu-tips.js live2d.js flat-ui.min.css// ...

  4. 定时任务 linux crontab 学习整理

    1.  定时任务命令概念 crontab命令用于设置周期性被执行的指令.即设定脚本 按照规定时间执行相关的操作. 2.定时任务书写规范 *             *          *       ...

  5. git 从头开始

    下载安装git 打开git,输入以下命令,引号内的为你自己的名字和邮箱 git config --global user.name "Your Name"git config -- ...

  6. 树(Tree,UVA 548)

    题目描述: 题目思路: 1.使用数组建树 //递归 2.理解后序遍历和中序遍历,建立左右子树 3.dfs深度搜索找出权重最小的路径 #include <iostream> #include ...

  7. 卡片游戏 (Throwing card away I,UVa10935)

    题目描述: 解题思路: 直接模拟 #include <iostream> using namespace std; ] ; int main(int argc, char *argv[]) ...

  8. synchronized 详细解说

    转自  http://blog.csdn.net/javazejian/article/details/72828483 出自[zejian的博客] 写的很详细很好,做下记录 本篇主要是对Java并发 ...

  9. 一个五位数ABCDE乘以9,得到EDCBA,求此五位数

    此题是面试时某面试官突然抛出的,要求逻辑分析推导,不许编码,5分钟时间算出来最终结果,当然,最终没有完全推算出来 下面是编码实现 #一个五位数ABCDE*9=EDCBA,求此数 for a in ra ...

  10. 索引值迭代-enumerate

    你想在迭代一个序列的同时跟踪正在被处理的元素索引?内置的enumerate() 函数可以很好的解决这个问题: list_c = ['a', 'b', 'c'] for i, c in enumerat ...