看到题目就可以想到直接开的堆模拟的过程了吧,这个还是很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;
}

转载于:https://www.cnblogs.com/cjjsb/p/9439810.html

Luogu P2827 蚯蚓相关推荐

  1. LUOGU P2827 蚯蚓 (noip 2016)

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

  2. Noip2016day2

    P2822 组合数问题 题目描述 组合数 C_n^mCnm​ 表示的是从 nn 个物品中选出 mm 个物品的方案数.举个例子,从 (1,2,3)(1,2,3) 三个物品中选择两个物品可以有 (1,2) ...

  3. NOIP前的刷题记录

    因为这几天要加油,懒得每篇都来写题解了,就这里记录一下加上一句话题解好了 P4071 [SDOI2016]排列计数   组合数+错排 loj 6217 扑克牌 暴力背包 P2511 [HAOI2008 ...

  4. 近期刷题总结 [19 03 17]

    目录 P3703 [SDOI2017]树点涂色 [LCT + 线段树] CF739B Alyona and a tree [主席树] P4098 [HEOI2013]ALO [双向链表 + 可持久化0 ...

  5. Luogu 2827 [NOIP2016] 蚯蚓

    原来真的是按题意模拟啊,还以为有高能的算法可以直接算每个$t$的值. 考虑到先切的蚯蚓一定比后切的蚯蚓长,于是可以弄三个队列分别存放原来的序列和两个切开后的序列,每次取出三个队头的最大值进行扩展. 考 ...

  6. BZOJ4943 洛谷3823 UOJ315:[NOI2017]蚯蚓排队——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4943 http://uoj.ac/problem/315 https://www.luogu.or ...

  7. 2020年10月30日提高组 B 超级蚯蚓

    文章目录 ResultResultResult HyperlinkHyperlinkHyperlink DescriptionDescriptionDescription SolutionSoluti ...

  8. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

  9. [Luogu] 选学霸

    https://www.luogu.org/problemnew/show/P2170 并查集+DP #include <iostream> #include <cstring> ...

最新文章

  1. 使用深度学习和OpenCV的早期火灾检测系统
  2. 如何让qtableview根据行列的宽度调整大小_T-200热熔打包机,打包宽度调整步骤
  3. 被低估的css滤镜,你所不知道的 CSS 滤镜技巧与细节
  4. mysql生成uui mybatis_mybatis----基础
  5. 【LOJ6363】「地底蔷薇」【点双】【指数型生成函数】【扩展拉格朗日反演】【多项式幂函数】
  6. 编程小技巧(一)——系统性能优化之多次数据库访问处理
  7. C#,COM口,接收,发送数据
  8. 反卷积,上采样,上池化的理解
  9. 计算机视觉实战(八)直方图与傅里叶变换
  10. Chrome 谷歌浏览器将整个网页保存为图片
  11. 计算机考试怎么复制粘贴文件,复制粘贴,教您电脑复制粘贴不能用了怎么解决...
  12. 202020 公文系统安装技巧
  13. VMware安装优麒麟20.04LTS
  14. 对于运维以及运维开发工程师的一些了解
  15. zcpa matlab,matlab习题结果解析.doc
  16. HDLBits 状态机练习题目 water reservoir 蓄水池控制器
  17. 第16章 货币政策与财政政策
  18. 使用Promise.all实现限制并发请求函数
  19. 五星好文·射频功率放大器(RF PA)概述
  20. 【人工智能AI2.0】国产开源 ChatGPT: ChatGLM-6B 搭建属于你的永远免费的本地 ChatGPT

热门文章

  1. c与c++分别是怎样动态分配和释放内存的,有什么区别?(转)
  2. 修改本地管理员密码脚本
  3. window启动过程讲解--PPT截图[张银奎]
  4. .NET : 在定义项目模板的时候使用占位符
  5. 微型计算机基础知识,微型计算机的基础知识
  6. 是否遇到过MySQL workbench text字段不能直接放入json格式内容
  7. 批量复制文件并改成有顺序的文件名
  8. Oracle 用户,角色,权限的sql语句
  9. springMVC 项目在jboss7中配置应用自己的log4j
  10. eclipse jar打包 jar line too long 异常处理方法