题目传送门//res tp hdu

目的

在尾部逐步插入n个元素,求插入第i个元素时,[1,i)内删去多少个元素,可使前缀和[1,i]不大于m

多测Q [1,15]

n [1,2e5]

m [1,1e9]

每个元素Wi [1,m] (i∈[1,n]);

数据结构

树状数组

分析

维护两个树状数组,分别储存前缀和前缀中元素数量。先将元素全部读入,之后进行排列,同时记录好每个元素排列之后的下标。按下标向树状数组插入元素。之后二分枚举即可

时间复杂度O(Qnlognlogn)

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int L = 200010;
ll val[L],sor[L];
struct E{
ll v;
int pos;
}sorted[L];
int Q,POS[L];
ll n,m;
ll BIT[L],bit[L];
int Len;
int lowbit(int x){return x&-x;}
bool cmp(E a,E b){return a.v<b.v;}
void change(int x,int y){
sor[x] = y;
for(int i = x;i<=L;i+=lowbit(i)){
BIT[i] += y;bit[i]++;
}
}
ll query(int k){//对前缀和的询问
ll ans = 0;
for(int i = k;i > 0; i -= lowbit(i))
ans += BIT[i];
return ans;
}
int query1(int k){//对前缀内元素个数的询问
int ans = 0;
for(int i = k;i>0;i-=lowbit(i))
ans += bit[i];
return ans;
}
int getans(int x,int M){ //前x个元素的小序前缀之和不超过M
int lo = 1,hi = n+1;
int mi;
ll sum;
while(lo < hi){
mi = (lo + hi)>>1;
sum = query(mi);
if(M <sum) hi = mi;
else lo = mi + 1;
}
--lo;
return x-query1(lo);
} int main(){
scanf(" %d",&Q);
while(Q--){
scanf(" %lld %lld",&n,&m);
for(int i = 1;i<=n;++i) BIT[i] = bit[i] = 0;
for(int i = 1;i<=n;++i) sor[i] = 0;
for(int i = 1;i<=n;++i) {
scanf(" %lld",&val[i]);
sorted[i].v = val[i];
sorted[i].pos = i;
}
sort(sorted+1,sorted+1+n,cmp);
for(int i = 1;i<=n;++i) POS[sorted[i].pos] = i;
int ans;
for(int i = 1;i<=n;++i){
ans = getans(i-1,m-val[i]);
change(POS[i],val[i]);
printf("%d ",ans);
}
printf("\n");
}
}

hdu 6609 区间条件前缀和 + 二分的更多相关文章

  1. HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化

    HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...

  2. hdu 4471 区间条件统计 区间 不超过 x 的元素的个数

    题目传送门//res tp hdu 目的 对长度为n的区间,m次询问,每次提供一个区间两端点与一个值x,求区间内不超过x的元素个数 n 1e5 m 1e5 ai [1,1e9] (i∈[1,n]) 多 ...

  3. Acwing:102. 最佳牛围栏(前缀和 + 二分)

    农夫约翰的农场由 NN 块田地组成,每块地里都有一定数量的牛,其数量不会少于1头,也不会超过2000头. 约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最 ...

  4. hdu 5869 区间不同GCD个数(树状数组)

    Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

  5. hdu 5700区间交(线段树)

    区间交 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...

  6. hdu 4283 区间dp

    You Are the One Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  7. GXU - 7D - 区间求和 - 前缀和

    https://oj.gxu.edu.cn/contest/7/problem/D 描述 有一个所有元素皆为0的数组A,有两种操作: 1 l r x表示将A区间[l,r]内所有数加上x: 2 l r表 ...

  8. Glider(前缀和+二分)

    题目链接:Glider Gym-101911B 解题分析:下落的高度一定,是h.在没有气流的地方每秒下落1:所以可以转化为经过无气流地带的时间总长为h. 那么很显然从一个有气流地带的开始,选择下落,那 ...

  9. Codeforces 975 前缀和二分算存活人数 思维离直线速度相同判平行

    A /* Huyyt */ #include <bits/stdc++.h> using namespace std; typedef long long ll; ]; ]; map< ...

随机推荐

  1. SQL中的xp_cmdshell拒绝访问

    数据库备份作业的sql,,最后一步删除指定时间之前的文件夹.. 使用 xp_cmdshell 函数调用  RMDIR 命令删除过期文件夹,但返回拒绝访问.. 代码如下: DECLARE @PATH2 ...

  2. kubernetes架构和组件

    一.Kubernetes整体架构 Kubernetes属于主从分布式架构,主要由Master Node和Worker Node组成,以及包括客户端命令行工具kubectl和其它附加项. Master ...

  3. VirtualAlloc加载shellcode免杀一点记录

    一个很好的学习网站 推荐一下: https://docs.microsoft.com/zh-cn/windows/win32/api/ 0x01 VirtualAlloc VirtualAlloc: ...

  4. html5表单重写

    html5表单重写 一.总结 一句话总结: 表单重写用于在提交按钮上指定表单提交的各种信息,比如action <input type="submit" value=" ...

  5. MQTT 客户端应用及常见问题(C#)

    https://blog.csdn.net/dengyaan/article/details/51752327 最近因为工作需要,需要使用C# 语言编写一个通过MQTT协议 ,上传数据到云端的工具.因 ...

  6. Postman使用方法示例

  7. 【原创】aws s3 lambda缩略图生成

    参考资料: https://github.com/sagidm/s3-resizer https://aws.amazon.com/cn/blogs/compute/resize-images-on- ...

  8. iptables nat表配置

  9. C++ STL中常见容器的时间复杂度和比较和分析

    C++ STL中常见容器的时间复杂度 map, set, multimap, and multiset 上述四种容器采用红黑树实现,红黑树是平衡二叉树的一种.不同操作的时间复杂度近似为: 插入: O( ...

  10. RabbitMQ 入门教程(PHP版) 第六部分:远程调用(RPC)

    在云计算环境中,很多时候需要用它其他机器的计算资源,把一部分计算任务分配到其他节点来完成.RabbitMQ 如何使用 RPC 呢?下面将会通过其它节点完成斐波纳契示例. 流程图  当客户端启动时,它 ...