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 ...
随机推荐
- ORB-SLAM(十二)优化
ORB-SLAM中优化使用g2o库,先复习一下g2o的用法,上类图 其中SparseOptimizer就是我们需要维护的优化求解器,他是一个优化图,也是一个超图(包含若干顶点和一元二元多元边),怎样定 ...
- 客户端SDK测试思路
本文来自网易云社区 作者:万春艳 是什么 客户端SDK是为第三方开发者提供的软件开发工具包,包括SDK接口.开发文档和Demo示例等.SDK和应用之间是什么关系呢?以云信即时消息服务为例,如下图所示, ...
- ansible基础配置使用(一)
test test test
- uvaoj 1081510815 - Andy's First Dictionary(set应用)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=835&page= ...
- hdu1050Moving Tables(贪心)
Moving Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- 180710-MySql插入唯一键冲突的三种可选方式
MySql插入时唯一键冲突的几种处理方式 MySql插入一条记录,结果提示主键冲突,怎么办? 批量插入数据时,发现插入的这批数据中,有某些记录存在唯一键冲突,一个一个跳出来就比较麻烦了,有什么好的办法 ...
- 周期串 (Periodic Strings,UVa455)
#include<stdio.h> #include<string.h> int main(void) { int n,stlen,i,j; ]; while(scanf(&q ...
- jmeter使用复习
多终端进程: 配置客户端远程的ip地址和port 在客户端jmeter安装目录的bin目录下,修改配置文件 jmeter.properties 默认的remote_hosts 的值:(将肉鸡的地址加入 ...
- 剑指offer-二叉树中和为某一值的路径24
题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...
- New Year and Old Property :dfs
题目描述: Limak is a little polar bear. He has recently learnt about the binary system. He noticed that ...