题目描述

本题中,我们将用符号⌊c⌋表示对c向下取整,例如:⌊3.0⌋=⌊3.1⌋=⌊3.9⌋=3。

蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓。

蛐蛐国里现在共有n只蚯蚓(n为正整数)。每只蚯蚓拥有长度,我们设第i只蚯蚓的长度为a_i(i=1,2,...,n)ai​(i=1,2,...,n),并保证所有的长度都是非负整数(即:可能存在长度为0的蚯蚓)。

每一秒,神刀手会在所有的蚯蚓中,准确地找到最长的那一只(如有多个则任选一个)将其切成两半。神刀手切开蚯蚓的位置由常数p(是满足0<p<1的有理数)决定,设这只蚯蚓长度为x,神刀手会将其切成两只长度分别为⌊px⌋和x−⌊px⌋的蚯蚓。特殊地,如果这两个数的其中一个等于0,则这个长度为0的蚯蚓也会被保留。此外,除了刚刚产生的两只新蚯蚓,其余蚯蚓的长度都会增加q(是一个非负整常数)。

蛐蛐国王知道这样不是长久之计,因为蚯蚓不仅会越来越多,还会越来越长。蛐蛐国王决定求助于一位有着洪荒之力的神秘人物,但是救兵还需要m秒才能到来......

(m为非负整数)

蛐蛐国王希望知道这m秒内的战况。具体来说,他希望知道:

•m秒内,每一秒被切断的蚯蚓被切断前的长度(有m个数)

•m秒后,所有蚯蚓的长度(有n+m个数)。

蛐蛐国王当然知道怎么做啦!但是他想考考你......

输入输出格式

输入格式:

第一行包含六个整数n,m,q,u,v,t,其中:n,m,q的意义见【问题描述】;u,v,t均为正整数;你需要自己计算p=u/v(保证0<u<v)t是输出参数,其含义将会在【输出格式】中解释。

第二行包含n个非负整数,为a_i,a_2,...,a_nai​,a2​,...,an​,即初始时n只蚯蚓的长度。

同一行中相邻的两个数之间,恰好用一个空格隔开。

保证1≤n≤10^5,0<m≤7∗10^6,0≤u<v≤10^9,0≤q≤200,1≤t≤71,0<ai≤10^8。

输出格式:

第一行输出⌊m/t⌋个整数,按时间顺序,依次输出第t秒,第2t秒,第3t秒……被切断蚯蚓(在被切断前)的长度。

第二行输出⌊(n+m)/t⌋个整数,输出m秒后蚯蚓的长度;需要按从大到小的顺序,依次输出排名第t,第2t,第3t……的长度。

同一行中相邻的两个数之间,恰好用一个空格隔开。即使某一行没有任何数需要 输出,你也应输出一个空行。

请阅读样例来更好地理解这个格式。

算法分析

首先想到是优先队列,显然超时了。所以必须使用O(n)的算法,也就意味着要实现一个不需要更新放进去就是有序的队列算法。

所以想到构建3个队列,一个放原本的有序数列,其余两个分别放被切开的较大部分和较小部分。

为什么是有序的呢,第一个显而易见,后两个只要证明a[i]*p+q>(a[i+1]+q)*p,已知a[i]>a[i+1],0<p<1,q>0,所以q>p*q,易得原式。

所以就可以直接实现了。但是我为什么打了这么丑的一个代码呢(。。)

代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,d,u,v,t,tail1=0,tail2=0;
 4 long long q[3][7000010],tim[3][7000010],a[100010];
 5
 6 bool cmp(const long long& a,const long long& b){
 7     return a>b;
 8 }
 9
10 int main(){
11     scanf("%d%d%d%d%d%d",&n,&m,&d,&u,&v,&t);
12     for (int i=1; i<=n; i++)
13         scanf("%lld",&a[i]);
14     sort(a+1,a+n+1,cmp);
15     for (int i=1; i<=n; i++){
16         q[0][i]=a[i];
17         tim[0][i]=1;
18     }
19     long long len;
20     int i=1,j=1,k=1;
21     for (int T=1; T<=m; T++){
22         long long l0=q[0][i]+d*(T-tim[0][i]),l1=q[1][j]+d*(T-tim[1][j]),l2=q[2][k]+d*(T-tim[2][k]);
23         if (i>n) l0=-1; if (j>tail1) l1=-1; if (k>tail2) l2=-1;
24         if (l0>=l1&&l0>=l2){
25             len=l0; i++;
26         }
27             else if (l1>=l0&&l1>=l2){
28                 len=l1; j++;
29             }
30                 else{
31                     len=l2; k++;
32                 }
33         if (T%t==0) printf("%lld ",len);
34         q[1][++tail1]=(int)(len*(double)u/(double)v);
35         tim[1][tail1]=T+1;
36         q[2][++tail2]=len-q[1][tail1];
37         tim[2][tail2]=T+1;
38     }
39     printf("\n");
40     for (int T=1; T<=n+m; T++){
41         long long l0=q[0][i]+d*(m-tim[0][i]+1),l1=q[1][j]+d*(m-tim[1][j]+1),l2=q[2][k]+d*(m-tim[2][k]+1);
42         if (i>n) l0=-1; if (j>tail1) l1=-1; if (k>tail2) l2=-1;
43         if (l0>=l1&&l0>=l2) len=l0,i++;
44             else if (l1>=l0&&l1>=l2) len=l1,j++;
45                 else len=l2,k++;
46         if (T%t==0) printf("%lld ",len);
47     }
48     printf("\n");
49     return 0;
50 } 

