题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6609

题目大意:给定一个含有n个数的序列,还有一个m,对于每个i(1<=i<=n)求出最少需要将前i-1个数中的多少个数改成0,才能使得前i个数的和小于m

解题思路:很容易想到,我们应该将比较大的数变为0,答案才是最优的。所以我们直接给他们排个序离散化一下,对应它们在树上的编号,树上节点存两个东西,一个是节点的权值之和,还有一个就是包含数的个数,每次查询时,先将前i-1个数更新到树上,可以保证后面的数不影响答案,假设前i个数的和sum-m=x,则我们只要二分找到个一个最大的l,使得区间[l,n]大于等于x就可以了,这样答案就是区间[l,n]的数的个数了。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+;
int n,m,ans[maxn];
struct node{
int val,id,rk;
}a[maxn];
bool cmp1(node x,node y){
return x.val<y.val;
}
bool cmp2(node x,node y){
return x.id<y.id;
}
ll sum[maxn],num[maxn];
int Ans;
int lowbit(int x){
return x&(-x);
}
void add(int x,ll val){
while(x<=n){
num[x]++;
sum[x]+=val;
x+=lowbit(x);
}
}
ll ask(int x){
ll res=;
while(x){
Ans+=num[x];
res+=sum[x];
x-=lowbit(x);
}
return res;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
memset(num,,sizeof(num));
memset(sum,,sizeof(sum));
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d",&a[i].val);
a[i].id=i;
}
sort(a+,a++n,cmp1);
for(int i=;i<=n;i++)
a[i].rk=i;
sort(a+,a++n,cmp2);
ll tmp=;
for(int i=;i<=n;i++){
tmp+=a[i].val;
if(tmp<=m)ans[i]=;
else{
ll x=tmp-m;
int l=,r=n;
Ans=;
ll s1=ask(n); ll Ans1=Ans;
while(l<=r){
int mid=l+r>>;
Ans=;
ll s2=ask(mid); ll Ans2=Ans;
if(s1-s2>=x){
ans[i]=Ans1-Ans2;
l=mid+;
}else r=mid-;
}
}
// cout<<a[i].rk<<" "<<a[i].val<<endl;
add(a[i].rk,a[i].val);
}
for(int i=;i<=n;i++)
printf("%d ",ans[i]);
printf("\n");
}
return ;
}

最新文章

  1. Android种使用Notification实现通知管理以及自定义通知栏(Notification示例四)
  2. Angular JS 学习之路由
  3. Android应用内语言切换实现(转)
  4. RabbitMQ使用相关笔记
  5. hdu2825Wireless Password(ac+dp)
  6. DOJO官方API翻译或解读-dojo/store (自定制存储器)
  7. 为什么objc_msgSend必须用汇编实现
  8. ajax无刷新方式收集表单并提交表单
  9. Sqlserver 正则替换函数的一种实现
  10. bootstrap基础知识点YI
  11. Neutron 不健全的HA ROUTER
  12. 草料Chrome浏览器插件,让二维码更好用
  13. CMDB服务器管理系统【s5day88】:采集资产-文件配置(一)
  14. Problem A: Apple(高斯消元)
  15. vim小技巧2
  16. [Leetcode] Template to rotate matrix
  17. ASP.NET写的一个博客系统
  18. .net 操作MongoDB 基础
  19. C#编程(十七)----------Object类
  20. C# Encoding UTF-16 ,C#中的UTF16

热门文章

  1. (3.3)狄泰软件学院C++课程学习剖析四
  2. SpringCloud 教程 (四) docker部署spring cloud项目
  3. Oracle update或alter表被锁住的问题
  4. HTML,CSS,JS个别知识点总结
  5. 基于GTID模式MySQL主从复制
  6. Linux_LDAP+NFS+autofs
  7. npm构建vue项目
  8. 四种方法给Vmware虚拟机清理瘦身
  9. 【Unity Shader】---准确认识SubShader语义块结构、渲染状态设定、Tags标签
  10. 二维数组中的查找-剑指 offerP38