Camping Groups

我们先计算出, 每个点当leader所能掌控的最多人数。 然后我们把询问离线, 丢到responsibility最大的那个地方去。

然后从大到小往线段树里加人, 加入完之后处理掉当前的询问。

如果强制在线的话就只能树套树啦。

#include<bits/stdc++.h>
#define LL long long
#define LD long double
#define ull unsigned long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ALL(x) (x).begin(), (x).end()
#define fio ios::sync_with_stdio(false); cin.tie(0);using namespace std;const int N = 1e5 + 7;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-8;
const double PI = acos(-1);template<class T, class S> inline void add(T& a, S b) {a += b; if(a >= mod) a -= mod;}
template<class T, class S> inline void sub(T& a, S b) {a -= b; if(a < 0) a += mod;}
template<class T, class S> inline bool chkmax(T& a, S b) {return a < b ? a = b, true : false;}
template<class T, class S> inline bool chkmin(T& a, S b) {return a > b ? a = b, true : false;}int n, k, q;
int a[N], r[N];
int c[N];int hsa[N], tota;
int hsr[N], totr;int ans[N];vector<PII> vc[N];
vector<pair<PII, int>> qus[N];struct Bit {int a[N];void modify(int x, int v) {for(int i = x; i < N; i += i & -i) a[i] += v;}int sum(int x) {int ans = 0;for(int i = x; i; i -= i & -i) ans += a[i];return ans;}int query(int L, int R) {if(L > R) return 0;return sum(R) - sum(L - 1);}
} bit;struct SegmentTree {
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1int mx[N << 2];inline void pull(int rt) {mx[rt] = max(mx[rt << 1], mx[rt << 1 | 1]);}void update(int L, int R, int val, int l, int r, int rt) {if(R < l || r < L || R < L) return;if(L <= l && r <= R) {chkmax(mx[rt], val);return;}int mid = l + r >> 1;update(L, R, val, lson);update(L, R, val, rson);pull(rt);}int query(int L, int R, int l, int r, int rt) {if(R < l || r < L || R < L) return 0;if(L <= l && r <= R) return mx[rt];int mid = l + r >> 1;return max(query(L, R, lson), query(L, R, rson));}
} Tree;int getPosa(int x) {return lower_bound(hsa + 1, hsa + 1 + tota, x) - hsa;
}
int getPosr(int x) {return lower_bound(hsr + 1, hsr + 1 + totr, x) - hsr;
}int main() {memset(ans, -1, sizeof(ans));scanf("%d%d", &n, &k);for(int i = 1; i <= n; i++) scanf("%d", &a[i]), hsa[++tota] = a[i];for(int i = 1; i <= n; i++) scanf("%d", &r[i]), hsr[++totr] = r[i];sort(hsa + 1, hsa + 1 + tota); tota = unique(hsa + 1, hsa + 1 + tota) - hsa - 1;sort(hsr + 1, hsr + 1 + totr); totr = unique(hsr + 1, hsr + 1 + totr) - hsr - 1;for(int i = 1; i <= n; i++) {vc[lower_bound(hsa + 1, hsa + 1 + tota, a[i]) - hsa].push_back(mk(r[i], 0));}for(int i = 1; i <= tota; i++) {for(auto& t : vc[i]) bit.modify(getPosr(t.fi), 1);for(auto& t : vc[i]) {t.se = bit.query(getPosr(t.fi - k), getPosr(t.fi + k + 1) - 1);}}scanf("%d", &q);for(int i = 1; i <= q; i++) {int x, y; scanf("%d%d", &x, &y);int maxa = max(a[x], a[y]);if(r[x] > r[y]) swap(x, y);qus[lower_bound(hsa + 1, hsa + 1 + tota, maxa) - hsa].push_back(mk(mk(r[y] - k, r[x] + k), i));}for(int i = tota; i >= 1; i--) {for(auto& t : vc[i]) Tree.update(getPosr(t.fi), getPosr(t.fi), t.se, 1, totr, 1);for(auto& q : qus[i]) ans[q.se] = Tree.query(getPosr(q.fi.fi), getPosr(q.fi.se + 1) - 1, 1, totr, 1);}for(int i = 1; i <= q; i++) printf("%d\n", ans[i] == 0 ? -1 : ans[i]);return 0;
}/*
*/

转载于:https://www.cnblogs.com/CJLHY/p/10899452.html

