题目链接https://nanti.jisuanke.com/t/30996

中文题目

在喝茶的过程中,公主,除其他外,问为什么这样一个善良可爱的龙在城堡里被监禁Lpl?龙神秘地笑了笑,回答说这是个大秘密。暂停后,龙补充道:

- 我们有合同。租赁协议。他总是一整天都在工作。他喜欢沉默。除此之外,住在城堡还有更多的优势。比如说,很容易证明未接来电的合理性:电话铃声无法从手机离开的城堡的另一侧到达。因此,监禁只是一个故事。实际上,他思考一切。他很聪明。例如,他开始用整个城堡中的节能灯替换白炽灯......

Lpl选择了一种节能灯模型并开始更换,如下所述。他为城堡中的所有房间编号并计算每个房间需要更换多少盏灯。

在每个月初,Lpl购买m个节能灯替换房间里的灯泡根据他的名单。他从名单上的第一个房间开始。如果这个房间的灯还没有更换,Lpl有足够的节能灯来更换所有的灯,那么他将取代所有的灯并从列表中取出房间。否则,他只是跳过它并检查他列表中的下一个房间。这个过程一直重复,直到他没有节能灯或他已经检查了他的清单中的所有房间。如果他检查了清单上的所有房间后仍然有一些节能灯,那么他将在下个月保存其余的节能灯。

一旦完成所有工作,他就会停止购买新灯具。它们质量非常高,周期长。

您的任务是在给定的月份和房间描述中计算旧灯具将用节能灯替换的房间数量以及每个月底将保留多少节能灯。

输入

每个输入都包含一个测试用例。

第一行包含整数n和m

-房间在城堡的数量和节能灯的数量,这LPL购买每月。

第二行包含n整数k1,k2,...,kn

- 城堡房间的灯数。位置数量Ĵj是灯的数量Ĵ第j个房间。房间号码根据Lpl的清单给出。

第三行包含一个整数 q(1<=q<=100000)-的查询的数量。

第四行包含q整数d1,d2,...,dq

- 形成查询的月数。

月份以编号开头1;在第一个月初,Lpl购买了第一批m个节能灯。

产量

打印q行。

线p包含两个整数 - 房间数量,其中所有旧灯泡已经更换,剩下的节能灯数量到最后dp月。

暗示

样本说明:

在第一个月,他买了4个节能灯他取代了他列表中的第一个房间并将其移除。然后他有1个节能灯,然后跳过所有房间。所以,第一个月的答案是1,1 ------ 1个房间的灯已经更换,11个节能灯仍然存在。

样例输入复制

  1. 5 4
  1. 3 10 5 2 7
  1. 10
  1. 5 1 4 8 7 2 3 6 4 7

样例输出复制

  1. 4 0
  1. 1 1
  1. 3 6
  1. 5 1
  1. 5 1
  1. 2 0
  1. 3 2
  1. 4 4
  1. 3 6
  1. 5 1

 解题思路:从左到右每次查找小于等于剩余灯泡数目的房间,然后把该房间的灯泡数目改成无穷大,即表示成不可更换灯泡了

实现的话,当然是用线段树了,感觉好像就差不多就一个操作,就是查询操作,不过每次查询到结果就把该房间的灯泡数更新成无穷大,这样可以节省点时间复杂度,就OK啦。

需要注意的是,在同一天,可能会更换多个房间的灯泡,这时候就需要用个while语句来处理了。还有一点就是当全部房间都被更换完毕后,就不会每天有灯泡了,也就是说答案就不变了,这点也是需要注意的。

开始模板都敲错了,竟然找错误找了老半天,太菜了。。。

附上代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define maxn 100005
  5. #define inf 0x3f3f3f3f
  6. #define lson l,mid,root<<1
  7. #define rson mid+1,r,root<<1|1
  8. #define pushup() tree[root]=min(tree[root<<1],tree[root<<1|1])
  9. int tree[maxn<<];
  10. int n,m,q,day[maxn],cnt;
  11. struct node{
  12. int room; //房间数
  13. int num; //剩余的灯泡数
  14. }ans[maxn];
  15.  
  16. void build(int l,int r,int root)
  17. {
  18. if(l==r)
  19. {
  20. scanf("%d",&tree[root]);
  21. return;
  22. }
  23. int mid=(l+r)>>;
  24. build(lson);
  25. build(rson);
  26. pushup();
  27. }
  28. /*
  29. void update(int pos,int val,int l,int r,int root)
  30. {
  31. if(l==r)
  32. {
  33. tree[root]=val;
  34. return;
  35. }
  36. int mid=l+r>>1;
  37. if(pos<=mid)
  38. update(pos,val,lson);
  39. else
  40. update(pos,val,rson);
  41. pushup();
  42. }
  43. */
  44. int query(int val,int l,int r,int root)
  45. {
  46. if(l==r)
  47. {
  48. int z=tree[root];
  49. tree[root]=inf;
  50. return z;
  51. }
  52. int mid=l+r>>;
  53. int x=;
  54. if(val>=tree[root]) //判断是否有小于等于灯泡数的房间
  55. {
  56. if(tree[root<<]<=val) //是否可以去靠左边的房间
  57. x=query(val,lson);
  58. else //左边去不了就去右边的
  59. x=query(val,rson);
  60. }
  61. pushup();
  62. return x;
  63. }
  64.  
  65. int main()
  66. {
  67. scanf("%d%d",&n,&m);
  68. build(,n,);
  69. scanf("%d",&q);
  70. cnt=;
  71. for(int i=;i<=q;i++)
  72. {
  73. scanf("%d",&day[i]);
  74. if(ans[i-].room!=n) //当所有的房间的灯泡都被换了后,就不用加了
  75. cnt+=m;
  76. ans[i].room=ans[i-].room;
  77. int k=query(cnt,,n,);
  78. while(k!=)
  79. {
  80. cnt-=k;
  81. ans[i].room++;
  82. k=query(cnt,,n,);
  83. }
  84. ans[i].num=cnt;
  85. }
  86. for(int i=;i<=q;i++)
  87. printf("%d %d\n",ans[day[i]].room,ans[day[i]].num);
  88. return ;
  89. }

