题意:

  给出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. SpringBoot学习:获取yml和properties配置文件的内容

    项目下载地址:http://download.csdn.net/detail/aqsunkai/9805821 (一)yml配置文件: pom.xml加入依赖: <!-- 支持 @Configu ...

  2. 文件包含漏洞(RFI)

    1文件包含漏洞简介 include  require  include_once   require_once RFI综述 RFI是Remote File Inclusion的英文缩写,直译过来就是远 ...

  3. JavaScript基本概念(1)-声明提升

    声明提升: function > var > other var提升的时候,只是声明提升,但是赋值还是会在原来的位置. Javascript Hoisting:In javascript, ...

  4. CVPR2018 关于视频目标跟踪(Object Tracking)的论文简要分析与总结

    本文转自:https://blog.csdn.net/weixin_40645129/article/details/81173088 CVPR2018已公布关于视频目标跟踪的论文简要分析与总结 一, ...

  5. 78[LeetCode] Subsets

    Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The solut ...

  6. Python实现个性化推荐一

    现如今,网站用推荐系统为你提供个性化的体验,告诉你买啥,吃啥甚至你应该和谁交朋友.尽管每个人口味不同,但大体都适用这个套路.人们倾向于喜欢那些与自己喜欢的其他东西相似的东西,也倾向于与自己身边的人有相 ...

  7. Java标签实现分页

    Java实现标签分页 最近为了开发一个网站,里面要用分页功能,但是之前很少自己写分页标签,又不想用现成框架.所以自己参考了些资料,写了个分页例子测试了一下. 代码主要分为三个类: PageTag 分页 ...

  8. Centos/Linux 下升级python2.7至3.5.0

    (一) 安装Python3.5 (1)在安装python之前,因为linux系统下默认没有安装wget,gcc,首先安装wget,gcc: [root@node6 python_scripts]# y ...

  9. Alphabetic Removals(模拟水题)

    You are given a string ss consisting of nn lowercase Latin letters. Polycarp wants to remove exactly ...

  10. 软工2017第五周——个人PSP

    10.13 --10.19本周例行报告 1.PSP(personal software process )个人软件过程. 类型 任务 预计时间 开始时间                结束时间 中断时 ...