Codeforces 173E Camping Groups 线段树相关推荐

  1. Codeforces 833B 题解(DP+线段树)

    题面 传送门:http://codeforces.com/problemset/problem/833/B B. The Bakery time limit per test2.5 seconds m ...

  2. Codeforces 997E Good Subsegments (线段树)

    题目链接 https://codeforces.com/contest/997/problem/E 题解 经典题,鸽了 159 天终于看明白题解了.. 考虑一个区间是连续的等价于这个区间内的 \((\ ...

  3. CodeForces - 1539F Strange Array(线段树区间合并)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,规定位置 iii 的贡献是:设 x=a[i]x=a[i]x=a[i],选择一个包含 iii 的区间 [l,r][l,r][l,r],将其中 ...

  4. CodeForces - 1430E String Reversal(线段树+模拟)

    题目链接:点击查看 题目大意:给出一个字符串 sss ,令其反转的串为 ttt ,每次操作可以将 ttt 中的两个相邻位置的字符交换,问最少需要进行多少次操作才能使得 ttt 变成 sss 题目分析: ...

  5. 【codeforces 12D】【线段树】【降维】【离散化】【三元组比较大小】

    [题意] 给出n个女士的三位属性xi,yi,zi(注意此处是一行x给完再给y再给z).若存在xi>xj && yi > yj  && zi>zj ,那 ...

  6. Codeforces 1108 E2(线段树+思维)

    传送们 题意: 给你一个长度为nnn的数列bbb.以及mmm个区间. 你可以选取111个或多个这样的区间aia_iai​,使得令区间aia_iai​所对应的所有值bib_ibi​都减111.你最终要使 ...

  7. CodeForces - 817F MEX Queries(线段树lazy序)

    题目链接:点击查看 题目大意:初始时有一个空的集合,需要执行 n 次操作: 1 l r:将区间 [ l , r ] 内未出现的数加入到集合中 2 l r:将区间 [ l , r ] 内出现的数字全部删 ...

  8. CodeForces - 1454F Array Partition(线段树+二分)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,现在要求求出任意一组 x , y , z,满足下列条件: x + y + z = n max( 1 , x ) = min( x + 1 , ...

  9. CodeForces - 1440E Greedy Shopping(线段树)

    题目链接:点击查看 题目大意:给出一个非严格递减的子序列,需要完成 m 次操作,分为下列两种类型: 1 x y:将区间 [ 1 , x ] 中的数进行 a[ i ] = max( a[ i ] , y ...

最新文章

  1. 技术详解 | 如何用GAN实现阴影检测和阴影去除?
  2. linux文件名通配符:* ? [:digit:]数字 [:lower:]小写字母 [:upper:]大写字母
  3. iPhone中的heic格式怎么查看,heic文件怎么打开
  4. c++ winpcap开发(3)
  5. 怎样成为一个优秀的领导?
  6. 票据的生命周期与人的灵魂
  7. web ftp java代码_java web ftp cli
  8. 15.1 异常(异常的基本概念+自定义异常)
  9. iOS上架app store下载步骤
  10. php中怎么设置透明背景图片,css怎样设置背景透明
  11. vue 富文本编辑器 —— wangEditor
  12. 目前常见软件保护技术概述
  13. [python]《天龙八部》文本处理
  14. 正则表达式过滤非数字字符串
  15. html怎么混合颜色,CSS3 多色混合背景
  16. php公众号解决投票刷票,微信公众号投票活动如何防止刷票现象
  17. 深入理解MOT评价指标
  18. 数格子算面积的方法_“数方格”是笨方法吗?
  19. 001-TensorFlow 2.0 教程-Transformer
  20. nodejs 初探 api试用

热门文章

  1. oracle追加index,oracle add index
  2. Uboot初次编译、烧写、启动(启动界面log简析)
  3. ConcurrentHashMap原理,jdk7和jdk8的区别
  4. 关于mysql修改密码 set password for root@localhost = password(‘xxx‘);报错解决方法
  5. MYSQL多字段分组having子句
  6. 电脑知识:新电脑数据迁移解决方案,看完你就会了!
  7. SpringBoot定时任务实现的两种方式介绍
  8. Redis五种数据类型详解
  9. 两个不同网段的局域网如何互通_不同网段之间如何通信?
  10. php对象底层结构,PHP 底层原理之类和对象