每日一题 day32 打卡

Analysis

我们可以想一下,对于每一秒除了被切的哪一个所有的蚯蚓都增长Q米,我们来维护3个队列,队列1表示最开始的蚯蚓,队列2表示每一次被切的蚯蚓被分开的较长的那一部分,队列3表示每一次被切的蚯蚓被分开的较短的那一部分。

我们先把原序列排序,因为不管怎么切,先被切的蚯蚓分成的两部分一定比后切的蚯蚓分成的两部分大(较大的部分和较大的部分比较,较小的部分和较小的部分比较),所以我们可以省去每一秒增加每只蚯蚓的长度这个操作,转换成在查询砍那只蚯蚓时,把增加的长度算到蚯蚓的总长度上。

寻找每次砍哪一只蚯蚓就是在队列1、队列2、队列3的队头找一个算上增加的长度最大的蚯蚓,之后把他出队,切开的两部分分别进入队2、队3。

对于增量的计算我们可以按照蚯蚓在队列中的标号,因为队列1中的蚯蚓直到被切是一直处于一种增长状态,所以直接加上(当前时间-1) \* Q就可以了,而对于队列2和队列3的蚯蚓,他的增长是从被切掉那一刻的下一秒开始的,所以他的增长量则是(当前时间-1-被切割的时间)\*Q

统计答案的时候把三个队列合并,排序输出就可以了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<queue>
  7. #define maxm 7000000+10
  8. #define R register
  9. using namespace std;
  10. inline int read()
  11. {
  12. int x=;
  13. bool f=;
  14. char c=getchar();
  15. for(; !isdigit(c); c=getchar()) if(c=='-') f=;
  16. for(; isdigit(c); c=getchar()) x=(x<<)+(x<<)+c-'';
  17. if(f) return x;
  18. return -x;
  19. }
  20. inline void write(int x)
  21. {
  22. if(x<){putchar('-');x=-x;}
  23. if(x>)write(x/);
  24. putchar(x%+'');
  25. }
  26. int n,m,q,u,v,t,sum;
  27. double p;
  28. int fir[maxm],sec[maxm],thi[maxm];
  29. int head1,head2,head3,tail1,tail2,tail3;
  30. priority_queue<int> que;
  31. inline bool cmp(int x,int y){return x>y;}
  32. inline int min_three(int x,int y,int z){return min(x,min(y,z));}
  33. inline int max_three(int x,int y,int z){return max(x,max(y,z));}
  34. int main()
  35. {
  36. n=read();m=read();q=read();u=read();v=read();t=read();
  37. for(R int i=;i<=n;i++) fir[i]=read();
  38. p=(double)u/v;
  39. sort(fir+,fir+n+,cmp);
  40. tail1=n;
  41. head1=head2=head3=;
  42. for(R int i=;i<=m;i++)
  43. {
  44. int top=;
  45. if(head1>tail1)
  46. {
  47. if(sec[head2]>=thi[head3]) top=sec[head2],head2++;
  48. else if(sec[head2]<thi[head3]) top=thi[head3],head3++;
  49. }
  50. else if(fir[head1]>=sec[head2]&&fir[head1]>=thi[head3]) top=fir[head1],head1++;
  51. else if(sec[head2]>=fir[head1]&&sec[head2]>=thi[head3]) top=sec[head2],head2++;
  52. else if(thi[head3]>=fir[head1]&&thi[head3]>=sec[head2]) top=thi[head3],head3++;
  53. top+=sum;
  54. int a=floor(p*(double)top);
  55. int b=top-a;
  56. a-=q;b-=q;
  57. a-=sum;b-=sum;
  58. sec[++tail2]=a;
  59. thi[++tail3]=b;
  60. if(i%t==)
  61. {
  62. write(top);
  63. putchar(' ');
  64. }
  65. sum+=q;
  66. }
  67. putchar('\n');
  68. for(R int i=min_three(head1,head2,head3);i<=max_three(tail1,tail2,tail3);i++)
  69. {
  70. if(i>=head1&&i<=tail1) que.push(fir[i]);
  71. if(i>=head2&&i<=tail2) que.push(sec[i]);
  72. if(i>=head3&&i<=tail3) que.push(thi[i]);
  73. }
  74. int vol=que.size();
  75. for(R int i=;i<=vol;i++)
  76. {
  77. if(i%t==)
  78. {
  79. write(que.top()+sum);
  80. putchar(' ');
  81. }
  82. que.pop();
  83. }
  84. return ;
  85. }

请各位大佬斧正(反正我不认识斧正是什么意思)

