看到题目就可以想到直接开的堆模拟的过程了吧,这个还是很naive的

注意在用堆做的时候也是要明智一点的,对于蚯蚓长度的相加肯定不能直接遍历并加上,还是可以差分一下的

其实说白了就是把集体加->单体减的一个小技巧,还是挺常用的。

然后看这个数据范围猜想应该是有什么\(O(n)\)的做法的,然后这就要发现题目中隐含的单调性

我们考虑讲所有的蚯蚓分个类,所有初始时没切割过的蚯蚓分为一类,每次切割产生的较长的蚯蚓分为一类,而产生的较短的蚯蚓分为一类

然后我们推到一下就可以发现,对于后面的两类蚯蚓,它们满足单调性

因为我们根据切割的过程可以发现:

  • 先切割的蚯蚓长度一定比后切割的蚯蚓长度长
  • 同一种切法,后切割的一定比先切割的短

所以我们再对初始的蚯蚓长度拍个序,就可以得到三个单调的队列(注意不是单调队列),每一次比较时我们取出队首并切割最长的一只再丢进第二队,第三队即可

差分的思想还是要的,不过这里直接记录了每一只蚯蚓进队的时间,每次注意加上增长的长度

细节比较多,最后对这三队蚯蚓做一次归并即可(因为都是有序的)

因此复杂度为\(O(n\ logn+m)\)

CODE

#include<cstdio>
#include<cctype>
#include<algorithm>
using namespace std;
const int N=100005,M=7000005;
int n,m,q,u,v,t,a[N],que[3][M],num[3][M],H[3],T[3],cut[M],ans[N+M],temp[N+M],cnt,tot;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline void write(int x)
{
if (x>9) write(x/10);
putchar(x%10+'0');
}
inline bool cmp(int x,int y)
{
return x>y;
}
inline void swap(int &a,int &b)
{
int t=a; a=b; b=t;
}
inline void merge(void)
{
register int i=H[0],j=H[1];
while (i<=T[0]&&j<=T[1])
if (que[0][i]+(m-num[0][i])*q>que[1][j]+(m-num[1][j])*q) temp[++cnt]=que[0][i]+(m-num[0][i])*q,++i;
else temp[++cnt]=que[1][j]+(m-num[1][j])*q,++j;
for (;i<=T[0];++i) temp[++cnt]=que[0][i]+(m-num[0][i])*q;
for (;j<=T[1];++j) temp[++cnt]=que[1][j]+(m-num[1][j])*q;
i=1; j=H[2];
while (i<=cnt&&j<=T[2])
if (temp[i]>que[2][j]+(m-num[2][j])*q) ans[++tot]=temp[i],++i; else ans[++tot]=que[2][j]+(m-num[2][j])*q,++j;
for (;i<=cnt;++i) ans[++tot]=temp[i];
for (;j<=T[2];++j) ans[++tot]=que[2][j]+(m-num[2][j])*q;
}
inline void print(void)
{
for (register int i=t;i<=m;i+=t)
write(cut[i]),putchar(' '); putchar('\n');
for (register int i=t;i<=n+m;i+=t)
write(ans[i]),putchar(' ');
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i,j; read(n); read(m); read(q); read(u); read(v); read(t);
for (i=1;i<=n;++i) read(a[i]); sort(a+1,a+n+1,cmp);
for (i=1;i<=n;++i) que[0][++T[0]]=a[i]; H[0]=H[1]=H[2]=1;
for (i=1;i<=m;++i)
{
int len=-1,id;
for (j=0;j<3;++j)
if (H[j]<=T[j]) if (que[j][H[j]]+(i-num[j][H[j]]-1)*q>len) len=que[j][H[j]]+(i-num[j][H[j]]-1)*q,id=j;
cut[i]=len; ++H[id]; int x=1LL*len*u/v,y=len-x; if (x<y) swap(x,y);
que[1][++T[1]]=x; num[1][T[1]]=i; que[2][++T[2]]=y; num[2][T[2]]=i;
}
merge(); print(); return 0;
}

