传送门: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基础学习笔记(十一)

    迭代器 本节进行迭代器的讨论.只讨论一个特殊方法---- __iter__  ,这个方法是迭代器规则的基础. 迭代器规则 迭代的意思是重复做一些事很多次---就像在循环中做的那样.__iter__ 方 ...

  2. bootstrap完善按钮组bug

    .btn.active { border: 1px solid #ff9400 !important; color: #ff9400 !important; } <div class=" ...

  3. 《Linux内核分析》课程第八周学习总结

    姓名:何伟钦 学号:20135223 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  4. Android动画总结

    本文总结常用属性方法等,详细学习可使用如下郭霖大神文章: Android属性动画完全解析(上),初识属性动画的基本用法 Android属性动画完全解析(中),ValueAnimator和ObjectA ...

  5. suqid透明正向代理

    如果想实现透明正向代理,则必需将用户的网关IP指向 Squid 服务器,而此后便无需再修改浏览器选项 在命令行 <菜单+R> 中使用 ping  命令: ping  www.baidu.c ...

  6. ThreadPoolExecutor源码解读

    1. 背景与简介 在Java中异步任务的处理,我们通常会使用Executor框架,而ThreadPoolExecutor是JUC为我们提供的线程池实现. 线程池的优点在于规避线程的频繁创建,对线程资源 ...

  7. ESXi虚拟机开机进入bios的方法

    想要修改启动顺序, 发现界面比较难弄 应该是在设置里面有修正. 首先编辑设置 增加如下设置 就可以了.

  8. gitbook 简单使用

    gitbook 简单使用 之前由于公司培训过使用 gitbook,当时也没有进行安装使用.当时就感觉就是 markdown 语法,加上我本来就是使用 markdown 进行写博客之类.再加上这个东西本 ...

  9. IDEA Maven 项目默认编译项目为JDK 1.5

    昨天晚上遇到一个问题,我在idea中创建了有个maven项目,想使用jdk1.8的lambda表达式,结果提示我错误,是1.8才可以.当时我想我的jdk就是1.8啊.经过各种搜索,才知道maven默认 ...

  10. CentOS_7 网络配置(临)

    https://www.cnblogs.com/kouryoushine/p/8011978.html 先转载一个,找个时间详细写一下