传送门:Problem J

https://www.cnblogs.com/violet-acmer/p/9720603.html

变量解释:

  need[ i ] : 第 i 个房间含有的旧灯泡个数。

  remain[ i ] : 第 i 月后,换完满足条件的房间的旧灯泡后剩余节能灯泡的个数。

  total[ i ] : 前 i 个月换灯泡的房间数。

题意:

  有n个房间,每个房间都有need[ i ] 个旧灯泡等着男主角去换,男主角Lpl每个月都会购买m个节能灯泡,按照输入顺序给房间换灯泡,如果当前房间满足条件,则全部换完,不满足,跳到下一个房间,重复当前步骤。

  如果当前房间并不能将新灯泡全部用完,则留着新灯泡给下个月使用。

  有q个询问,每个询问给你一个值mon,代表当前月,输出[1,mon]月换灯泡的房间个数,以及还玩灯泡后新灯泡的剩余个数。

题解:

  最简单的方法就是暴力,从第一个月开始枚举所有的房间,知道所有的房间都换完,或来到询问的最大月份,毋庸置疑,此操作的时间复杂度为O(max_mon*n),而本题的数据范围为1~1e5,显然会超时,1e5需要的实践复杂度至多为n*logn。

  换个思路,考虑一下线段树。

  线段树中当前结点的val值存储的是左右孩子中需要换灯泡的最小值,对于第 i 个月份,优先更新满足条件的左孩子区间,当左孩子不满足条件是,回溯到右孩子区间,直到不满足条件跳出递归。

  对于满足条件的房间,在更换完灯泡后,将其val值设为最大值INF,并向上更新其父亲的val。

  具体细节,看代码............

AC代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ls(x) ((x)<<1)
#define rs(x) ((x)<<1 | 1)
#define INF 0x3f3f3f3f
const int maxn=1e5+; int need[maxn];
int remain[maxn];
int total[maxn];
int lamps;//当前月份的新灯泡数量
int sum;//前 i 个月可以换灯泡的房间数
struct Node1
{
int l,r;
int val;
int mid(){
return l+((r-l)>>);
}
}segTree[*maxn];
void pushUp(int pos)
{
segTree[pos].val=min(segTree[ls(pos)].val,segTree[rs(pos)].val);
}
void buildTree(int l,int r,int pos)
{
segTree[pos].l=l,segTree[pos].r=r;
if(l == r)
{
segTree[pos].val=need[l];
return ;
}
int mid=l+((r-l)>>);
buildTree(l,mid,ls(pos));
buildTree(mid+,r,rs(pos));
pushUp(pos);
}
void update(int pos,int i)
{
if(segTree[pos].l == segTree[pos].r && segTree[pos].val <= lamps)
{
lamps -= segTree[pos].val;
segTree[pos].val=INF;//当前房间换完灯泡后,设置成最大值
pushUp(pos>>);//向上更新 sum++;//可以更换的房间数 ++
return ;
}
if(segTree[pos].val <= lamps)
{
if(segTree[ls(pos)].val <= lamps)//优先判断左孩子是否满足条件
update(ls(pos),i);
update(rs(pos),i);
}
pushUp(pos>>);//向上更新
}
void init()
{
lamps=;
sum=;
memset(remain,,sizeof(remain));
memset(total,,sizeof(total));
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
init();
for(int i=;i <= n;++i)
scanf("%d",need+i);
buildTree(,n,); for(int i=;i <= ;++i)//月份最多是100000
{
lamps=remain[i-]+m;
update(,i);
remain[i]=(total[i-] == n ? remain[i-]:lamps);//更新当前月份的剩余新灯泡数量
total[i]=sum;//更新前 i 个月可以更换的房间数
}
int q;
scanf("%d",&q);
for(int i=;i <= q;++i)
{
int mon;
scanf("%d",&mon);
printf("%d %d\n",total[mon],remain[mon]);
}
}
}