Luogu P2827 蚯蚓的更多相关文章

  1. [Luogu P2827] 蚯蚓 (巧妙的模拟)

    题面: 传送门:https://www.luogu.org/problemnew/show/P2827 Solution 看到这题,我们肯定会有一个大胆想法. 那就是直接用堆模拟这个过程. 对于q,我 ...

  2. Luogu P2827 蚯蚓(模拟)

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

  3. 【luogu P2827 蚯蚓】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2827 35分:暴力sortO(mnlogn). 80分:考虑到每次不好维护不被切的点+q,正难则反.改成维护 ...

  4. LUOGU P2827 蚯蚓 (noip 2016)

    传送门 解题思路 第一眼以为是一个二叉堆,直接上优先队列60分...后来听ztz11说有单调性,新加入的蚯蚓一定比原先在的蚯蚓长度长,开三个队列,分别放原先的长度,切掉后大的那一半,切掉后小的那一半. ...

  5. 洛谷P2827 蚯蚓 题解

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

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

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

  7. 洛谷 P2827 蚯蚓 解题报告

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

  8. 洛谷——P2827 蚯蚓

    P2827 蚯蚓 题目描述 本题中,我们将用符号 \lfloor c \rfloor⌊c⌋ 表示对 cc 向下取整,例如:\lfloor 3.0 \rfloor = \lfloor 3.1 \rflo ...

  9. 【Luogu】P2827蚯蚓(堆转队列)

    按照国际惯例先发题目链接‍ woc从4月就开始做这sb题.最开始30分升到65分不管了,直到最近几天升到85分,再到今天AC.激动的心情自然是那些一遍就A或者一小时以内就A的神犇难以想象的. 下面说说 ...

随机推荐

  1. Flutter 安装

    都说程序猿学习是不分平台的,做了一辈子的Xaml,也想看看现在最牛逼的移动技术. 看了看Google 的Flutter,好像很牛逼,不怎么需要Android和IOS基础(应该还是要的), 不过现在是B ...

  2. Hook技术--Activity的启动过程的拦截

    1.寻找Hook点的原则 Android中主要是依靠分析系统源码类来做到的,首先我们得找到被Hook的对象,我称之为Hook点:什么样的对象比较好Hook呢?自然是容易找到的对象.什么样的对象容易找到 ...

  3. React.js 新手教程

    正如你能从标题猜到的,这篇文章的目标是给那些有很少编程经验的读者的.比如,像我这样的人:因为迄今为止,我才探索了编程世界6个月.所以,这将是一篇新手村教程! 你只需要拥有对 HTML 和 CSS 的理 ...

  4. Python 会是我们的未来吗?

    Python 热度激增 根据 Stack Overflow 的一项调查显示,Python 不仅在专业领域的使用率得到增长,在普通开发上的使用率也有所提升,有 40% 的受访者表示他们现在正在使用 Py ...

  5. 使用sklearn机器学习库实现线性回归

    import numpy as np  # 导入科学技术框架import matplotlib.pyplot as plt  # 导入画图工具from sklearn.linear_model imp ...

  6. psotgresql之大小写

    框中内容来自<PostgreSQL数据库对象名大小写敏感> 网址:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=812 ...

  7. 【第四篇】SAP ABAP7.5x新语法之CREATE DATA&INTERFACE

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文地址:SAP ABAP7.5x系列之CREATE DA ...

  8. Django电商项目---完成商品主页显示day2

    利用DjangoAdmin初始化数据库 创建项目 python manage.py startapp df_goods 添加配置 manas/urls.py manas/settings.py 新创建 ...

  9. shell基本语法记录

    Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个 ...

  10. 需求规格说明书——阿里八八“好记”APP

    工作流程 ① 组长查阅相关文档.示例文件等,根据本小组项目特点进行定制需求规格说明书目录. ② 根据选题报告工作进行任务分配,追求工作量最小化.效率最大化. ③ 分工编辑文档. ④ 组长搭建Githu ...