【线段树求区间第一个不大于val的值】Lpl and Energy-saving Lamps
https://nanti.jisuanke.com/t/30996
线段树维护区间最小值,查询的时候优先向左走,如果左边已经找到了,就不用再往右了。
一个房间装满则把权值标记为INF,模拟一遍,注意考虑一个月内装满多个房间和装满所有房间后不用再购买的情况。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
const int maxn = 100005;
const int INF = 0x3f3f3f3f;
using namespace std;
int a[maxn], St[maxn << 2], Q[maxn], ans[maxn], remain[maxn];
void PushUp(int rt) {
St[rt] = min(St[rt << 1], St[rt << 1 | 1]);
}
void Build(int l, int r, int rt) {
if (l == r) {
St[rt] = a[l];
return;
}
int m = (l + r) >> 1;
Build(l, m, rt << 1);
Build(m + 1, r, rt << 1 | 1);
PushUp(rt);
}
void Update(int L, int C, int l, int r, int rt) {
if (l == r) {
St[rt] = C;
return;
}
int m = (l + r) >> 1;
if (L <= m) {
Update(L, C, l, m, rt << 1);
}
else {
Update(L, C, m + 1, r, rt << 1 | 1);
}
PushUp(rt);
}
int Query(int val, int L, int R, int l, int r, int rt) {
if (l == r) {
if (St[rt] <= val) {
return l;
}
return INF;
}
if (L <= l && R >= r) {
if (St[rt] > val) {
return INF;
}
}
int m = (l + r) >> 1;
int ANS = INF;
if (L <= m) ANS = min(ANS, Query(val, L, R, l, m, rt << 1));
if (ANS != INF) {
return ANS;
}
if (R > m) ANS = min(ANS, Query(val, L, R, m + 1, r, rt << 1 | 1));
return ANS;
}
int main() {
int n, m, q, mxq = 0;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
scanf("%d", &q);
for (int i = 1; i <= q; i++) {
scanf("%d", &Q[i]);
mxq = max(mxq, Q[i]);
}
Build(1, n, 1);
for (int i = 1, now = m, fin = 0; i <= mxq; i++, fin >= n ? 0 : now += m) {
int p = Query(now, 1, n, 1, n, 1);
ans[i] = ans[i - 1];
while (p != INF) {
fin++;
ans[i]++;
now -= a[p];
Update(p, INF, 1, n, 1);
p = Query(now, 1, n, 1, n, 1);
}
remain[i] = now;
}
for (int i = 1; i <= q; i++) {
printf("%d %d\n", ans[Q[i]], remain[Q[i]]);
}
}
【线段树求区间第一个不大于val的值】Lpl and Energy-saving Lamps的更多相关文章
- 2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)
原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthes ...
- xdoj-1324 (区间离散化-线段树求区间最值)
思想 : 1 优化:题意是覆盖点,将区间看成 (l,r)转化为( l-1,r) 覆盖区间 2 核心:dp[i] 覆盖从1到i区间的最小花费 dp[a[i].r]=min (dp[k])+a[i]s; ...
- hdu 1754 I Hate It (线段树求区间最值)
HDU1754 I Hate It Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u D ...
- poj 3264 线段树 求区间最大最小值
Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same ...
- hdu1166 敌兵布阵(线段树 求区间和 更新点)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- BZOJ 4127: Abs (树链剖分 线段树求区间绝对值之和 带区间加法)
题意 给定一棵树,设计数据结构支持以下操作 1 u v d 表示将路径 (u,v) 加d(d>=0) 2 u v 表示询问路径 (u,v) 上点权绝对值的和 分析 绝对值之和不好处理,那么我们开 ...
- HDU6447 YJJ's Salesman-2018CCPC网络赛-线段树求区间最值+离散化+dp
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:Portal传送门 原题目描述在最下面. 1e5个点,问 ...
- POJ3264(线段树求区间最大最小值)
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 41162 Accepted: 19327 ...
- hdu3074 线段树求区间乘积(单点更新)
题意: 给你n个数,两种操作,(1) 把第b个数改成c (2)算出b-c的乘积,结果对1000000007取余. 思路: 线段树单点更新,简单题目,不多解释,具体看代码. #i ...
随机推荐
- 使用xampp发现php的date()函数与本地相差7个小时
具体方法: 1. 打开php.ini 2. 搜索timezone 3. 修改为PRC 4. 回车键 5. 修改为PRC 6. 完成 没想到这么一个小问题也是一个大坑,在网上找了半天基本都是说要修改这个 ...
- java 关于String
1.两种创建方式 String str1 = "abc"; //字面量创建 String str2 = new String("abc"); //构造方法创建 ...
- Python中级 —— 05访问数据库
** 写在前面 ------------------> ** 廖雪峰 菜鸟 数据库类别 首先选择一个关系数据库.目前广泛使用的关系数据库也就这么几种: 付费的商用数据库: Oracle:典型的高 ...
- SylixOS 系统初探
国产嵌入式硬实时操作系统 SylixOS 初体验 关于 SylixOS 详细了解请见:http://wiki.sylixos.com/index.php/%E7%B3%BB%E7%BB%9F%E7%A ...
- 从零开始的Python学习Episode 14——日志操作
日志操作 一.logging模块 %(message)s 日志信息 %(levelno)s 日志级别 datefmt 设置时间格式 filename 设置日志保存的路径 level 设置日志记录的级别 ...
- Selenium_python自动化环境搭建篇
説 明: 本篇随笔讲解Selenium+python自动化环境的搭建,此随笔暂不介绍Selenium3,Selenium3需要考虑环境依赖驱动等相关问提比较多一篇随笔没法説完,所以暂不介绍,当然你可以 ...
- 双端队列 ADT接口 数组实现
Deque ADT接口 DEQUEUE.h: #include <stdlib.h> #include "Item.h" void DEQUEUEinit(int); ...
- ubuntu配置机器学习环境(二) cuda 和cudnn 安装
Nvidia CUDA Toolkit的安装(cuda) PS:特别推荐*.deb的方法,目前已提供离线版的deb文件,该方法比较简单,不需要切换到tty模式,因此不再提供原来的*.run安装方法,这 ...
- 20155216 2016-2017-2 《Java程序设计》第七周学习总结
20155216 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 认识Lambda表达式语法 Lambda表达式不需要也不允许使用throws关键字来声明可能 ...
- 2017-2018-1 20155323《信息安全技术》实验二 Windows口令破解
2017-2018-1 20155323<信息安全技术>实验二 Windows口令破解 实验目的 了解Windows口令破解原理 对信息安全有直观感性认识 能够运用工具实现口令破解 系统环 ...