2018.9南京网络预选赛(J)的更多相关文章

  1. 2018.9青岛网络预选赛(J)

    传送门:Problem J https://www.cnblogs.com/violet-acmer/p/9664805.html 题目大意: BaoBao和DreamGrid玩游戏,轮流按灯的按钮, ...

  2. 【2018沈阳赛区网络预选赛J题】Ka Chang【分块+DFS序+线段树】

    题意 给出一个有根树(根是1),有n个结点.初始的时候每个结点的值都是0.下面有q个操作,操作有两种,操作1.将深度为L的点的值全部增加X.操作2.查询以x为根的子树的结点值得和. 其中N,Q< ...

  3. 【2018沈阳赛区网络预选赛J题】Fantastic Graph 【有上下界的网络流】

    要补的题太多了导致最近没写博客(好吧是我懒) 题目链接https://nanti.jisuanke.com/t/31447 题意 给出一个二分图,问能否挑选出一些边,使得每个点的度数都在[L,R]这个 ...

  4. ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer (最大生成树+LCA求节点距离)

    ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer J. Maze Designer After the long vacation, the maze designer ...

  5. 2018.9青岛网络预选赛(B)

    传送门:Problem(B) https://www.cnblogs.com/violet-acmer/p/9664805.html 参考资料: https://blog.csdn.net/qq_40 ...

  6. ACM-ICPC 2018 沈阳赛区网络预赛 J树分块

    J. Ka Chang Given a rooted tree ( the root is node 11 ) of NN nodes. Initially, each node has zero p ...

  7. ACM-ICPC 2018 焦作赛区网络预赛J题 Participate in E-sports

    Jessie and Justin want to participate in e-sports. E-sports contain many games, but they don't know ...

  8. ICPC 2018 南京网络赛 J Magical Girl Haze(多层图最短路)

    传送门:https://nanti.jisuanke.com/t/A1958 题意:n个点m条边的路,你有k次机会将某条路上的边权变为0,问你最短路径长度 题解:最短路变形,我们需要在常规的最短路上多 ...

  9. Sum 南京网络赛J题

    题意: 统计每个数的因子的对数,如果因子能被某个平方数整除,则不统计在内,每对因子有序 解析: 我们对某个数n进行质因子分解,如果某个质因子的指数大于2则 f(n) = 0, 例 N = X3 * M ...

随机推荐

  1. Python进阶量化交易专栏场外篇7- 装饰器计算代码时间

    欢迎大家订阅<教你用 Python 进阶量化交易>专栏!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外已陆续推出一些手记来辅助同学们学习本专栏内容,目前已推出如下扩展篇: 在第一篇 ...

  2. db2安装

    官网下载: DB2 11.1 data server trial for Linux® on AMD64 and Intel® EM64T systems (x64)v11.1_linuxx64_se ...

  3. 电梯调度系统(界面由C图形库编绘)

    1.编程题目 电梯调度系统 2.结对编程组员 黄冠译,刘畅 3.编程语言 C语言图形库 4题目要求 编写人员:刘畅,黄冠译 代码如下: # include <stdio.h> # incl ...

  4. MySQL中wait_timeout的坑

    今天遇到了一个问题,一个项目,放到服务器(tomcat)下面的跑,但第二天,总是报错,项目还不能跑 com.mysql.jdbc.exceptions.jdbc4.CommunicationsExce ...

  5. Spring中 @Autowired标签与 @Resource标签 的区别

    http://blog.csdn.net/angus_17/article/details/7543478 http://bbs.csdn.net/topics/390175654 https://w ...

  6. Java Date Compare

    Date a;Date b;假设现在你已经实例化了a和ba.after(b)返回一个boolean,如果a的时间在b之后(不包括等于)返回true b.before(a)返回一个boolean,如果b ...

  7. Delphi处理Http请求自定义Header

    在HTTP请求中,get方法是默认的,但在URL地址长度是有限的,请求方法能传送的数据也是有限的,一般get方法传递的数据不能大于2KB,当get请求方法传递的数据长度不能满足需求时,就需要采用另一种 ...

  8. SyntaxHighlighter行号显示错误问题解决方案

    SyntaxHighlighter是根据代码中的换行符分配行号的.但是,如果一行代码或者注释比较长,在页面显示时需要分成多行显示,会出现行号对不上的问题,像这样: 通过设置CSS强制不换行,可以保证行 ...

  9. Zabbix的简单使用

    0. 卸载mariadb 安装mysql 方法 rpm -qa |grep mariadb 然后 rpm -e --nodeps mariadb***** 安装mysql # 下载mysql源安装包 ...

  10. ionic创建项目失败

    × Downloading and extracting blank starter - failed![ERROR] Network connectivity error occurred, are ...