H - Hello Ms. Ze

给定nnn种不同的材料,第iii种材料有aia_iai​个,有mmm个操作,操作分为两类:

先不考虑修改操作,对于区间[l,r][l, r][l,r]中的原料,我们可以做最多多少衣服,如何求解,

考虑二分答案,假设我们可以最多做xxx件衣服,显然对于个数大于等于xxx的材料,在每件衣服中我们只能使用一次,

假设我们当前二分的区间为[l,r][l, r][l,r],设材料数量大于midmidmid的有aaa种,材料数量小于等于midmidmid的数量和为sumsumsum,

当a+summid+1≥ka + \frac{sum}{mid + 1} \geq ka+mid+1sum​≥k,说明答案在右区间,否则答案在左区间,其实这整个过程我们可以在线段树上直接二分执行。

考虑带修,树状数组套主席树,然后主席树上二分即可,由于答案值域在[1,105×106][1, 10 ^ 5 \times 10 ^ 6][1,105×106],所以我直接动态开点建了一颗值域在[1,1<<37][1, 1 << 37][1,1<<37]的主席树。

树套树

#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;const long long maxn = 1ll << 37;int a[N], n, m;int root[N], ls[N << 9], rs[N << 9], tot[N << 9], num;long long sum[N << 9];void update(int &rt, long long l, long long r, int x, int v) {if (!rt) {rt = ++num;}sum[rt] += x * v, tot[rt] += v;if (l == r) {return ;}long long mid = l + r >> 1;if (x <= mid) {update(ls[rt], l, mid, x, v);}else {update(rs[rt], mid + 1, r, x, v);}
}inline int lowbit(int x) {return x & (-x);
}void update(int pos, int x, int v) {while (pos <= n) {update(root[pos], 1, maxn, x, v);pos += lowbit(pos);}
}int A[50], B[50], cnt1, cnt2;long long query(long long l, long long r, long long S, int cnt, int k) {if (l == r) {return l;}long long mid = l + r >> 1;long long ans = 0, res = 0;for (int i = 1; i <= cnt1; i++) {ans -= sum[ls[A[i]]];res -= tot[ls[A[i]]];}for (int i = 1; i <= cnt2; i++) {ans += sum[ls[B[i]]];res += tot[ls[B[i]]];}if ((S + ans) / (mid + 1) + cnt - res >= k) {S += ans, cnt -= res;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, S, cnt, 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, S, cnt, 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]);update(i, a[i], 1);}for (int i = 1, op, l, r, k; i <= m; i++) {scanf("%d %d %d", &op, &l, &r);if (op == 2) {update(l, a[l], -1);a[l] = r;update(l, a[l], 1);}else {scanf("%d", &k);cnt1 = cnt2 = 0;for (int j = l - 1; j; j -= lowbit(j)) {A[++cnt1] = root[j];}for (int j = r; j; j -= lowbit(j)) {B[++cnt2] = root[j];}printf("%lld\n", query(1, maxn, 0, r - l + 1, k));}}return 0;
}

H - Hello Ms. Ze(树状数组套主席树,线段树上二分)相关推荐

  1. ICPC 徐州 H Yuuki and a problem (树状数组套主席树)

    Yuuki and a problem 先不管第一问的修改操作,考虑如何达到第二问的查询操作, 题目要我们给出一个区间[l,r][l, r][l,r]中,不能通过权值+++得到的最小的数字是什么, 假 ...

  2. #279. [SYZOI Round1] 滑稽♂树(树状数组套主席树)

    #279. [SYZOI Round1] 滑稽♂树 子树上的问题,考虑dfsdfsdfs序,第kkk大,可以用主席树嘛,支持修改,那就树状数组上套主席树,参考P4175 [CTSC2008]网络管理( ...

  3. 【BZOJ1901】Dynamic Rankings,树状数组套主席树

    Time:2016.05.09 Author:xiaoyimi 转载注明出处谢谢 传送门(权限) 题面 1901: Zju2112 Dynamic Rankings Time Limit: 10 Se ...

  4. zoj 2112 树状数组 套主席树 动态求区间 第k个数

    总算是把动态求区间第k个数的算法看明白了. 在主席树的基础上,如果有修改操作,则要通过套树状数组来实现任意区间求第k小的问题. 刚开始看不明白什么意思,现在有一点理解.树状数组的每个元素是一个线段树, ...

  5. BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条 ...

  6. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...

  7. BZOJ1901Zju2112 Dynamic Rankings——树状数组套主席树

    题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1 ],a[i+2]--a[j]中第k小的数是多少(1≤k ...

  8. 洛谷 - P2617 Dynamic Rankings(树状数组套主席树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,再给出 m 次操作: Q l r k:返回区间 [ l , r ] 内第 k 大的数 C x y:令 a[ x ] = y 题目分析:其实 ...

  9. BZOJ1901 Zju2112 Dynamic Rankings 【树状数组套主席树】

    题目 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[j]中第k小的数是多少(1≤k≤j- ...

最新文章

  1. 计算机技术在职研究生学校,计算机技术在职研究生招生2020
  2. 2.1 Mini-batch 梯度下降-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  3. 【渝粤教育】国家开放大学2019年春季 289法理学 参考试题
  4. LeetCode 1886. 判断矩阵经轮转后是否一致
  5. Android 壁纸设置代码 详解
  6. 程序员如何 Get 分布式锁的正确姿势?| 技术头条
  7. SUMO文档019:导入网络文件(上)——OpenStreetMap
  8. ESP32 M5 超级问卷星:轻松收集数据
  9. 华硕电脑GeForce类显卡如何解决:NVIDIA安装程序无法继续
  10. 安装Wireshark时提示Npcap失败的解决办法(亲测且多人反馈有用)
  11. Druid【部署 01】最新版本的(安装+启动服务+打开控制台+本地文件数据载入+数据查询)及(小内存服务器启动JVM参数调整)一次学会使用Druid的完整流程(已完成)
  12. 推荐系统学习笔记-FNN
  13. 前端入门教程(四)head内常用标签与body内常用标签
  14. BPM与OA的简单了解
  15. 什么是回归问题和分类问题?机器学习知识点
  16. DirectX 9.0笔记]第一章 初始化 Direct3D
  17. JOL - Java Object Layout
  18. mysql存储过程default的意思,针对新手的MYSQL存储过程详解
  19. 华为Nova10Pro、小米12Pro和vivoS15Pro的区别 哪个好
  20. Java监听器的处理方法_Java监听器的简单使用

热门文章

  1. c均值算法的设计与实现_如何使用C链表实现 LRU 算法
  2. 王道408数据结构——第五章 树与二叉树
  3. 华为21级程序员月薪曝光:270k封神!众网友直呼长见识……
  4. 大一计算机课实训总结1000字,大一计算机实训报告.doc
  5. php 电梯程序设计,教你写出京东电梯式轮播
  6. rockmq运维指令_RocketMQ 运维指令
  7. 网页表格线框html,关于Dreamweaver中怎么让html网页中的table边框细线显示?
  8. mindray心电监护仪使用说明_怎么看监护仪上的参数
  9. 爱卡创誓记java刷钱_【178创誓记】快速升级:40到50级只需要两天的黄金刷
  10. 下学期计算机教学工作计划,初中信息技术下学期教学工作计划