2018.9南京网络预选赛(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)的更多相关文章
- 2018.9青岛网络预选赛(J)
传送门:Problem J https://www.cnblogs.com/violet-acmer/p/9664805.html 题目大意: BaoBao和DreamGrid玩游戏,轮流按灯的按钮, ...
- 【2018沈阳赛区网络预选赛J题】Ka Chang【分块+DFS序+线段树】
题意 给出一个有根树(根是1),有n个结点.初始的时候每个结点的值都是0.下面有q个操作,操作有两种,操作1.将深度为L的点的值全部增加X.操作2.查询以x为根的子树的结点值得和. 其中N,Q< ...
- 【2018沈阳赛区网络预选赛J题】Fantastic Graph 【有上下界的网络流】
要补的题太多了导致最近没写博客(好吧是我懒) 题目链接https://nanti.jisuanke.com/t/31447 题意 给出一个二分图,问能否挑选出一些边,使得每个点的度数都在[L,R]这个 ...
- ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer (最大生成树+LCA求节点距离)
ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer J. Maze Designer After the long vacation, the maze designer ...
- 2018.9青岛网络预选赛(B)
传送门:Problem(B) https://www.cnblogs.com/violet-acmer/p/9664805.html 参考资料: https://blog.csdn.net/qq_40 ...
- 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 ...
- 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 ...
- ICPC 2018 南京网络赛 J Magical Girl Haze(多层图最短路)
传送门:https://nanti.jisuanke.com/t/A1958 题意:n个点m条边的路,你有k次机会将某条路上的边权变为0,问你最短路径长度 题解:最短路变形,我们需要在常规的最短路上多 ...
- Sum 南京网络赛J题
题意: 统计每个数的因子的对数,如果因子能被某个平方数整除,则不统计在内,每对因子有序 解析: 我们对某个数n进行质因子分解,如果某个质因子的指数大于2则 f(n) = 0, 例 N = X3 * M ...
随机推荐
- haproxy反向代理环境部署(http和https代理)
操作背景:前方有一台haproxy代理机器(115.100.120.57/192.168.1.7),后方两台realserver机器(192.168.1.150.192.168.1.151,没有公网i ...
- 电梯调度系统(界面由C图形库编绘)
1.编程题目 电梯调度系统 2.结对编程组员 黄冠译,刘畅 3.编程语言 C语言图形库 4题目要求 编写人员:刘畅,黄冠译 代码如下: # include <stdio.h> # incl ...
- BUAAMOOC项目M2 postmortem
设想和目标 1.我们的软件要解决什么问题?是否定义的很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件是基于北航MOOC网站做的Android手机客户端,用于便捷的在学校里通过手机做到随时随地 ...
- 实例详解Java中如何对方法进行调用
原文源自http://www.jb51.net/article/73827.htm 方法调用Java支持两种调用方法的方式,根据方法是否返回值来选择. 当程序调用一个方法时,程序的控制权交给了被调用的 ...
- 【转】GPS定位准确度CEP、RMS
转自:http://blog.sina.com.cn/s/blog_70f96fda0101lcb9.html CEP和RMS是GPS的定位准确度(俗称精度)单位,是误差概率单位.就拿2.5M CEP ...
- Sonatype Nexus 2.11.1-01 使用入门
nexus安装与启动 linux下: 安装路径 /home/maven/nexus-2.11.1-01/ 启动方法 ./bin/nexus start windows下: 管理员模式运行cmd.exe ...
- redis演练
如何查看所有的key:keys * 如何查询某个key的value:get keyname
- HTTP消息头(HTTP headers)-常用的HTTP请求头与响应头
HTTP消息头是指,在超文本传输协议( Hypertext Transfer Protocol ,HTTP)的请求和响应消息中,协议头部分的那些组件.HTTP消息头用来准确描述正在获取的资源.服务器或 ...
- jquery Ajax get()/post()
get()/post()是通過http get/post向服務器請求數據的. http get vs post: get:向指定資源獲取數據 post項指定資源提交數據. get是向遠程服務器的獲取數 ...
- cordic
cordic里向量旋转得到新向量,利用的是旋转矩阵 摘自百度百科维基百科 旋转矩阵(Rotation matrix)是在乘以一个向量的时候改变向量的方向但不改变大小的效果的矩阵.旋转矩阵不包括反演,它 ...