FJUT3574 HOME_W的附加题(带权线段树)题解
题意:
给定n个数a1,a2,a3,……an。和m次操作。
每次操作格式如下
x y k 表示将a[x]替换为y。并求替换后,前k小的数之和
思路:我们用带权线段树维护权值,这里就是维护i的个数num[i],然后顺便维护一下和。每次查询前k个数求和。
练习赛题解:
代码:
#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
typedef long long ll;
const int maxn = + ;
const int seed = ;
const ll MOD = 1e9 + ;
const ll INF = 1e17;
using namespace std;
int num[maxn << ], a[maxn], b[maxn];
ll sum[maxn << ];
void build(int l, int r, int rt){
if(l == r){
num[rt] = a[l];
sum[rt] = l * num[rt];
return;
}
int m = (l + r) >> ;
build(l, m, rt << );
build(m + , r, rt << | );
num[rt] = num[rt << ] + num[rt << | ];
sum[rt] = sum[rt << ] + sum[rt << | ];
}
void update(int pos, int l, int r, int rt, int v){
if(l == r){
num[rt] += v;
sum[rt] = l * num[rt];
return;
}
int m = (l + r) >> ;
if(pos <= m)
update(pos, l, m, rt << , v);
else
update(pos, m + , r, rt << | , v);
num[rt] = num[rt << ] + num[rt << | ];
sum[rt] = sum[rt << ] + sum[rt << | ];
}
ll query(int l, int r, int rt, int k){
if(l == r){
return l * k;
}
int m = (l + r) >> ;
ll ans = ;
if(num[rt << ] >= k){
ans += query(l, m, rt << , k);
}
else{
ans += sum[rt << ];
ans += query(m + , r, rt << | , k - num[rt << ]);
}
return ans;
}
int main(){
int n, m;
memset(a, , sizeof(a));
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++){
scanf("%d", &b[i]);
a[b[i]]++;
}
build(, , );
int x, y, k;
for(int i = ; i < m; i++){
scanf("%d%d%d", &x, &y, &k);
update(b[x], , , , -);
update(y, , , , );
b[x] = y;
printf("%lld\n", query(, , , k));
}
return ;
}
FJUT3574 HOME_W的附加题(带权线段树)题解的更多相关文章
- Light oj-1100 - Again Array Queries,又是这个题,上次那个题用的线段树,这题差点就陷坑里了,简单的抽屉原理加暴力就可以了,真是坑~~
1100 - Again Array Queries ...
- Valentine's Day Round hdu 5176 The Experience of Love [好题 带权并查集 unsigned long long]
传送门 The Experience of Love Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Ja ...
- poj1182 and 携程预赛2第一题 带权并查集
题意: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底 ...
- bzoj3307 雨天的尾巴题解及改题过程(线段树合并+lca+树上差分)
题目描述 N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多的是哪种物品. 输入格式 第一行数字N,M接下 ...
- Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)
题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...
- 【做题】cf603E——线段树分治
首先感谢题解小哥,他在标算外又总结了三种做法. 此处仅提及最后一种做法. 首先考虑题目中要求的所有结点度数为奇数的限制. 对于每一个联通块,因为所有结点总度数是偶数,所以总结点数也必须是偶数的.即所有 ...
- Wannafly Winter Camp Day8(Div1,onsite) E题 Souls-like Game 线段树 矩阵乘法
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门 Portal 原题目描述在最下面. 简单的 ...
- 2019牛客多校第八场 F题 Flowers 计算几何+线段树
2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...
- 2019牛客暑期多校训练营(第八场)E:Explorer(LCT裸题 也可用线段树模拟并查集维护连通性)
题意:给定N,M,然后给出M组信息(u,v,l,r),表示u到v有[l,r]范围的通行证有效.问有多少种通行证可以使得1和N连通. 思路:和bzoj魔法森林有点像,LCT维护最小生成树. 开始和队友 ...
随机推荐
- qq浏览器默认字体设置
- Vue系列之 => 使用钩子函数的第二个参数传参
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- html5-浮动
#div1{ background: rgba(255,0,0,0.5); width: 250px; height: 250px; float: right;}#div2{ ...
- codeoforces 975B Mancala
题意: 一个游戏,有14个洞,每个洞中开始有若干个球或者没有球. 每一步的操作,是将一个洞中的所有球取出,再逆时针放一个球到它的后一个洞,后两个洞,后三个洞....如果当前放的是最后一个,那么下一个又 ...
- 【Hadoop学习之十一】MapReduce案例分析三-PageRank
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 什么是pagerank?算法原理- ...
- c# 图像呈现控件PictureBox
在c#中可以使用PictureBox控件来呈现图像,图像资源可以来自文件,也可以是存在内存中的位图对象.可以显示本地图像文件或来自网络的图片,也可以来自项目文件中的图像. 从URI加载图像文件. 调用 ...
- 20165316 实验四 Android程序设计
20165316 孙勖哲 第四次实验 Android 程序设计1 参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECANDROID, 安装 Andr ...
- C# 设置按钮快捷键
参考自:http://www.csharpwin.com/csharpspace/3932r8132.shtml 一.C# button快捷键之第一种:Alt + *(按钮快捷键) 在Button按钮 ...
- Numpy 矩阵
矩阵定义在NumPy中,矩阵是ndarray的子类,可以由专用的字符串格式来创建 1. 创建矩阵mat函数创建矩阵(mat函数创建矩阵时,若输入已为matrix或ndarray对象,则不会为它们创建副 ...
- 计算概论(A)/基础编程练习2(8题)/6:数组逆序重放
#include<stdio.h> int main() { // 输入n个整数 ; scanf("%d", &n); // 循环读入元素 while(scan ...