HDU1899 Sum the K-th's(树状数组)
枚举,每次增加点,删除点
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#include<utility>
using namespace std;
typedef long long LL;
const int N = 100008, INF = 0x3F3F3F3F, MOD = 1000000007 ;
#define MS(a, num) memset(a, num, sizeof(a))
int C[N];
int n, m, k;
int a[N], rak[N];
struct data{
int num, i;
}b[N];
inline int lowbit(int x){
return x&-x;
}
inline void add(int x, int val){//将第x个数增加val,从1计数
for(int i=x;i<=n;i+=lowbit(i)){
C[i] += val;
}
}
inline int sum(int x){//求1到x的和
int ret = 0;
for(int i=x;i>0;i-=lowbit(i)){
ret+=C[i];
}
return ret;
}
bool cmp(const data &a, const data &b){
return a.num < b.num;
}
int getK(int val){
int l = 1, r = n + 1;
while(l < r){
int m = (l + r)>>1;
int s = sum(m);
if(s < k){
l = m + 1;
}else{
r = m;
}
}
return b[l -1].num;
}
int main(){
int t;
cin>>t;
while(t--){
scanf("%d %d %d", &n, &m, &k);
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
b[i].num = a[i];
b[i].i = i;
}
MS(C, 0);
sort(b, b + n, cmp);
for(int i = 0; i< n; i++){
rak[b[i].i] = i + 1;
}
LL ans = 0;
for(int i = 0; i < m; i++){
add(rak[i % n], 1);
}
for(int i = m + 1; i < 2 * m + 1 ;i++){
add(rak[i % n], 1);
}
for(int i = m ; i <= m + n -1 ; i++){
ans += getK(a[i % n]);
ans %= MOD;
if(i != m + n -1 ){
add(rak[(i - m)%n], -1);
add(rak[(i + m + 1) % n], 1);
add(rak[i % n], 1);
add(rak[(i + 1) % n], -1);
}
}
printf("%I64d\n", ans % MOD);
}
return 0;
}
转载于:https://www.cnblogs.com/IMGavin/p/5708417.html
HDU1899 Sum the K-th's(树状数组)相关推荐
- 动态区间第k小:树状数组套权值线段树
所谓树状数组套权值线段树,就是在树状树组上套权值线段树 (逃) 解析 如何解决静态区间第k小? 使用主席树就ok啦 辣么如何解决动态区间第k小嘞- 我们想想主席树为啥不能解决动态区间第k小 因为如果改 ...
- ACM入门之【树状数组】
树状数组和线段树具有相似的功能,但他俩毕竟还有一些区别:树状数组能有的操作,线段树一定有:线段树有的操作, 树状数组不一定有.但是树状数组的代码要比线段树短,思维更清晰,速度也更快,在解决一些单点修改 ...
- Educational Codeforces Round 17 E. Radio stations cdq分治 + 树状数组
传送门 文章目录 题意 思路: 题意 有nnn个电台,对于每个电台iii有三个参数xi,ri,fix_i,r_i,f_ixi,ri,fi,分别指他们的坐标.作用半径.频率.如果两个电台频率差值在 ...
- 树状数组 讲解和题目集
树状数组 树状数组作为一种实现简单.应用较广的高级数据结构,在OI界的地位越来越重要,下面我来简单介绍一下树状数组和它的简单应用. 一.树状数组简介 树状数组:顾名思义,是一种数组,其中包含了树的思想 ...
- 快乐地打牢基础(4)——树状数组
在解题的过程中,我们想维护一个数组的前缀和s[i] = A[1] + A[2] +-+A[i].我们改变任意一个A[i],那么S[i]之后都会发生变化,朴素写法调整前缀和S最坏的情况需要O(n)的时间 ...
- AcWing 蓝桥杯AB组辅导课 05、树状数组与线段树
文章目录 前言 一.树状数组 1.1.树状数组知识点 1.2.树状数组代码模板 模板题:AcWing 1264. 动态求连续区间和 例题 例题1.AcWing 1265. 数星星[中等,信息学奥赛一本 ...
- M元上升子序列【树状数组+dp】
多元组-牛客网 题解 ac代码 #include<iostream> #include<cstring> #include<algorithm> #include& ...
- 【USACO】奶牛抗议 树状数组+dp
题目描述 约翰家的 N 头奶牛正在排队游行抗议.一些奶牛情绪激动,约翰测算下来,排在第 i 位的奶牛 的理智度为 A i ,数字可正可负. 约翰希望奶牛在抗议时保持理性,为此,他打算将这条队伍分割成几 ...
- POJ 2299 Ultra-QuickSort(树状数组 + 离散)
链接:http://poj.org/problem?id=2299 题意:给出N个数组成的数列A(0 <= A[i] <= 999,999,999),求该数列逆序对的数量. 分析:题目所谓 ...
- BZOJ.2738.矩阵乘法(整体二分 二维树状数组)
题目链接 BZOJ 洛谷 整体二分.把求序列第K小的树状数组改成二维树状数组就行了. 初始答案区间有点大,离散化一下. 因为这题是一开始给点,之后询问,so可以先处理该区间值在l~mid的修改,再处理 ...
最新文章
- 由于应用universal link校验不通过_垃圾吊称重校验砝码2000kg市场行情分析
- 什么是android刷机包,什么是安卓RAM?安卓RAM和安卓ROM有什么区别?
- 深入理解MSTP域和端口角色
- android学习的一点点网站资料
- 二维数组子数组矩形和
- 一套小学生的试卷。。。
- ubuntu20.04 下查看(改变)本地端口开放情况,开启和关闭防火墙
- 实习成长之路:Redis为什么快?为什么Redis同样也是String字符串,但是要比Java性能好?SDS数据结构是什么?什么是紧凑型编程技巧?
- 调查称82%网友面对安全问题无从下手
- 如何将c语言程序变成应用,C语言代码转换为应用程序
- 使用OpenCV测量图像中物体之间的距离
- 量子科技商业化寻路,资本造势但技术落地成难|科股宝
- GTX 1050ti和GTX960哪个好
- 微信跳一跳python自动代码解读1.0
- 第四课:如何安装树莓派系统
- dataframe去掉行索引_DataFrame按索引删除行、列
- opencv光线补偿_光线补偿算法的实现
- 运维的本质是什么?阿里“无人化”智能运维平台的演进
- 电信3G上网卡自动重拨
- STM8L 读写EEPROM(24LC64)