NOIP2016-D2-T2 蚯蚓(单调队列)
构建三个单调队列(用STL),分别储存未切的蚯蚓,切后的第一段,切后的第二段,即可简单证明其单调性。
证明:
设$q$为单调队列
$\because a_1 \geqslant a_2 \geqslant a_3 \geqslant \dots \geqslant a_n$
$\therefore a_2\leqslant a_1 ,p\cdot a_1 \leqslant a_1,(a_1-p\cdot a_1)\leqslant a_1$
$又 \because a_x 取自,a_2,(p\cdot a_1),(a_1-p\cdot a_1)中的一个$
$\therefore p\cdot a_x\leqslant (p\cdot a_1) , (a_x-p\cdot a_x)\leqslant a_1-p\cdot a_1 $
以此类推
$\therefore q,q2,q3$三个队列都保持单调递减
以下说明来自题解
- 我们会发现蚯蚓的切割具有单调性:一只蚯蚓切割后会分为$⌊px⌋$ 和 $x−⌊px⌋$两个部分,对于其中的任意一个部分,在某一时刻切割出的那只蚯蚓必然会比在它之后切割出来的蚯蚓要长
- 我们用反证法对此予以证明:
- 设某一时刻被选出的某只蚯蚓切割前的长度为 $a_i$,经过 $N$ 秒后,假设存在一只之前未被切割过的蚯蚓这一秒切割完后长度最大,我们记其N秒前的长度为 $a_j$,那么 $a_i$, $a_j$必然要满足(我们先只考虑切割出的$⌊px⌋$ 那部分蚯蚓, $x−⌊px⌋$ 同理):
$$a_i×p+N×q≤(a_j+N×q)×pa_i×p+N×q≤(a_j+N×q)×p$$
- 分配后得到 $a_i×p+N×q≤a_j×p+N×q×p$
- 又因为 $N$秒前长度为 $a_i$ 的蚯蚓被选出,所以那一时刻满足 $a_i≥a_j$,而 $p$ 的取值范围为$ 0<p<10<p<1$,所以必然满足
$$a_i×p+N×q>a_j×p+N×q×p$$
- 与之前的假设矛盾,因此上述情况不可能存在,我们证得蚯蚓的切割具有单调性
- 考虑记录三个队列,分别存储未切割过的蚯蚓和切割成的两只蚯蚓,每次将蚯蚓插入对应的队尾。
- 根据我们上面推论得出的单调性,每次取出三个队头的最大值即可,蚯蚓长度的增加和上述堆做法的处理方式相同,这样的总复杂为 $O(n+m)$
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<queue>
using namespace std;
#define rint register int
#define mem(a,b) memset(a,(b),sizeof(a))
template<typename T>
inline void read(T &x)
{
x=;T w=,ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')w=-,ch=getchar();
while(isdigit(ch))x=(x<<)+(x<<)+(ch^''),ch=getchar();
x=x*w;
}
typedef long long ll;
inline bool cmp(ll x,ll y){return x>y;}
#include<queue>
queue<ll> q,q1,q2;
const int maxn=+;
const ll inf=0x7fffffffffffffff;
ll n,m,k,t,a[maxn];
double p;
inline ll find(){
ll len=q.empty()?-inf:q.front();
ll len1=q1.empty()?-inf:q1.front();
ll len2=q2.empty()?-inf:q2.front();
if(len>=len1&&len>=len2){q.pop();return len;}
else if(len1>=len&&len1>=len2){q1.pop();return len1;}
else{q2.pop();return len2;}
}
int main()
{
ll U,V;
read(n);read(m);read(k);read(U);read(V);read(t);p=1.0*U/V;
for(rint i=;i<=n;i++)read(a[i]);
sort(a+,a+n+,cmp);
for(rint i=;i<=n;i++)q.push(a[i]);
for(rint i=;i<=m;i++){
ll maxlen=find()+(i-)*k;
// cout<<"##"<<maxlen<<endl;
double d=p*maxlen;
ll d1,d2;
d1=d;
d2=maxlen-d1;
q1.push(d1-i*k);q2.push(d2-i*k);
if(!(i%t))printf("%lld ",maxlen);
}
putchar('\n');
for(rint i=;i<=n+m;i++){
ll maxlen=find();
if(!(i%t))printf("%lld ",maxlen+m*k);
}
return ;
}
NOIP2016-D2-T2 蚯蚓(单调队列)的更多相关文章
- [noip2016]蚯蚓<单调队列+模拟>
题目链接:https://vijos.org/p/2007 题目链接:https://www.luogu.org/problem/show?pid=2827#sub 说实话当两个网站给出AC后,我很感 ...
- luogu 2827 蚯蚓 单调队列/优先队列
易知可利用优先队列选取最大值: 但是通过分析可知,先取出的蚯蚓分开后仍然要比后分的长,所以可直接利用单调队列找队头即可,分三个单调队列,分别找未切割,切割,切割2三种情况 #include<bi ...
- NOIP2016 DAY2 T2蚯蚓
传送门 Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神 ...
- 洛谷P2827 蚯蚓(单调队列)
题意 初始时有$n$个蚯蚓,每个长度为$a[i]$ 有$m$个时间,每个时间点找出长度最大的蚯蚓,把它切成两段,分别为$a[i] * p$和$a[i] - a[i] * p$,除这两段外其他的长度都加 ...
- [Noip2016]蚯蚓 D2 T2 队列
[Noip2016]蚯蚓 D2 T2 Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯 ...
- 【BZOJ】4721: [Noip2016]蚯蚓 / 【洛谷】P2827 蚯蚓(单调队列)
Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮 ...
- [Noip2016]蚯蚓 (单调队列)
题干 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓.蛐蛐国 ...
- bzoj2276: [Poi2011]Temperature(单调队列/堆)
这题有两种写法,而且是完全(几乎?)不一样的写法...并不是换了个方法来维护而已 单调队列O(N):用一个队列维护a[]的单调递减,对于每个i满足a[队头]<=b[i],然后就可以算出以每一位为 ...
- [Bzoj4182]Shopping(点分治)(树上背包)(单调队列优化多重背包)
4182: Shopping Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 374 Solved: 130[Submit][Status][Disc ...
随机推荐
- java锁经典示例——卖车票场景
场景:20张车票 3个窗口同时售票 1.不加锁 package com.yao.lock; /** * 不加锁的情况 */ public class Runnable_demo implements ...
- 对软件工程Alpha迭代的反思与总结
对软件工程Alpha迭代的反思与总结 本次软件工程的A轮迭代,我们组出了不小的问题.作为一个团队来说,我们的队伍出现了很严重的状况,严重到让老师觉得我们一度失控.于是我撰写此文,借以反思.总结和提高. ...
- 《linux内核分析》作业一:分析汇编代码
通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的(王海宁) 姓名:王海宁 学号:20135103 课程:<Linux内核分析& ...
- FASIC: A Fast-recovery, Adaptively Spanning In-band Control Plane in Software-Defined Network
2017 IEEE Global Communications Conference 问题:in-band网络中如果物理链路阻塞或者硬件故障,导致控制器的消息不能及时到达各个交换机导致网络不一致甚至某 ...
- Linux 文件系统介绍
目录 1.Linux 分区简介 2.文件的类型 3.文件的属性与权限 4.直达底部 一.Linux 分区简介 与 windows 通过 盘符管理各个分区不同,Linux把所有设备和文件都当作文件来管理 ...
- [微软]The latest version of Windows is Windows Sandbox
The latest version of Windows is Windows Sandbox by Surur @mspoweruser Dec 19, 2018 at 1:40 GMT As h ...
- json-server(copy)
https://blog.csdn.net/wangle_style/article/details/79455508(原文章地址) 新版vue-cli如何使用json-server来mork 原创 ...
- 防止短时间js 重复执行
function debounce(fn, delay) { // 持久化一个定时器 timer let timer = null; // 闭包函数可以访问 timer return function ...
- 怎么判断pagecontrol下的TabSheet是否打开还是关闭求答案
if pagecontrol.activepage=TabSheet1 then是在当前显示页------解决方案------------------------------------------- ...
- Python学习-------------------三级菜单简单版
题目: 多级菜单 1.三级菜单 2.可依次选择进入的各子菜单 3.所需新知识点:列表.字典 ReadMe: 这个做循环,比较绕脑子 点开运行即可 Min ...