首页 > 其他分享 >Balance Update Query

Balance Update Query

时间:2024-02-29 17:57:46浏览次数:28  
标签:nums int tr Update cin define Query Balance op

link

省选前写点简单题攒 rp。

显然每次选择,我们应该将所有物品从大到小排序,每次选择最大的 \(x\) 个。

也就是每次要求前 \(x\) 大的数的和,随手写个平衡树可以做到这一操作,但是我不会,这里选择权值线段树来存贮每个数的个数,用线段树上二分解决前 \(x\) 大的数的和。

注意离散化和数组大小。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 4e5 + 5;

int n, q;
int a[N], b[N];
struct oper {
	int op, x, y;
} Q[N];
vector<int> nums;

struct SegT {
	int l, r, siz;
	ll sum;
	#define l(x) tr[x].l
	#define r(x) tr[x].r
	#define siz(x) tr[x].siz
	#define sum(x) tr[x].sum 
} tr[N << 2];

void build(int l, int r, int x) {
	tr[x] = {l, r};
	if (l == r) {
		return;
	}
	int mid = (l + r) / 2;
	build(l, mid, x * 2), build(mid + 1, r, x * 2 + 1);
}

void pushup(int x) {
	siz(x) = siz(x * 2) + siz(x * 2 + 1);
	sum(x) = sum(x * 2) + sum(x * 2 + 1);
}

void update(int x, int p, int v) {
	if (l(x) == r(x)) {
		siz(x) += v;
		sum(x) += 1ll * nums[p - 1] * v;
		return;
	}
	int mid = (l(x) + r(x)) / 2;
	if (p <= mid) update(x * 2, p, v);
	else update(x * 2 + 1, p, v);
	pushup(x);
}

ll query(int x, int k) {
	if (!k) return 0;
	if (l(x) == r(x)) {
		return 1ll * k * nums[l(x) - 1];
	}
	int mid = (l(x) + r(x)) / 2;
	if (siz(x * 2 + 1) >= k) return query(x * 2 + 1, k);
	else return sum(x * 2 + 1) + query(x * 2, k - siz(x * 2 + 1));
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);

    cin >> n;
    for (int i = 1; i <= n; i ++) {
    	cin >> a[i] >> b[i];
    	nums.push_back(a[i]);
    }
    cin >> q;
    for (int i = 1; i <= q; i ++) {
    	int op, x, y = 0;
    	cin >> op >> x;
    	if (op == 1) {
    		cin >> y;
    		nums.push_back(y);
    	}
    	else if (op == 2) {
    		cin >> y;
    	}
    	Q[i] = (oper){op, x, y};
    }

    sort(nums.begin(), nums.end());
    nums.erase(unique(nums.begin(), nums.end()), nums.end());

    build(1, (int)nums.size(), 1);

    for (int i = 1; i <= n; i ++) {
    	a[i] = lower_bound(nums.begin(), nums.end(), a[i]) - nums.begin() + 1;
    	update(1, a[i], b[i]);
    }
    for (int i = 1; i <= q; i ++) {
    	int op = Q[i].op, x = Q[i].x, y = Q[i].y;
    	if (op == 1) {
    		y = lower_bound(nums.begin(), nums.end(), y) - nums.begin() + 1;
    		update(1, a[x], -b[x]);
    		a[x] = y;
    		update(1, a[x], b[x]);
    	}
    	else if (op == 2) {
    		update(1, a[x], y - b[x]);
    		b[x] = y;
    	}
    	else {
    		if (siz(1) < x) {
    			cout << -1 << '\n';
    		}
    		else {
    			cout << query(1, x) << '\n';
    		}
    	}
    }
    return 0;
}

标签:nums,int,tr,Update,cin,define,Query,Balance,op
From: https://www.cnblogs.com/Svemit/p/18044955

相关文章

  • IDEA更新本地代码丢失,IDEA使用Update Project更新本地代码丢失
    问题原因提交代码前,IDEA更新Git本地代码丢失,IDEA使用UpdateProject更新Git本地代码丢失,更新代码时执行UpdateProject操作。执行完该操作会发现IDEA没有任何提示,默认覆盖了你本地还未提交的代码,本地呕心沥血写的代码瞬间人间蒸发解决办法LocalHistory(本地历史更改记录)当出现......
  • 【3.0】前端基础jQuery之进阶
    【一】操作标签【1】操作类(1)JS版本[1]classList.add()方法用于向元素添加一个或多个类名。如果指定的类名已存在,则不会添加。element.classList.add("class1","class2");[2]classList.remove()方法用于从元素移除一个或多个类名。如果指定的类名不存在,则不会......
  • 【2.0】前端基础jQuery之引入
    【一】jQuery基本语法【1】基本语法jQuery(选择器).action()【2】简写秉承jQuery宗旨,jQuery简写成$jQuery(选择器)---->$(选择器)【二】jQuery与原生JS代码比较将P标签内部的文本颜色改成红色<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-......
  • 【1.0】jQuery引入
    【一】什么是jQuery【1】概述jQuery是一个轻量级的、兼容多浏览器的JavaScript库。jQuery使用户能够更方便地处理HTMLDocument、Events、实现动画效果、方便地进行Ajax交互,能够极大地简化JavaScript编程。它的宗旨就是:“Writeless,domore.“【2】小结jQuery内部封装......
  • 由select for update锁等待问题引发的深入思考
    关于MySQL的加锁机制,其实十分复杂,不同的隔离级别,是否是主键或索引,锁的粒度等等。很多工作了很多年的MySQLDBA也不能把各种加锁场景一一讲清楚。有时候一个简单的锁等待场景都值得深入研究,大家更多的是知其然而不知其所以然。本文介绍的是一个很常见的锁等待问题,但很少有人知道其......
  • spring boot 中使用MybatisPlus的自动填充createTime和updateTime
    首先需要在实体类的字段上加上注解,并且将类型更改为LocalDateTime@TableField(fill=FieldFill.INSERT)@JsonInclude(value=JsonInclude.Include.NON_NULL)@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss")privateLocalDateTimecreateTime;@TableFie......
  • jQuery对象与DOM对象之间的转换方法
    jQuery对象与DOM对象之间的转换方法刚开始学习jquery,可能一时会分不清楚哪些是jQuery对象,哪些是DOM对象。至于DOM对象不多解释,我们接触的太多了,下面重点介绍一下jQuery,以及两者相互间的转换。什么是jQuery对象?就是通过jQuery包装DOM对象后产生的对象。jQuery对象是jQuery独有的......
  • jQuery
    jQuery(1)介绍jQuery是一个流行的JavaScript库,它简化了JavaScript在网页开发中的操作。jQuery提供了许多实用的方法和函数,使得操作DOM、处理事件、执行动画等变得更加简单和高效。(2)jQuery基本语法jQuery简写$jQuery(选择器).action()(3)基本选择器(1)id选择器$('#......
  • vue前端引用Jquery完成复选框多选
    vue2前端引用Jquery完成复选框多选通常我们使用element-ui中el-table的多选模板完成列表的多选,但是有时需要把表格进行拆分,此时仅凭element-ui中的控件可能无法实现拆分后的多选。由于vue是JavaScript的前端框架,所以我考虑使用js来实现。jQuery作为JavaScript的补充和扩展,可以更......
  • Jquery中offset和position的区别
    一、Jquery中offset() 获取匹配元素在当前视口的相对偏移。总是计算相对于文档的位置,无论元素的父元素或祖先元素的position属性是什么。返回的对象包含两个整形属性:top和left。此方法只对可见元素有效。 例如:二、Jquery中position() 获取匹配元素相对父元素的偏移......