题目大意:
  给你n个不同长度蚯蚓,每秒从里面取出最长的砍下u/v变成两只,又把剩下的加长q。
  问你在m之前的t,2t,3t...的时间上,砍的蚯蚓长度,
  以及m秒后剩下所有的蚯蚓长度。

思路:
  很容易想到用一个堆来解决,然而这样时间复杂度是O((m+n)log(m+n))的,过不去。
  所以复杂度得是线性的。
  考虑把原来的堆改成三个单调队列。
  每个蚯蚓切成两半总会有一个长的、一个短的。
  我们有q1维护原来的蚯蚓,q2维护砍下来长的一截蚯蚓,q3维护砍下来短的一截蚯蚓。
  不考虑蚯蚓的生长,我们只需要每次砍完蚯蚓扔进去就可以了。
  算长度只要把每个单位时间内增加的长度乘以时间加到蚯蚓上面就可以了。
  注意中间结果开long long,不然只有70分。

 #include<queue>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<functional>
typedef long long int64;
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=;
int a[N];
std::queue<int> q1,q2,q3;
inline int getmax() {
if(q1.empty()&&q2.empty()) {
const int ret=q3.front();
q3.pop();
return ret;
}
if(q1.empty()&&q3.empty()) {
const int ret=q2.front();
q2.pop();
return ret;
}
if(q2.empty()&&q3.empty()) {
const int ret=q1.front();
q1.pop();
return ret;
}
if(q1.empty()) {
if(q2.front()>q3.front()) {
const int ret=q2.front();
q2.pop();
return ret;
}
const int ret=q3.front();
q3.pop();
return ret;
}
if(q2.empty()) {
if(q1.front()>q3.front()) {
const int ret=q1.front();
q1.pop();
return ret;
}
const int ret=q3.front();
q3.pop();
return ret;
}
if(q3.empty()) {
if(q1.front()>q2.front()) {
const int ret=q1.front();
q1.pop();
return ret;
}
const int ret=q2.front();
q2.pop();
return ret;
}
if(q1.front()>=q2.front()&&q1.front()>=q3.front()) {
const int ret=q1.front();
q1.pop();
return ret;
}
if(q2.front()>=q1.front()&&q2.front()>=q3.front()) {
const int ret=q2.front();
q2.pop();
return ret;
}
if(q3.front()>=q1.front()&&q3.front()>=q2.front()) {
const int ret=q3.front();
q3.pop();
return ret;
}
return ;
}
int main() {
int n=getint(),m=getint(),q=getint(),u=getint(),v=getint(),t=getint();
for(register int i=;i<n;i++) {
a[i]=getint();
}
std::sort(&a[],&a[n],std::greater<int>());
for(register int i=;i<n;i++) {
q1.push(a[i]);
}
for(register int i=;i<=m;i++) {
const int max=getmax()+q*(i-);
if(!(i%t)) printf("%d ",max);
q2.push(std::max((int64)max*u/v-q*i,(int64)max-(int64)max*u/v-(int64)q*i));
q3.push(std::min((int64)max*u/v-q*i,(int64)max-(int64)max*u/v-(int64)q*i));
}
putchar('\n');
for(register int i=;!q1.empty()||!q2.empty()||!q3.empty();i++) {
const int max=getmax();
if(!(i%t)) printf("%d ",max+q*m);
}
return ;
}

