前言

早年一直拿堆过不了,结果发现要用队列


正题

题目链接:https://www.luogu.com.cn/problem/P2827


题目大意

有nnn条蚯蚓,每次选取最长的一条,切成⌊x∗p⌋\lfloor x*p\rfloor⌊x∗p⌋和x−⌊x∗p⌋x-\lfloor x*p\rfloorx−⌊x∗p⌋的两段,然后其余蚯蚓变长qqq。

求每次切开蚯蚓的长度和最后所以蚯蚓的长度。


解题思路

先不考虑变长

和合并果子的思路很像,我们发现如果从大到小切切出来的也是从大到小的,所以我们开三个队列,第一个队列装初始的蚯蚓,然后切出来的左边装到第二个队列,右边装到第三个队列,这样每个队列的长度也是单调的,之后每次取出三个队头里最长的来剪掉就好了。

考虑变长,初始的蚯蚓第iii次长度为x+i∗qx+i*qx+i∗q,那么我们直接当做所有长度都是x+i∗qx+i*qx+i∗q的蚯蚓,然后将第iii次加入的蚯蚓长度变为x−i∗qx-i*qx−i∗q即可。

时间复杂度O(n+m)O(n+m)O(n+m)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=7e6+10;
ll n,m,q,u,v,t,a[N],q1[N*2],q2[N*2],q3[N*2];
int main()
{scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&q,&u,&v,&t);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);sort(a+1,a+1+n);memset(q1,-127,sizeof(q1));memset(q2,-127,sizeof(q2));memset(q3,-127,sizeof(q3));ll h1,h2,h3,t1,t2,t3;h1=h2=h3=1;t1=t2=t3=0;for(ll i=n;i>=1;i--)q1[++t1]=a[i];for(ll i=1;i<=m;i++){ll l,r,x;if(q1[h1]>=q2[h2]&&q1[h1]>=q3[h3])x=q1[h1++];else if(q2[h2]>=q1[h1]&&q2[h2]>=q3[h3])x=q2[h2++];else x=q3[h3++];x+=(i-1)*q;l=x*u/v;r=x-l;q2[++t2]=l-q*i;q3[++t3]=r-q*i;if(i%t==0) printf("%lld ",x);}printf("\n");for(ll i=1;i<=m+n;i++){ll x;if(q1[h1]>=q2[h2]&&q1[h1]>=q3[h3])x=q1[h1++];else if(q2[h2]>=q1[h1]&&q2[h2]>=q3[h3])x=q2[h2++];else x=q3[h3++];if(i%t==0)printf("%lld ",x+m*q);}
}

附上远古时期堆的代码

90ptscode90pts\ code90pts code

#include<cstdio>
#include<algorithm>
#define N 100010
#define M 7000010
using namespace std;
int n,a[N+M],num,m,q,t,addl,u,v;
double p;
void up(int x)
{while(x>1&&a[x>>1]<a[x]){swap(a[x],a[x>>1]);x>>=1;}
}
void down(int x)
{int y;while((x<<1)<=num&&a[x<<1]>a[x]||((x<<1)|1)<=num&&a[(x<<1)|1]>a[x]){y=x<<1;if(a[y]<a[y|1]&&((x<<1)|1)<=num) y|=1;swap(a[x],a[y]);x=y;}
}
int main()
{scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);p=(double)u/v;for(int i=1;i<=n;i++){scanf("%d",&a[i]);num++;up(num);}int k=1;for (int i=1;i<=m;i++){int k1,k2;a[1]=a[1]+addl;k1=(double)a[1]*p;k2=a[1]-k1;if(k==t){printf("%d ",a[1]);k=0;}a[1]=k1-addl-q;down(1);a[++num]=k2-addl-q;k++;up(num);addl+=q;}k=1;printf("\n");while(num){if(k==t) printf("%d ",a[1]+addl),k=0;swap(a[1],a[num]);num--;k++;down(1);}
}

P2827-蚯蚓【队列】相关推荐

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

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

  2. LUOGU P2827 蚯蚓 (noip 2016)

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

  3. Luogu P2827 蚯蚓

    看到题目就可以想到直接开的堆模拟的过程了吧,这个还是很naive的 注意在用堆做的时候也是要明智一点的,对于蚯蚓长度的相加肯定不能直接遍历并加上,还是可以差分一下的 其实说白了就是把集体加->单 ...

  4. Noip2016day2

    P2822 组合数问题 题目描述 组合数 C_n^mCnm​ 表示的是从 nn 个物品中选出 mm 个物品的方案数.举个例子,从 (1,2,3)(1,2,3) 三个物品中选择两个物品可以有 (1,2) ...

  5. NOIP前的刷题记录

    因为这几天要加油,懒得每篇都来写题解了,就这里记录一下加上一句话题解好了 P4071 [SDOI2016]排列计数   组合数+错排 loj 6217 扑克牌 暴力背包 P2511 [HAOI2008 ...

  6. 近期刷题总结 [19 03 17]

    目录 P3703 [SDOI2017]树点涂色 [LCT + 线段树] CF739B Alyona and a tree [主席树] P4098 [HEOI2013]ALO [双向链表 + 可持久化0 ...

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

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

  8. 0x12.基本数据结构 — 队列与单调队列

    目录 一.队列 0.UVA540 团体队列 Team Queue 1.AcWing 133. 蚯蚓(模拟优先队列) 二 .单调队列 0.AcWing 135. 最大子序和(单调队列) 1.luogu ...

  9. 杂题 NOIP2016蚯蚓

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

最新文章

  1. centos 5.4 x64 安装nagios 3.2.3
  2. LongAdder分段锁机制
  3. 电脑运行adb闪退_adb+python进阶使用
  4. resopnse处理HTTP文件头
  5. 远程登录阿里云上的MySQL
  6. 告别后端!阿里云小程序 Serverless 教你如何 30 分钟开发小程序!
  7. 关于WEB ServiceWCFWebApi实现身份验证之WEB Service篇
  8. 张孝祥JavaScript视频教程flash版
  9. 跨平台开发实践之Flutter
  10. 开发版速达扩展功能-提供便捷的界面布局功能
  11. MediaRecorder录制音频文件
  12. 边缘计算在物联网领域的发展前景
  13. 「99诱拐」 读后感
  14. 学习编程时真正值得一读的一篇文章 与 书籍
  15. 超好看的导航页面(静态页面)
  16. 通过朋友网信息查找QQ号~
  17. 唉!一 28 岁程序员因新冠离世。。。
  18. Interger和Int的区别
  19. 罗技方向盘SDK开发笔记
  20. oracle使用sysdba连接报错 ORA-01031: insufficient privileges

热门文章

  1. 如何发送html email,如何发送HTML电子邮件?
  2. js堆和栈的区别_几个例子理解不同数据类型的堆栈内存处理
  3. 计算机数控是什么专业,数控是什么专业
  4. c语言求平衡因子,平衡二叉树(AVL树)的基本操作
  5. phpstormp新建PHP保存在哪里_记一次windows配置PHP环境
  6. java父类转子类_java中什么是继承,和继承的接口的关系?
  7. dbscan用 java代码_聚类算法之DBScan(Java实现)[转]
  8. leetcode222. 完全二叉树的节点个数(两种做法)
  9. 7-7 有重复元素的全排列 (10 分)(set容器做法思路加详解)
  10. 高等数学下-赵立军-北京大学出版社-题解-练习9.1