P2839 [国家集训队]middle


我们可以考虑二分中位数 checkcheckcheck 答案,那么我们对于某个值 midmidmid ,把 [l,r][l,r][l,r] 内的所有小于 midmidmid 的数赋值为 −1-1−1 ,大于等于 midmidmid 的数赋为 111 ,若 [l,r][l,r][l,r] 的和大于等于 000 就代表这个区间内的中位数至少都是 midmidmid ,否则只可能小于 midmidmid 。答案一定是序列里面的数字,所以我们就考虑对于每个数字建出一颗线段树出来,这颗线段树上维护了区间和,最大前缀和,最大后缀和,这样的话我们就可以 checkcheckcheck 到某个数 midmidmid 的时候,询问 [a,b][a,b][a,b] 的最大前缀和, [b+1,c−1][b+1,c-1][b+1,c−1] 的区间和, [c,d][c,d][c,d] 的最大后缀和,三者相加即可进行 checkcheckcheck 。那么问题是我们如何建出这 nnn 颗线段树呢,我们发现可以用到主席树, midmidmid 的线段树对于 mid−1mid - 1mid−1 的线段树来说,只是把值为 mid−1mid-1mid−1 的地方变成 −1-1−1 。那么我们离散化一下,用离散后的值存个下标,就可以建立主席树,这样也自然就相当于建立了 nnn 颗线段树,于是我们就可以进行 checkcheckcheck ,求得答案了。

#include <bits/stdc++.h>using namespace std;const int N = 2e4 + 10;struct Node {int head, sum, tail;
};
Node operator + (Node a, Node b) {int head = max(a.head, a.sum + b.head);int sum = a.sum + b.sum;int tail = max(b.tail, b.sum + a.tail);return {head, sum, tail};
}int n, m, a[N], q[10];Node tree[N << 5];
int lson[N << 5], rson[N << 5], root[N], tot;int rk[N], numtot;vector<int> g[N];void build(int &rt, int l, int r) {rt = ++tot;tree[rt].head = tree[rt].sum = tree[rt].tail = r - l + 1;if (l == r) return ;int mid = l + r >> 1;build(lson[rt], l, mid);build(rson[rt], mid + 1, r);
}void push_up(int rt) {tree[rt] = tree[lson[rt]] + tree[rson[rt]];
}void update(int pre, int &rt, int l, int r, int pos) {rt = ++tot;tree[rt] = tree[pre];lson[rt] = lson[pre];rson[rt] = rson[pre];if (l == r) {tree[rt].sum = tree[rt].head = tree[rt].tail = -1;return ;}int mid = l + r >> 1;if (pos <= mid) update(lson[pre], lson[rt], l, mid, pos);else update(rson[pre], rson[rt], mid + 1, r, pos);push_up(rt);
}Node query(int rt, int l, int r, int L, int R) {if (L <= l && r <= R) {return tree[rt];}int mid = l + r >> 1;if (mid >= L && mid < R) {return query(lson[rt], l, mid, L, R) + query(rson[rt], mid + 1, r, L, R);}else if (mid >= L) {return query(lson[rt], l, mid, L, R);}else {return query(rson[rt], mid + 1, r, L, R);}
}int main() {#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endifscanf("%d", &n);for (int i = 1; i <= n; ++i) {scanf("%d", &a[i]);rk[i] = a[i];}sort(rk + 1, rk + 1 + n);numtot = unique(rk + 1, rk + 1 + n) - rk - 1;for (int i = 1; i <= n; ++i) {int id = lower_bound(rk + 1, rk + 1 + numtot, a[i]) - rk;g[id].push_back(i);}tree[0].head = tree[0].sum = tree[0].tail = -2e9;build(root[1], 1, n);for (int i = 2; i <= numtot; ++i) {for (int j = 0; j < (int)g[i - 1].size(); ++j) {int pos = g[i - 1][j];if (j == 0) update(root[i - 1], root[i], 1, n, pos);else update(root[i], root[i], 1, n, pos);}}scanf("%d", &m);int x = 0;while(m--) {int a, b, c, d;scanf("%d%d%d%d", &q[1], &q[2], &q[3], &q[4]);q[1] = (q[1] + x) % n;q[2] = (q[2] + x) % n;q[3] = (q[3] + x) % n;q[4] = (q[4] + x) % n;sort(q + 1, q + 5);a = ++q[1], b = ++q[2], c = ++q[3], d = ++q[4];int l = 1, r = numtot;while(l <= r) {int mid = l + r >> 1, all = 0;all += query(root[mid], 1, n, a, b).tail;if (b + 1 <= c - 1) all += query(root[mid], 1, n, b + 1, c - 1).sum;all += query(root[mid], 1, n, c, d).head;if (all < 0) r = mid - 1;else l = mid + 1;}printf("%d\n", x = rk[l - 1]);}
}

