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 ...
随机推荐
- @Param注解的用法解析
实例一 @Param注解单一属性 dao层示例 Public User selectUser(@param(“userName”) String name,@param(“userpassword”) ...
- 20135220谈愈敏Blog4_系统调用(上)
系统调用(上) 谈愈敏 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 用户态 ...
- HTML5遇到的问题
一.Uncaught SyntaxError: Unexpected identifier 解决办法: Uncaught SyntaxError: Unexpected identifier这个问题, ...
- Spring scope注解
Spring注解中@scope默认为单例模式(singleton) 设置写法@scope("") 1.singleton单例模式 全局有且仅有一个实例 2.prototype原型模 ...
- Java运算符、switch、数组、排序
1.Java的运算符,分为四类:算数运算符.关系运算符.逻辑运算符.位运算符 运算符例子:22.25(十进制转化为二进制,8421码)0010 0010 (22)0010 0101 (25) 位运算符 ...
- Map Wiki -- proposed by Shuo Ren
Map Wiki —— 基于Bing地图的生活百科 在旅游.逛街或是闲逛的时,很多时候,我们往往想要对于身边的美食.医院.旅馆.购物.学习.景点等信息有进一步认识.在这时,我们大多会再打开百度或者大众 ...
- Iterative Quantization,ITQ
Abstract 针对大规模的图像检索问题,论文提出了一个高效的ITQ算法.该算法先将中心化后的数据映射到超立方体的顶点上,再通过优化过程寻找一个旋转矩阵,使得数据点经过旋转后,与超立方体的顶点数据具 ...
- 这家伙好像还不错 ZH奶酪-张贺
http://www.cnblogs.com/CheeseZH/archive/2012/11/23/2783846.html
- [CB] 支付宝区块链的应用- 区块链发票医保理赔.
全国第一单区块链理赔.发票开出:1分钟报销 区块链技术和概念随着比特币等虚拟电子货币的兴起而尽人皆知,但是区块链的用途可不仅仅只玩币,尤其是在“矿难”到来之后,区块链正在向更多应用领域渗透.最 ...
- 查看Jira 使用的H2数据库 数据结构以及内容的方法
1. 同事在研究jira 想看看jira的数据库 数据结构, 告知使用的是java的H2数据库. 如图示 2. 然后根据此内容 进行百度等. 下载 可以进行数据库连接的工具,主要找到两个,下载地址分别 ...