转载于:https://www.cnblogs.com/Patrick-X/p/7766022.html

NOIP2016D2T2 蚯蚓相关推荐

  1. NOIP2016-D2-T2 蚯蚓(单调队列)

    构建三个单调队列(用STL),分别储存未切的蚯蚓,切后的第一段,切后的第二段,即可简单证明其单调性. 证明: 设$q$为单调队列 $\because a_1 \geqslant a_2 \geqsla ...

  2. 杂题 NOIP2016蚯蚓

    本题中,我们将用符号 c⌊c⌋ 表示对 cc 向下取整,例如: 3.03.13.93⌊3.0⌋=⌊3.1⌋=⌊3.9⌋=3 . 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请 ...

  3. BZOJ4943 [NOI2017] 蚯蚓

    题目描述 蚯蚓幼儿园有nn 只蚯蚓.幼儿园园长神刀手为了管理方便,时常让这些蚯蚓们列队表演. 所有蚯蚓用从11 到nn 的连续正整数编号.每只蚯蚓的长度可以用一个正整数表示,根据入园要求,所有蚯蚓的长 ...

  4. 【NOIP2016】蚯蚓 --队列模拟

    [NOIP2016]蚯蚓 话说去年这个题 我用priority_queue乱搞 结果惨不忍睹 q=0时送了50分 结果~~~~(>_<)~~~~ 每次弹出最长的蚯蚓 把它切开 在放回队列 ...

  5. Luogu 2827 [NOIP2016] 蚯蚓

    原来真的是按题意模拟啊,还以为有高能的算法可以直接算每个$t$的值. 考虑到先切的蚯蚓一定比后切的蚯蚓长,于是可以弄三个队列分别存放原来的序列和两个切开后的序列,每次取出三个队头的最大值进行扩展. 考 ...

  6. BZOJ4943 洛谷3823 UOJ315:[NOI2017]蚯蚓排队——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4943 http://uoj.ac/problem/315 https://www.luogu.or ...

  7. [codevs 1033] 蚯蚓的游戏问题

    [codevs 1033] 蚯蚓的游戏问题 题解: 首先每个点只能走一次,所以要靠拆点 (X -> Xi, Xj) 来限制每个点走的次数,容量为1,费用为食物量的相反数. 从源点向所有第一层的点 ...

  8. LUOGU P2827 蚯蚓 (noip 2016)

    传送门 解题思路 第一眼以为是一个二叉堆,直接上优先队列60分...后来听ztz11说有单调性,新加入的蚯蚓一定比原先在的蚯蚓长度长,开三个队列,分别放原先的长度,切掉后大的那一半,切掉后小的那一半. ...

  9. NOIP 2016【蚯蚓】

    好吧,我承认我是个智障-- 这道题一眼看上去就是个堆,然而实际上有单调性. 注意到,如果 \(q = 0\) 的话,将蚯蚓的左右两边分开丢进两个队列中,则两个队列都是单调不增的,因为每次取出的蚯蚓长度 ...

  10. noip2016 蚯蚓

    题目描述 本题中,我们将用符号表示对c向下取整,例如:. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现在共有n只蚯蚓(n为正整数).每只 ...

最新文章

  1. JavaSE(二十六)——多线程之模拟龟兔赛跑
  2. jeesite3环境部署时初始化数据库注意问题
  3. SAP CRM Contact和Account的从属关系
  4. 【js】获得项目路径
  5. iBatis入门和开发环境搭建
  6. HomeBrew太慢,如何替换默认HomeBrew源,使用阿里云的源
  7. PHP curl get post 请求的封装
  8. URLClassLoader使用方法及事例程序
  9. 卫星通信常用专业词汇
  10. python之lxml.etree解析HTML
  11. 多语言国家与缩写映射表
  12. SSM框架整合(以黑马程序员2022最新SSM框架教程P59为例)
  13. word安全模式解除方法!
  14. Linux操作命令分类详解 - 用户权限(三)
  15. vue学习第五天(9月8号)
  16. 02 LED的闪烁、模拟交通灯
  17. html 文字输出语音,网页上通过JS实现文本的语音朗读
  18. 华侨城集团欲借华侨城A 实现主业整合上市
  19. lesson14 Do you speak english? 你会说英语吗?-ask for VS ask sb to do -过去完成时-neither of, both, either of
  20. canvas宽高设置

热门文章

  1. 探秘联想台北研发中心 扒一扒system x是如何炼成的?
  2. pdflush进程详解
  3. Python 一个无限 重复生成器的实现 和一个简洁的 quicksort
  4. Bash脚本15分钟进阶教程-转
  5. Struts中s:checkboxlist的用法
  6. 妙用TurboMail企业通讯平台,重要邮件不再躲猫猫
  7. 为你的软件选择正确的许可证方案
  8. 女友的一个建议,让26岁程序员做了个价值 10 亿美元的 App
  9. 如何合理地决定线程池大小?
  10. 大前端架构思考与选择