速度即转发

给定一个长度为nnn的数组aaa,里面元素为a1,a2,a3,…,an−1,ana_1, a_2, a_3, \dots, a_{n - 1}, a_na1​,a2​,a3​,…,an−1​,an​。

有两种操作:

保证任何时刻数组值域在[0,105][0, 10 ^ 5][0,105],对于查询操作0≤k≤1050 \leq k \leq 10 ^ 50≤k≤105。

有个简单的想法树状数组套主席树,对于操作一,直接修改即可O(log⁡2n)O(\log ^ 2 n)O(log2n),对于操作二,二分答案O(log⁡3n)O(\log ^ 3 n)O(log3n),

显然三个log⁡\loglog的算法,复杂度有点大可能过不了,考虑在线段树上二分答案,

假设我们当前所在的区间是[l,r][l, r][l,r],显然左子树代表的值域范围是[l,mid][l, mid][l,mid],右子树所代表的是[mid+1,r][mid + 1, r][mid+1,r],

如果答案在右子树,则答案最少为mid+1mid + 1mid+1,这个时候只要判断是否有ls_sum−sz_ls×(mid+1)≥kls\_sum - sz\_ls \times (mid + 1) \geq kls_sum−sz_ls×(mid+1)≥k即可,

如果成立,则说明答案最少为mid+1mid + 1mid+1我们可以进入右子树搜索,否则我们进入右子树搜索,最后我们到达的叶节点即为最优的答案

我们在递归的时候,两个变量upper_sum,upper_szupper\_sum, upper\_szupper_sum,upper_sz,当我们进入左子树的时候,把右子树的sum,szsum, szsum,sz同时累加到这两个变量上去,

由于我们往左子树走了,说明答案小于mid+1mid + 1mid+1了,右子树记录的信息都是≥mid+1\geq mid + 1≥mid+1的
在下一步的judgejudgejudge中我们可以直接使用右子树的信息。

#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10, maxn = 100000;typedef long long ll;int a[N], n, m;int root[N], ls[N << 7], rs[N << 7], num;ll sum[N << 7], sz[N << 7];inline int lowbit(int x) {return x & (-x);
}void update(int &rt, int l, int r, int x, int v) {if (!rt) {rt = ++num;}sum[rt] += x * v, sz[rt] += v;if (l == r) {return ;}int mid = l + r >> 1;if (x <= mid) {update(ls[rt], l, mid, x, v);}else {update(rs[rt], mid + 1, r, x, v);}
}void modify(int rt, int x, int v) {while (rt <= n) {update(root[rt], 0, maxn, x, v);rt += lowbit(rt);}
}int A[110], B[110], cnt1, cnt2;int query(int l, int r, ll upper_sum, ll upper_sz, ll k) {if (l == r) {if (upper_sum - upper_sz * l >= k) {return l;}return -1;}int mid = l + r >> 1;ll cur_sum = 0, cur_sz = 0;for (int i = 1; i <= cnt1; i++) {cur_sum -= sum[rs[A[i]]], cur_sz -= sz[rs[A[i]]];}for (int i = 1; i <= cnt2; i++) {cur_sum += sum[rs[B[i]]], cur_sz += sz[rs[B[i]]];}if (cur_sum + upper_sum - 1ll * (mid + 1) * (upper_sz + cur_sz) >= k) {for (int i = 1; i <= cnt1; i++) {A[i] = rs[A[i]];}for (int i = 1; i <= cnt2; i++) {B[i] = rs[B[i]];}return query(mid + 1, r, upper_sum, upper_sz, k);}else {for (int i = 1; i <= cnt1; i++) {A[i] = ls[A[i]];}for (int i = 1; i <= cnt2; i++) {B[i] = ls[B[i]];}return query(l, mid, upper_sum + cur_sum, upper_sz + cur_sz, k);}
}int get_ans(int l, int r, ll k) {cnt1 = cnt2 = 0;for (int i = l - 1; i; i -= lowbit(i)) {A[++cnt1] = root[i];}for (int i = r; i; i -= lowbit(i)) {B[++cnt2] = root[i];}return query(0, maxn, 0, 0, k);
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%d %d", &n, &m);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);modify(i, a[i], 1);}ll k;for (int i = 1, op, l, r, p; i <= m; i++) {scanf("%d", &op);if (op) {scanf("%d %lld", &p, &k);modify(p, a[p], -1);a[p] = k;modify(p, a[p], 1);}else {scanf("%d %d %lld", &l, &r, &k);printf("%d\n", get_ans(l, r, k));}}return 0;
}

