线段树节点维护区间最小值,查找时优先从左侧的区间寻找.

每一次循环都在树中不停寻找第一个小于等于当前持有数的值,然后抹去,直到找不到为止.

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define lson rt<<1
#define rson rt<<1|1
#define Lson l,m,lson
#define Rson m+1,r,rson
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int maxn=1e5+5;
int val[maxn];
struct Node{
int num;
}tree[maxn<<2];
int n;
void pushup(int rt)
{
tree[rt].num = min(tree[lson].num,tree[rson].num);
} void build(int l=1,int r=n,int rt=1)
{
if(l==r){
tree[rt].num = val[l];
return ;
}
int m = (l+r)>>1;
build(Lson);
build(Rson);
pushup(rt);
} bool flag;
int query(int val,int l=1,int r=n,int rt=1)
{
int res=-1,m = (l+r)>>1;
if(tree[rt].num<=val){
if(l==r){
int tmp = tree[rt].num;
tree[rt].num = INF;
return tmp;
}
res = query(val,Lson);
if(res!=-1) {
pushup(rt);
return res;
}
res = query(val,Rson);
if(res!=-1){
pushup(rt);
return res;
}
}
return -1;
} int ans1[maxn];
int ans2[maxn];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int m,q;
while(scanf("%d %d",&n,&m)==2){
for(int i=1;i<=n;++i){
scanf("%d",&val[i]);
}
build();
flag = false;
int sum = 0,tot=0;
for(int i=1;i<=100000;++i){
//cout<<tree[1].num<<endl;
if(tree[1].num ==INF) flag = true;
if(!flag) {
sum += m;
int tmp = query(sum);
while(tmp!=-1){
sum-=tmp;
tot++;
tmp = query(sum);
}
}
ans1[i] = tot;
ans2[i] = sum;
}
int id;
scanf("%d",&q);
for(int i=1;i<=q;++i){
scanf("%d",&id);
printf("%d %d\n",ans1[id],ans2[id]);
}
}
return 0;
}

最新文章

  1. 项目vue2.0仿外卖APP(二)
  2. IIS HTTP 错误 404.17 - Not Found HTTP 错误 404.2 解决方法
  3. .NET 程序集与命名空间
  4. 使用 xsd.exe 命令工具将 xsd 架构生成 类(CS) 文件
  5. Linux基础命令之cat使用方法大全
  6. sprint3冲刺第二天
  7. 关于领域驱动设计(DDD)仓储的思考
  8. ThinkPHP讲解(二)控制器
  9. C#→关于System.Data.Linq下的Table&lt;TEntity&gt; 泛型类 的问题
  10. css怎么写链接到图片和地址
  11. Desert King
  12. bzoj4003
  13. ubuntu通过虚拟域名访问不了 502 / 网络错误
  14. Quart.Net分布式任务管理平台
  15. Mac电脑配置Apache服务器详细说明
  16. selenium数据驱动模式实现163邮箱的登录及添加联系人自动化操作
  17. 尝试dapper和postgresql
  18. yii2.0 点击验证码图片不刷新
  19. 爬虫 需要什么样的 CPU,内存 和带宽
  20. 第二阶段——个人工作总结DAY06

热门文章

  1. MyBitis(iBitis)系列随笔之一:MyBitis入门实例
  2. 一些 JS页面的 调用方式init()
  3. gradlew assembleRelease打包之前的配置
  4. Angular2 表单(一) 用户输入
  5. oracle decode处理被除数为0 的情况
  6. Intent讲解
  7. Excel宏被禁用解决办法
  8. fopen与读写的标识r,r+,rb+,rt+,w+.....
  9. iOS 引导页面启动一次
  10. ios 让两个tableView同时处于选中状态