ACM-ICPC 2018 南京赛区网络预赛 G Lpl and Energy-saving Lamps(线段树)的更多相关文章

  1. ACM-ICPC 2018 南京赛区网络预赛 G Lpl and Energy-saving Lamps(模拟+线段树)

    https://nanti.jisuanke.com/t/30996 题意 每天增加m个灯泡,n个房间,能一次性换就换,模拟换灯泡过程.询问第几天的状态 分析 离线做,按题意模拟.比赛时线段树写挫了. ...

  2. ACM-ICPC 2018 南京赛区网络预赛 G. Lpl and Energy-saving Lamps(二分+线段树区间最小)

    During tea-drinking, princess, amongst other things, asked why has such a good-natured and cute Drag ...

  3. ACM-ICPC 2018 南京赛区网络预赛 G. Lpl and Energy-saving Lamps (弱线段树)

    线段树节点维护区间最小值,查找时优先从左侧的区间寻找. 每一次循环都在树中不停寻找第一个小于等于当前持有数的值,然后抹去,直到找不到为止. #include<cstdio> #includ ...

  4. ACM-ICPC 2018 徐州赛区网络预赛 G Trace(逆向,两颗线段树写法)

    https://nanti.jisuanke.com/t/31459 思路 凡是后面的轨迹对前面的轨迹有影响的,可以尝试从后往前扫 区间修改需要push_down,单点更新所以不需要push_up(用 ...

  5. 计蒜客 30996.Lpl and Energy-saving Lamps-线段树(区间满足条件最靠左的值) (ACM-ICPC 2018 南京赛区网络预赛 G)

    G. Lpl and Energy-saving Lamps 42.07% 1000ms 65536K   During tea-drinking, princess, amongst other t ...

  6. ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心)

    ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心) Trace 问答问题反馈 只看题面 35.78% 1000ms 262144K There's a beach in t ...

  7. ACM-ICPC 2018 南京赛区网络预赛(12/12)

    ACM-ICPC 2018 南京赛区网络预赛 A. An Olympian Math Problem 计算\(\sum_{i=1}^{n-1}i\cdot i!(MOD\ n)\) \(\sum_{i ...

  8. ACM-ICPC 2018 南京赛区网络预赛 J.sum

    A square-free integer is an integer which is indivisible by any square number except 11. For example ...

  9. ACM-ICPC 2018 南京赛区网络预赛 E题

    ACM-ICPC 2018 南京赛区网络预赛 E题 题目链接: https://nanti.jisuanke.com/t/30994 Dlsj is competing in a contest wi ...

随机推荐

  1. vue传参

    <template> <ul> <li v-for="item in list" :key="item.id"> <b ...

  2. 极验3.0滑动拼图验证的使用--java

    [ 前言: 在登录其他网站的时候,看到有个滑动拼图的验证觉得挺好玩的,以前做一个图片验证的小demo,现在发现很多网站都开始流行滑动拼图的验证了,今天也想自己动手来弄一个. 废话不多说,开始撸起来! ...

  3. Day 5-4封装.__隐藏属性或者方法

    封装 property 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 在python中用双下划线开头的方式将属性隐藏起来(设置成 ...

  4. C# Note24: 指针的使用

    C#为了类型安全,默认并不支持指针.但是也并不是说C#不支持指针,我们可以使用unsafe关键词,开启不安全代码(unsafe code)开发模式.在不安全模式下,我们可以直接操作内存,这样就可以使用 ...

  5. MySQL简介及安装

    一.DBA工作内容及课程体系 二.MySQL课程体系介绍 三.DBA的职业素养 四.MySQL简介及安装 01 什么是数据? 02 什么是数据库管理系统 03 数据库管理系统种类 04 MySQL发展 ...

  6. spring boot中常用的配置文件的重写

    @Configuration public class viewConfigSolver extends WebMvcConfigurerAdapter { /* spring boot 已经自动配置 ...

  7. Lodop打印设计矩形重合预览线条变粗

    LODOP中的打印设计是辅助进行开发的,实际打印效果应以预览为准,很多效果都是在设计界面显示不出来,或设计和预览界面有差异.例如add_print_text文本的字间距.行间距,旋转,还有允许标点溢出 ...

  8. Vue生产环境部署

    前面的话 开发时,Vue 会提供很多警告来帮助解决常见的错误与陷阱.生产时,这些警告语句却没有用,反而会增加载荷量.再次,有些警告检查有小的运行时开销,生产环境模式下是可以避免的.本文将详细介绍Vue ...

  9. centOS7 下配置和启动maria数据库

    从最新版本的linux系统开始,默认的是 Mariadb而不是mysql! 使用系统自带的repos安装很简单: yum install mariadb mariadb-server systemct ...

  10. 字符串哈希及KMP

    字符串很神奇,因为它在计算机中应用很广泛,就每一个程序都需要用到字符串,所以学好字符串是非常重要的. 接下来就介绍两个字符串的基本操作 1:字符串hash  一种可以查找几个字符串有几个不同的字符串. ...