洛谷 P2827 蚯蚓 题解的更多相关文章

  1. 洛谷P2827 蚯蚓 题解

    洛谷P2827 蚯蚓 题解 题目描述 本题中,我们将用符号 ⌊c⌋ 表示对 c 向下取整. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现 ...

  2. NOIP 2016 洛谷 P2827 蚯蚓 题解

    题目传送门 展开 题目描述 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手 ...

  3. 洛谷p2827蚯蚓题解

    题目 算法标签里的算法什么的都不会啊 什么二叉堆?? qbxt出去学习的时候讲的,一段时间之前做的,现在才写到博客上的 维护3个队列,队列1表示最开始的蚯蚓,队列2表示每一次被切的蚯蚓被分开的较长的那 ...

  4. 洛谷 P2827 蚯蚓 解题报告

    P2827 蚯蚓 题目描述 本题中,我们将用符号 \(\lfloor c \rfloor\) 表示对 \(c\) 向下取整,例如:\(\lfloor 3.0 \rfloor = \lfloor 3.1 ...

  5. 洛谷——P2827 蚯蚓

    P2827 蚯蚓 题目描述 本题中,我们将用符号 \lfloor c \rfloor⌊c⌋ 表示对 cc 向下取整,例如:\lfloor 3.0 \rfloor = \lfloor 3.1 \rflo ...

  6. 洛谷P2827 蚯蚓——思路题

    题目:https://www.luogu.org/problemnew/show/P2827 思路... 用优先队列模拟做的话,时间主要消耗在每次的排序上: 能不能不要每次排序呢? 关注先后被砍的两条 ...

  7. 洛谷 P2827 蚯蚓

    题目描述 本题中,我们将用符号\lfloor c \rfloor⌊c⌋表示对c向下取整,例如:\lfloor 3.0 \rfloor= \lfloor 3.1 \rfloor=\lfloor 3.9 ...

  8. 洛谷P2827 蚯蚓(单调队列)

    题意 初始时有$n$个蚯蚓,每个长度为$a[i]$ 有$m$个时间,每个时间点找出长度最大的蚯蚓,把它切成两段,分别为$a[i] * p$和$a[i] - a[i] * p$,除这两段外其他的长度都加 ...

  9. 洛谷P2827蚯蚓

    题目 堆+模拟,还有一个小优化(优化后跟堆关系不大,而是类似于贪心). 如果不加优化的话,卡常可以卡到85. 思路是对于对每一秒进行模拟,用堆来维护动态的最大值,然后对于每个长度都加q的情况可以用一个 ...

随机推荐

  1. Codeforces VP/补题小记 (持续填坑)

    Codeforces VP/补题小记 1149 C. Tree Generator 给你一棵树的括号序列,每次交换两个括号,维护每次交换之后的直径. ​ 考虑括号序列维护树的路径信息和,是将左括号看做 ...

  2. vscode插件之背景插件(background)

    1.在插件tab搜索background 2.打开vscode的配置页 { "background.useDefault": false, "background.cus ...

  3. c# 操作xml文件(读写)

    根据项目需求,我们需要记录用户的操作痕迹,当用户下次登录操作同一个文件时,页面显示为用户上一次执行的用户轨迹,我们考虑把用户的历史记录写进xml文件中. 存储的xml数据结构: XML操作类: usi ...

  4. Java调用WebService方法总结(2)--JAX-WS调用WebService

    用JAX-WS(Java API for XML Web Services)调用WebService不需要引入其他框架,都是JDK自带的:文中所使用到的软件版本:Java 1.8.0_191.Dom4 ...

  5. 11.15java实习生面试总结

    坐了两个小时的车,到了面试地点面了十五分钟左右就结束了,心里有一点难受,不过这也是刚开始,后面的路还长着呢,所以先把面试官问的题目记录下来. 1.C语言能否跨平台? 虽然我面的是java实习生,但是因 ...

  6. 【转载】C#中List集合SingleOrDefault和FirstOrDefault方法有何不同

    在C#的List集合类的操作过程中,有时候我们会使用到List集合的SingleOrDefault方法和FirstOrDefault等方法,这2个方法都是System.Linq.Enumerable类 ...

  7. MySQL数据库使用时注意事项

    MySQL数据库使用时注意事项 建表的角度上 1.合理安排表关系 2.尽量把固定长度的字段放在前面 3.尽量使用char 代替varchar 4.分表:水平分和垂直分 在使用sql语句的时候 1.尽量 ...

  8. JavaScript箭头函数中的this详解

    前言 箭头函数极大地简化了this的取值规则. 普通函数与箭头函数 普通函数指的是用function定义的函数: var hello = function () { console.log(" ...

  9. Python——模块合集

    标准库模块 ● Python——OS(系统操作模块) ● Python——MD5(加密模块) ● Python——time(时间模块) ● Python——re(正则表达式) ● Python——sy ...

  10. ubuntu下关于profile和bashrc中环境变量的理解(转)

    ubuntu下关于profile和bashrc中环境变量的理解(转)   (0) 写在前面 有些名词可能需要解释一下.(也可以先不看这一节,在后面看到有疑惑再上来看相关解释) $PS1和交互式运行(r ...