洛谷P2839 [国家集训队]middle(主席树)相关推荐

  1. bzoj 2653 洛谷 P2839 [国家集训队] middle

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 2381  Solved: 1340 [Submit][Status][Di ...

  2. P2839 [国家集训队]middle(二分 套 主席树)

    P2839 [国家集训队]middle 有一个长度为nnn的序列,有mmm次询问,每次询问a,b,c,da, b, c, da,b,c,d,为l∈[a,b],r∈[c,d]l \in [a, b], ...

  3. 洛谷P2619 [国家集训队]Tree I 题解

    洛谷P2619 [国家集训队]Tree I 题解 题目链接:P2619 [国家集训队]Tree I 题意: 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有 need\text{n ...

  4. P2839 [国家集训队]middle 二分 + 主席树 在值域上建区间

    传送门 文章目录 题意: 思路: 题意: 思路: 我们先解决怎么判断中位数的问题,我们可以二分一个midmidmid,将<mid<mid<mid的值都变成−1-1−1,其他的数都变成 ...

  5. 洛谷P3168 [CQOI2015]任务查询系统 [主席树,差分]

    题目传送门 任务查询系统 题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任 ...

  6. P2839 [国家集训队]middle

    题面 • 提一下静态区间第k小的nlog2n的做法: 1. 建关于排名的主席树(按排名顺序建树). 2. 二分答案. • 这样做静态区间第k小的虽然有些ZZ,但它的意义在于将线段树   维护的对象改变 ...

  7. 洛谷P1494 [国家集训队]小Z的袜子

    P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- ...

  8. 洛谷 P4643 [国家集训队]阿狸和桃子的游戏

    题目:[国家集训队]阿狸和桃子的游戏 思路: 截个图,这个思路太巨了Orz. 图可以点.

  9. 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)

    洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...

最新文章

  1. CEPH核心理论 相关导图(持续更新)
  2. VOC2007基本信息
  3. 自考计算机应用技术实践考核,自考《计算机应用技术》实践环节指导
  4. Socket重叠IO
  5. java泛型与接口_Java泛型用于方法,类和接口
  6. python——Web服务开发(一)Flask模块
  7. 深度重建:基于深度学习的图像重建
  8. C#基础视频教程4.3 如何编写简单的计算器
  9. 运行stam 遇到的问题:
  10. python统计中文字数_Python实现统计文本文件字数的方法
  11. sel2000服务器自动关闭,实用贴:轻松处理SQL 2000数据库自动停止
  12. 路由器登录校园网解决终端限制问题
  13. 在华为13年的峥嵘岁月后,我加入了一个13人的初创团队
  14. 心之所向,百炼成钢 第一章
  15. php 上上级目录的表示
  16. LeetCode-Revers_Bits
  17. NORTON 杀毒怎么了?
  18. Firefox必备组件备忘
  19. Oracle分区详解和创建,数据库优化-Oracle表分区的创建和分类
  20. Unable to connect to Redis无法连接到Redis

热门文章

  1. Imagex 安装 WIN7/8 系统
  2. 私募多渠道扩张资本版图
  3. 大多数人忽略了的Spring官方项目,Spring Web Services
  4. 目前微型计算机有哪些树莓派,树莓派推出Pi 400型微型计算机
  5. jsonify(jsonify中文)
  6. 资金积累、国名收入与人口增长的关系综合评估
  7. [0895]《动物传染病学》
  8. 网欣房地产成本管理系统,成本软件
  9. One Switch——mac电脑功能一键开关
  10. 各银行软件开发中心状况调查