构建三个单调队列(用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 蚯蚓(单调队列)的更多相关文章

  1. [noip2016]蚯蚓<单调队列+模拟>

    题目链接:https://vijos.org/p/2007 题目链接:https://www.luogu.org/problem/show?pid=2827#sub 说实话当两个网站给出AC后,我很感 ...

  2. luogu 2827 蚯蚓 单调队列/优先队列

    易知可利用优先队列选取最大值: 但是通过分析可知,先取出的蚯蚓分开后仍然要比后分的长,所以可直接利用单调队列找队头即可,分三个单调队列,分别找未切割,切割,切割2三种情况 #include<bi ...

  3. NOIP2016 DAY2 T2蚯蚓

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

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

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

  5. [Noip2016]蚯蚓 D2 T2 队列

    [Noip2016]蚯蚓 D2 T2 Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯 ...

  6. 【BZOJ】4721: [Noip2016]蚯蚓 / 【洛谷】P2827 蚯蚓(单调队列)

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

  7. [Noip2016]蚯蚓 (单调队列)

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

  8. bzoj2276: [Poi2011]Temperature(单调队列/堆)

    这题有两种写法,而且是完全(几乎?)不一样的写法...并不是换了个方法来维护而已 单调队列O(N):用一个队列维护a[]的单调递减,对于每个i满足a[队头]<=b[i],然后就可以算出以每一位为 ...

  9. [Bzoj4182]Shopping(点分治)(树上背包)(单调队列优化多重背包)

    4182: Shopping Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 374  Solved: 130[Submit][Status][Disc ...

随机推荐

  1. (Alpha)Let's-Chronos分数分配规则

    Requirement: 每个团队开一个讨论会,协商讨论团队贡献分的分配方式.每个团队的团队贡献分为50分/人.每个人分数不能相同,请详细说明分数的分配规则. 为了完成此次的团队贡献分的分配任务,我们 ...

  2. 获得用户的真实IP地址

    /** * 获得用户的真实IP地址 * * @access public * @return string */if (!function_exists('get_real_ip')){ functi ...

  3. Spring IOC AOP的原理 如果让你自己设计IOC,AOP如何处理(百度)

    百度的面试官问,如果让你自己设计一个IOC,和AOP,如何设计, 我把IOC的过程答出来了,但是明显不对, (1) IOC 利用了反射,自己有个id,classtype,hashmap,所有的功能都在 ...

  4. 如何设置Listbox的行间距?

    关于Listbox的问题? 1. 如何设置Listbox的行间距?  2. 如何实现当鼠标点击Listbox时,被选中的那一行在鼠标点击处出现一控件?    也就是怎么计算出被选中的那一行鼠标点击处的 ...

  5. 从0在windows上一次性上传本地整个项目(包含所有文件/文件夹)到 Github

    1.注册并登陆Github. 2.登陆进去之后的页面,点击这个“库”,这表示你在Github上上的代码仓库,我这里已经创建过一个了,所以数量是1 3.在仓库选项卡中,点击“新建”按钮添加一个项目. 4 ...

  6. MySQL存储引擎 - Myisam和Innodb

    Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比   MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个 文件的名字以表的名字开始 ...

  7. 【题解】 bzoj1055: [HAOI2008]玩具取名 (动态规划)

    bzoj1055,懒得复制,戳我戳我 Solution: 区间动规(以后开始动规会在solution前面标注是啥动规 我觉的这道题挺难想了,但其实状态定义了一下子就出来了(还是不行啊) 我们定义状态\ ...

  8. 【BZOJ1484】[HNOI2009]通往城堡之路 (贪心)

    [BZOJ1484][HNOI2009]通往城堡之路 (贪心) 题面 BZOJ 洛谷 题解 我大概是不会的. 大概是,首先把所有的人全部弄成最低的值,再一次次拔高一个后缀. 其他的全是抄的,百度随便找 ...

  9. 【Luogu4609】建筑师(第一类斯特林数,组合数学)

    [Luogu4609]建筑师(组合数学) 题面 洛谷 题解 首先发现整个数组一定被最高值切成左右两半,因此除去最高值之后在左右分开考虑. 考虑一个暴力\(dp\) ,设\(f[i][j]\)表示用了\ ...

  10. luogu1941 [NOIp2014]飞扬的小鸟 (dp)

    设f[i][j]为到达(i,j)这个位置的最小操作数 就有$f[i][j]=min\{f[i-1][j+Y[i-1]],f[i-1][j-X[i-1]*k]+k\}$ 然后考虑优化一下转移: 对于一系 ...