树状数组上二分

编程入门 行业动态 更新时间:2024-10-19 17:19:04

若找前缀和小于等于x的第一个数
整个运算过程是这样的:
从二进制的高位开始取
若当前位为1,和大于x,那么这一位就不能取1,否者当前位取1。
就这样一直判断下去,每个位置都有选或不选两种情况

#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
#define int  long longint n,q;
int c[N], a[N];int query(int x)
{int pos = 0, t = 0;// 就是二分的过程// 先从高位开始取,如果当前这一位可以取,那么就考虑下一位是取1还是0// 到最后找到的就是最大的那个pos并且对应的<=x的for(int j = 18; j >= 0; j --){if(pos + (1 << j) <= n && t + c[pos + (1 << j)] <= x){pos += (1 << j);t += c[pos];}}return pos;
}void modify(int x, int d)
{for(;x<=n;x+=x&(-x)) c[x] += d;
}signed main()
{cin >> n >> q;for(int i = 1; i <= n; i ++){scanf("%lld",&a[i]);modify(i, a[i]);}int op, x, d;while (q--){scanf("%lld%lld",&op,&x);if(op == 1){scanf("%lld", &d);modify(x, d - a[x]);a[x] = d;}else{printf("%lld\n", query(x));}}}

更多推荐

树状,数组

本文发布于:2023-05-28 06:56:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/315122.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:树状   数组

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!