2018牛客多校第六场 I.Team Rocket
题意:
给出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的更多相关文章
- 2018牛客多校第六场 G.Pikachu
题意: 给出一棵n个点的树,每条边有边权.对这个树加边变成一个完全图.新加的边的权值为边上两点在树上的距离.求完全图上任意两点的最大流之和. 题解: 一共有C(n,2)个点对.假设当前求s到t之间的最 ...
- 牛客多校第六场 C Generation I 组合数学 阶乘逆元模板
链接:https://www.nowcoder.com/acm/contest/144/C来源:牛客网 Oak is given N empty and non-repeatable sets whi ...
- 牛客多校第六场 J Heritage of skywalkert 随即互质概率 nth_element(求最大多少项模板)
链接:https://www.nowcoder.com/acm/contest/144/J来源:牛客网 skywalkert, the new legend of Beihang University ...
- 牛客多校第六场-H-Pair
链接:https://ac.nowcoder.com/acm/contest/887/H来源:牛客网 题目描述 Given three integers A, B, C. Count the numb ...
- 同构图+思维构造——牛客多校第六场E
考的其实是同构图的性质: 1.同构图的顶点数,边数相等 2.同构图通过点的映射后邻接矩阵相同 这篇博客讲的很好https://www.jianshu.com/p/c33b5d1b4cd9 本题还需要一 ...
- 2018牛客多校第五场 H.subseq
题意: 给出a数组的排列.求出字典序第k小的b数组的排列,满足1<=bi<=n,bi<bi+1,a[b[i]]<a[b[i+1]],m>0. 题解: 用树状数组倒着求出以 ...
- 2018牛客多校第五场 E.room
题意: 一共有n个宿舍,每个宿舍有4个人.给出第一年的人员分布和第二年的人员分布,问至少有多少人需要移动. 题解: 对于第一年的每个宿舍,向今年的每种组合连边.流量为1,费用为(4 - 组合中已在该宿 ...
- 2018牛客多校第四场 J.Hash Function
题意: 给出一个已知的哈希表.求字典序最小的插入序列,哈希表不合法则输出-1. 题解: 对于哈希表的每一个不为-1的数,假如他的位置是t,令s = a[t]%n.则这个数可以被插入当且仅当第s ~ t ...
- 2018牛客多校第三场 C.Shuffle Cards
题意: 给出一段序列,每次将从第p个数开始的s个数移到最前面.求最终的序列是什么. 题解: Splay翻转模板题.存下板子. #include <bits/stdc++.h> using ...
随机推荐
- JS学习 函数的理解
ECMAScript 的函数实际上是功能完整的对象. 函数的理解 用 Function 类直接创建函数,格式如下.可理解为Function构造器. var function_name = new Fu ...
- jquery 点滴
jQuery——动态给表格添加序号 $(function(){ //$('table tr:not(:first)').remove(); var len = $('table tr').length ...
- Unity Container中的几种注册方式与示例
1.实例注册 最简单的注册方式就是实例注册,Unity 容器负责维护对一个类型的单例引用,比如: 有如下的实际类型: namespace ConsoleSample { public class Sa ...
- javaweb(六)——Servlet开发(二)
一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...
- DirectX11与DirectX12在古墓丽影暗影中的表现
最近在关注这两个图形API,因为感兴趣,也算是初学者. 以下内容仅供参考. 使用古墓丽影暗影游戏,分别对这两个进行比较,得出的结论如下图(此笔记本散热很差,更改散热应该比下图结果好些): 首先看可以很 ...
- HDU - 6441(费马大定理)
链接:HDU - 6441 题意:已知 n,a,求 b,c 使 a^n + b^n = c^n 成立. 题解:费马大定理 1.a^n + b^n = c^n,当 n > 2 时无解: 2. 当 ...
- [C++]STL中的容器
C++11 STL中的容器 一.顺序容器: vector:可变大小数组: deque:双端队列: list:双向链表: forward_list:单向链表: array:固定大小数组: string: ...
- (原) MaterialEditor部- UmateriaEditor中 Node编译过程和使用(2)
@白袍小道 转载说明原处 插件同步在GITHUB: DaoZhang_XDZ 需求: 1.梳理FexpressionInput和Output的编译和链接(套路和逻辑目的) 2.如何做到节点编译 ...
- Linux系统负载查询
查询Linux系统负载情况,一般需要了解三个方面的信息: 1.Linux系统配置.如Linux版本号.CPU.内存.网络.磁盘等: 2.收集系统负载信息的手段.常用的工具包有sysstat和procp ...
- python计算工资个税
# -*- coding: utf-8 -*- total = int(input("税前总计:")) #公积金10% Gongjijin = total * 0.1 print( ...