E 速度即转发(牛客挑战赛48)(树套树)相关推荐

  1. 牛客挑战赛47 C 条件(Floyd bitset优化)

    牛客挑战赛47 C 条件 思路:首先我们要两个图,一个是一定能到达的,一个是可能到达的,如果我们使用floyd (n^3)就有可能会超时,因为只要求询问能否到达,所以权值只有0和1,那我们可以使用bi ...

  2. 牛客挑战赛47 A 一道GCD问题

    牛客挑战赛47 A 一道GCD问题 思路参考牛客上的题解: 根据多维的更相减损术得gcd(x,y,z)=gcd(x,y−x,z−y)得 gcd(a1+k,a2+k,a3+k-,an+k)=gcd(a1 ...

  3. 牛客挑战赛47 D Lots of Edges(最短路+递归枚举子集)

    牛客挑战赛47 D Lots of Edges 思路:点的权值最多只有(1<<17)-1(131071) ,那我们可以枚举终点的值来算最短路,每个点能连边的值都是固定的,可以通过递归枚举子 ...

  4. 牛客挑战赛42 A.小睿睿的数列

    牛客挑战赛42 A.小睿睿的数列 题目链接 题目描述 小睿睿给了你一个长度为n的数列,他想问你该数列中满足条件(区间内存在某个数是区间内所有数的公因数)的最长区间有多少个 输入描述: 第一行 111 ...

  5. 牛客挑战赛36 - 纸飞机

    题目链接:牛客挑战赛36 - 纸飞机 题目描述 直线上有n座山峰,第i座的高度为hi.从某座山峰上放飞一架纸飞机,它可以从左往右依次经过一系列高度严格递减的山头. 假设五座山峰的高度依次是3,4,3, ...

  6. 牛客 Cutting Bamboos (主席树)

    题解 - 牛客 Cutting Bamboos (主席树) 题目链接: https://ac.nowcoder.com/acm/contest/889/H 题意: 给你一些竹子,q个询问,问你从第l到 ...

  7. 牛客挑战赛34 A 能天使的愿望 (dp 分组背包)

    链接:https://ac.nowcoder.com/acm/contest/2271/A 来源:牛客网 题目描述 出题人寄给大家的一些闲话:参加了CSP-J/S 2019 的同学,考的都怎么样啊?不 ...

  8. 牛客挑战赛34 A.能天使的愿望(分组背包)

    链接:https://ac.nowcoder.com/acm/contest/2271/A 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 65536K,其他语言1310 ...

  9. 牛客挑战赛48--A and B

    A-天使果冻 链接:https://ac.nowcoder.com/acm/contest/11161/A 来源:牛客网 题意:一个数组包含n个数,求前i个数的次大值是多少(倘若最大值有两个,则次大值 ...

最新文章

  1. xgboost重要参数2为主但不全要参照1
  2. 20170803 - 今日技能封装 - Q
  3. android 入门-Android Permission denied(不允许连接Socket) 错误
  4. 第四次实验 恶意代码技术
  5. SAP中手工配置Delivery打印message
  6. Mysql查漏补缺笔记
  7. 前端学习(847):H5自定义属性
  8. MATLAB入门学习(三)
  9. xMenuTools(超实用右键菜单工具) v7.6
  10. 智能实验室-杀马(Defendio) 3.0.0.615 beta 7
  11. 【2020团体程序设计天梯赛】L1部分(PTA,L1-065到L1-072)题解代码
  12. 模糊:让你的代码远离偷窥之眼
  13. IP代理软件哪个比较好
  14. python点击按钮窗口之间跳转_PyQt5点击按钮,实现界面之间的跳转思路
  15. python虚拟宠物猫
  16. 全国计算机考试比省级的难吗,国考和省考考题的区别,难度差异很大吗?
  17. Hadoop 笔记(五)配置历史服务器
  18. Codeforces Round #571 (Div. 2)
  19. Word2Vec+ Word Embedding
  20. Vue.js:使用v-bind为多个元素绑定style样式案例

热门文章

  1. android中文离线api_比林肯法球Linken sphere浏览器更多更新指纹的国产防关联软件-VMLogin中文版浏览器...
  2. 试卷代号6098计算机应用基础,2231电大《Visual Basic程序设计》试题和答案200507
  3. 怎么在mysql中打开表存信息,我应该如何存储用户的“收藏夹”在mySQL表?
  4. php session缓存,扫盲:php session缓存至memcached中的方法
  5. drawable文件怎么添加图片_怎么给PDF文件添加书签
  6. 有生之年必看!原来历史还可以这样震撼,看完我惊呆了...
  7. 想入门平均月薪2.58w人工智能领域?看看BAT的工程师在学什么
  8. 提升方法之AdaBoost算法
  9. python浪漫代码_五行Python代码实现批量抠图
  10. docker 修改阿里镜像源_Jetson Nano 修改源镜像