ICPC 徐州 H Yuuki and a problem (树状数组套主席树)
Yuuki and a problem
题目要我们给出一个区间[l,r][l, r][l,r]中,不能通过权值+++得到的最小的数字是什么,
- sum=sumxsum = sum_xsum=sumx,显然我们无法合成x+1x + 1x+1了。
- sum≥sumxsum \geq sum_xsum≥sumx,为什么[x+1,sum][x + 1, sum][x+1,sum]之间的数一定可以合成呢?sum=sumx+k(x+1)sum = sum_x + k(x + 1)sum=sumx+k(x+1),我们假定k=1k = 1k=1,由于有前提条件[1,x][1, x][1,x]之间的数是可以合成的,在x+1x + 1x+1的基础上我们可以得到[x+1,x+1+sumx][x + 1, x + 1 + sum_x][x+1,x+1+sumx]之间的数字。
以此每次递增查询,最多就是一个斐波那契数列的形式,所以最多查询不到303030次。
再考虑第一问的修改操作,修改操作,跟区间查询操作连到一起容易想到带修主席树(树状数组套主席树),
整体复杂度30×mlognlogn30 \times m \log n \log n30×mlognlogn。
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 2e5 + 10, maxn = 200000;int a[N], n, m;int root[N], ls[N << 7], rs[N << 7], num;ll sum[N << 7];int A[N], B[N], cnt1, cnt2;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] += 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);}
}ll query(int l, int r, int L, int R) {if (l >= L && r <= R) {ll ans = 0;for (int i = 1; i <= cnt1; i++) {ans -= sum[A[i]];}for (int i = 1; i <= cnt2; i++) {ans += sum[B[i]];}return ans;}int mid = l + r >> 1;ll ans = 0;if (L <= mid) {int A1[30], B1[30];for (int i = 1; i <= cnt1; i++) {A1[i] = A[i];A[i] = ls[A[i]];}for (int i = 1; i <= cnt2; i++) {B1[i] = B[i];B[i] = ls[B[i]];}ans += query(l, mid, L, R);for (int i = 1; i <= cnt1; i++) {A[i] = A1[i];}for (int i = 1; i <= cnt2; i++) {B[i] = B1[i];}}if (R > mid) {int A1[30], B1[30];for (int i = 1; i <= cnt1; i++) {A1[i] = A[i];A[i] = rs[A[i]];}for (int i = 1; i <= cnt2; i++) {B1[i] = B[i];B[i] = rs[B[i]];}ans += query(mid + 1, r, L, R);for (int i = 1; i <= cnt1; i++) {A[i] = A1[i];}for (int i = 1; i <= cnt2; i++) {B[i] = B1[i];}}return ans;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);scanf("%d %d", &n, &m);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);for (int j = i; j <= n; j += lowbit(j)) {update(root[j], 1, maxn, a[i], a[i]);}}for (int i = 1; i <= m; i++) {int op, x, y;scanf("%d %d %d", &op, &x, &y);if (op & 1) {for (int j = x; j <= n; j += lowbit(j)) {update(root[j], 1, maxn, a[x], -a[x]);}a[x] = y;for (int j = x; j <= n; j += lowbit(j)) {update(root[j], 1, maxn, a[x], a[x]);}}else {cnt1 = cnt2 = 0;for (int j = x - 1; j; j -= lowbit(j)) {A[++cnt1] = root[j];}for (int j = y; j; j -= lowbit(j)) {B[++cnt2] = root[j];}ll cur = 0, sum = 0;do {cur = sum + 1;sum = query(1, maxn, 1, min(cur, 1ll * maxn));}while (sum >= cur);printf("%lld\n", sum + 1);}}return 0;
}
ICPC 徐州 H Yuuki and a problem (树状数组套主席树)相关推荐
- H - Hello Ms. Ze(树状数组套主席树,线段树上二分)
H - Hello Ms. Ze 给定nnn种不同的材料,第iii种材料有aia_iai个,有mmm个操作,操作分为两类: 把第xxx种材料修改为yyy个, 只用[l,r][l, r][l,r]区间 ...
- #279. [SYZOI Round1] 滑稽♂树(树状数组套主席树)
#279. [SYZOI Round1] 滑稽♂树 子树上的问题,考虑dfsdfsdfs序,第kkk大,可以用主席树嘛,支持修改,那就树状数组上套主席树,参考P4175 [CTSC2008]网络管理( ...
- 【BZOJ1901】Dynamic Rankings,树状数组套主席树
Time:2016.05.09 Author:xiaoyimi 转载注明出处谢谢 传送门(权限) 题面 1901: Zju2112 Dynamic Rankings Time Limit: 10 Se ...
- zoj 2112 树状数组 套主席树 动态求区间 第k个数
总算是把动态求区间第k个数的算法看明白了. 在主席树的基础上,如果有修改操作,则要通过套树状数组来实现任意区间求第k小的问题. 刚开始看不明白什么意思,现在有一点理解.树状数组的每个元素是一个线段树, ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...
- BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条 ...
- 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 ...
- 洛谷 - P2617 Dynamic Rankings(树状数组套主席树)
题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,再给出 m 次操作: Q l r k:返回区间 [ l , r ] 内第 k 大的数 C x y:令 a[ x ] = y 题目分析:其实 ...
- 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- ...
最新文章
- 百度CTO王海峰博鳌解读AI“融合创新”,算力算法数据发挥综合作用
- zookeeper安装教程(zookeeper3.4.5为例)
- java7新特性之Try-with-resources statement
- AbilitySlice之间的回传值
- ubuntu apt-mirror 同步源到本地
- 以Windows服务方式运行.NET Core程序
- sublime 代码格式化
- [css] 固定的外框尺寸,里面的图片尺寸不固定,如何让图像自适应外框呢?
- 萤火虫小程序_9.9元起!萤火虫中秋文化节来了!特价门票限量秒杀,手慢无!...
- python环绕文字_如何用css实现文字三面环绕图片?
- oracle 数据树,ORACLE 树形数据
- matlab图像大作业,MATLAB图像大作业
- 从零开始刷Leetcode——数组(941.977)
- Linux从初学到精通
- Spring BeanFactory、ApplicationContext IOC 容器获取与使用
- html 正则表达式密码判断,JS利用正则表达式实现简单的密码强弱判断实例
- phython在file同时写入两个_Python实现读取excel写入mysql的小工具详解
- VCPKG 升级问题
- 简单的音频转文字的转换方法
- linux cpu使用率太高,小技巧:教您一个窍门!解决Linux下CPU使用率过高的问题
热门文章
- 【C语言简单说】二:第一个C语言程序详解(3)
- python随机抽取人名_python的random
- 踩自行车来进行人力发电,真的能驱动旋转木马吗?
- 假如有人在今天炸了支付宝的存储服务器...
- java aspose重叠_Aspose.Words - 在特定位置合并两个文档
- linux代码段起始地址设置,Arch Linux安装后的一些初始设置简介
- dialog element 删掉标题_ElementUI 销毁Dialog数据(简单粗暴)
- oracle+11g+rda,Oracle RDA 4.20 初体验
- java .this的用法_JAVA中this用法小结
- php获取某地的ip,php获取本土实际IP