[NOIp2016提高组]蚯蚓的更多相关文章

  1. Noip2016 提高组 蚯蚓

    刚看到这道题:这题直接用堆+模拟不就可以了(并没有认真算时间复杂度) 于是用priority_queue水到了85分-- (STL大法好) 天真的我还以为是常数问题,于是疯狂卡常--(我是ZZ) 直到 ...

  2. Luogu P2827 [NOIp2016提高组]蚯蚓 | 神奇的队列

    题目链接 80分思路: 弄一个优先队列,不停地模拟,切蚯蚓时就将最长的那一条出队,然后一分为二入队,简单模拟即可.还要弄一个标记,表示从开始到当前时间每一条蚯蚓应该加上的长度,操作时就加上,入队时就减 ...

  3. 洛谷P2827 [NOIP2016 提高组] 蚯蚓 (二叉堆/队列)

    容易想到的是用二叉堆来解决,切断一条蚯蚓,其他的都要加上一个值,不妨用一个表示偏移量的delta. 1.取出最大的x,x+=delta: 2.算出切断后的两个新长度,都减去delta和q: 3.del ...

  4. 【题解】NOIP2016提高组 复赛

    [题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ...

  5. 【题解】NOIP2016 提高组 简要题解

    [题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...

  6. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  7. [日记&做题记录]-Noip2016提高组复赛 倒数十天

    写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...

  8. 【NOIP2016提高组day2】蚯蚓

    那么我们开三个不上升队列, 第一个记录原来的蚯蚓, 第二个记录乘以p的蚯蚓 第三个记录乘以(1-p)的蚯蚓, 在记录每条就要入队列的时间,就可以求出增加的长度 每次比较三个队列的队首,取最大的值x的切 ...

  9. 【NOIP2016提高组】 Day2 T2 蚯蚓

    题目传送门:https://www.luogu.org/problemnew/show/P2827 自测时被题面所误导...,题面中说逢t的倍数才输出答案,以为有什么玄妙的方法直接将m次操作变成了m/ ...

随机推荐

  1. WmiPrvSE.exe进程(WMI Provider Host)不能删除

    WmiPrvSE.exe进程基本信息:程序厂商:微软® Microsoft Corp.进程描述:WMI Provider Host进程属性:Windows系统进程使用网络:是的启动情况:触发启动 来历 ...

  2. net_device->uc_promisc

    如果设备不支持单播过滤,并且要监听多个单播地址时,就要使用net_device->uc_count和net_device->uc_promisc来设置混杂模式,具体见__dev_set_r ...

  3. $(document).ready 和 window.onload 的区别

    1.相同点 两者都用于在网页加载完后执行相应代码块. 2.不同点 window.onload 在创建完 DOM 树后,所有外部资源(图片.Flash 动画等)加载完成,且整个页面在浏览器窗口中显示完毕 ...

  4. 【设计模式】原型模式(Prototype)

    摘要: 1.本文将详细介绍原型模式的原理和实际代码中特别是Android系统代码中的应用. 纲要: 1. 引入原型模式 2. 原型模式的概念及优缺点介绍 3. 原型模式对拷贝的使用 4. 原型模式在A ...

  5. ftrace 简介【转】

    转自:http://www.ibm.com/developerworks/cn/linux/l-cn-ftrace/index.html Trace 对于软件的维护和性能分析至关重要,ftrace 是 ...

  6. BZOJ 4516: [Sdoi2016]生成魔咒——后缀数组、并查集

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4516 题意 一开始串为空,每次往串后面加一个字符,求本质不同的子串的个数,可以离线.即长度为 ...

  7. 2015多校第6场 HDU 5353 Average 贪心,细节处理

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5353 题意:有n个人围城一个环,每一个人手里都有一些糖果,第i个人有ai块.现在有三种操作:第i个人给 ...

  8. iframe的一些介绍

    iframe 元素会创建包含另外一个文档的内联框架(即行内框架) 提示:您可以把需要的文本放置在 <iframe> 和 </iframe> 之间,这样就可以应对无法理解 ifr ...

  9. python 结束练习

    1.文件操作有哪些模式?请简述各模式的作用 r 只读模式 r+ 读写 rb w 只写模式 w+ 写读 wb x 只写模式 x+ 写读 xb a 追加模式 a+ 写读 ab 2.s = '**hello ...

  10. C10问题

    C10K问题是指服务器同时支持成千上万个客户端的问题,也就是concurrent 10 000 connection(这也是C0K这个名字的由来).由于硬件成本幅度降低和硬件版本的提高,如果服务器能够 ...