题目不再重复叙述

请参考:

洛谷

CJOJ

题解

先来说说非完美解法,也是我去年考场上的做法

考虑一下每一只蚯蚓增加的长度,

这个值并不需要每一次依次增加,

用一个变量维护即可,每次取出蚯蚓就加上这个值,切断蚯蚓就减去这个值。

接下来如何维护最大的蚯蚓,考虑使用一个堆来进行维护

时间复杂度O(mlogm)显然超时(其实也就是常数巨大)

现在,来考虑正解

我们先来脑补几个显然成立的结论

第一个:如果蚯蚓A长于蚯蚓B,一定是优先切蚯蚓A

第二个:一只蚯蚓被切断后,两部分长度一定不会超过原长度

第三个:如果蚯蚓A长于蚯蚓B,若干时间后,A还是长于B(A不被切)

第四个:如果蚯蚓A长于蚯蚓B,A和B切断后,A的两段分别长于B的两段。

那么,我们似乎发现了一点,单调性。

看一看,先切的一定比后切的长。(显然成立呀)

虽然不知道新切出来的部分和下一个切的部分谁更长,但是只需要1次比较就可以知道下一次应该切谁。(比较新切出来的长度和下一个本来应该要切的长度)

那么,我们利用单调性来维护队列。(不需要优先队列了)

首先维护所有初始的蚯蚓长度

然后考虑到所有蚯蚓只会变成两段,并且一段长一段短。那么,再用两个队列维护长的那一段和短的那一段。

现在,得到了3个队列,分别维护初始长度和切下来的两段的长度。

根据上面几个很显然的结论,这三个队列都是满足由长到短的单调性的(初始长度就排个序来维护)

那么,每次取出最长的蚯蚓就只需要考虑三个队列的首元素即可。

这个时候的时间复杂度是O(N+M+NlogN)显然可以在时间范围内求解

这道题目的关键就是 单调性,通过单调性解决掉优先队列,从而优化常数。

最后注意几个小细节:

不要提前算出来P的值,每次用U和V去计算,要不然会掉精度

除的时候一定要强制换成longlong,要不可能会炸int

INF值要开大一点,这样比较的时候才不会出问题。

题目仔细读几遍,看题要仔细。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX 10000100
#define INF 1000000000000000
inline bool cmp(int a,int b)
{
return a>b;
}
long long N,M,Q,U,V,T;
long long q[3][MAX];
long long h[3],t[3];
long long cnt=0,now,fl,aa,bb;
int main()
{
scanf("%d%d%d%d%d%d",&N,&M,&Q,&U,&V,&T);
//P=U/V;
for(int i=1;i<=N;++i)
scanf("%d",&q[0][i]);
sort(&q[0][1],&q[0][N+1],cmp);
h[0]=h[1]=h[2]=1;t[0]=N;t[1]=t[2]=0;
for(int tt=1;tt<=M;++tt)
{
now=fl=-INF;
for(int i=0;i<3;++i)
if(h[i]<=t[i])
if(now<q[i][h[i]])
{
now=q[i][h[i]];
fl=i;
}
h[fl]++;
now+=cnt;
aa=(1LL*now*U)/V;bb=now-aa;
if(aa>bb)swap(aa,bb);
q[1][++t[1]]=bb-cnt-Q;
q[2][++t[2]]=aa-cnt-Q;
cnt+=Q;
if(tt%T==0)
printf("%d ",now);
}
printf("\n");
for(int tt=1;tt<=N+M;++tt)
{
now=fl=-INF;
for(int i=0;i<3;++i)
if(h[i]<=t[i])
if(now<q[i][h[i]])
{
now=q[i][h[i]];
fl=i;
}
if(tt%T==0)
printf("%d ",now+cnt);
h[fl]++;
}
return 0;
}

【NOIP2016】蚯蚓(队列,单调性)的更多相关文章

  1. [NOIp2016]蚯蚓 (队列)

    #\(\color{red}{\mathcal{Description}}\) LInk 这道题是个\(zz\)题 #\(\color{red}{\mathcal{Solution}}\) 我们考虑如 ...

  2. [Noip2016]蚯蚓 D2 T2 队列

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

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

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

  4. NC16430 [NOIP2016]蚯蚓

    NC16430 [NOIP2016]蚯蚓 题目 题目描述 本题中,我们将用符号 \(\lfloor c \rfloor\) 表示对 c 向下取整,例如:\(\lfloor 3.0 \rfloor = ...

  5. 【noip2016】蚯蚓(单调性+队列)

    题目贼长 大意是你有n个线段,每一秒你要拿出来最长的一个线段切成两段长度为[p*u](向下取整)和u-[p*u]两段(其中u是线段长,p是一个大于0小于1的实数)没被切的线段长度加q(0<q&l ...

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

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

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

    传送门 好题. 目测只会多带一个log2(n+m)" role="presentation" style="position: relative;"& ...

  8. 蚯蚓(noip2016,贪心,单调性)

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

  9. 【noip2017 day2T2】【蚯蚓】巧用队列单调性线性处理

    (画师当然是武内崇啦) Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐 ...

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

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

随机推荐

  1. PHP 5.6 微信上传临时素材的坑

    /** * 上传素材 */ function add_material($url){ $access_token = wx_access_token(); $wx_url = "https: ...

  2. 017 Java中的静态代理、JDK动态代理、cglib动态代理

    一.静态代理 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由业务实现类.业务代理类两部分组成.业务实现类负责实现主要的业务方法,业 ...

  3. 如何在Centos 7上用Logrotate管理日志文件

    何为Logrotate? Logrotate是一个实用的日志管理工具,旨在简化对系统上生成大量的日志文件进行管理. Logrotate允许自动旋转压缩,删除和邮寄日志文件,从而节省宝贵的磁盘空间. L ...

  4. FTP主动模式和被动模式

    FTP主动模式和被动模式 FTP是仅基于TCP的服务,不支持UDP.与众不同的是FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口).通常来说这两个端口是21(命令端口)和20(数据端口 ...

  5. (转)CocoaPods:管理Objective-c 程序中各种第三方开源库关联

    在我们的iOS程序中,经常会用到多个第三方的开源库,通常做法是去下载最新版本的开源库,然后拖拽到工程中. 但是,第三方开源库的数量一旦比较多,版本的管理就非常的麻烦.有没有什么办法可以简化对第三方库的 ...

  6. 使用matlab生成sine波mif文件

    使用matlab生成sine波mif文件 作者:lee神 在使用altera 的FPGA中的rom过程中常常会使用到.mif文件或.hex文件.对于初学者,无论mif还是hex都是很令人疑惑的东西,这 ...

  7. Android -传统蓝牙通信聊天

    概述 Android 传统蓝牙的使用,包括开关蓝牙.搜索设备.蓝牙连接.通信等. 详细 代码下载:http://www.demodashi.com/demo/10676.html 原文地址: Andr ...

  8. C/C++语言简介之语法结构

    一.顺序结构    顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行.    例如:a = 3,b = 5,现交换a,b的值,这个问题就好像交换 ...

  9. redux middleware 源码分析

    原文链接 middleware 的由来 在业务中需要打印每一个 action 信息来调试,又或者希望 dispatch 或 reducer 拥有异步请求的功能.面对这些场景时,一个个修改 dispat ...

  10. IOS 使用cocoapods后无法导入头文件问题

    IOS 使用cocoapods后无法导入头文件问题 这时候如果你发现import的时候没有提示AFN e t wo r k i n g.h的文件,可以在target-Build Settings下修改 ...