Luogu P2827 蚯蚓
看到题目就可以想到直接开的堆模拟的过程了吧,这个还是很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 蚯蚓相关推荐
- LUOGU P2827 蚯蚓 (noip 2016)
传送门 解题思路 第一眼以为是一个二叉堆,直接上优先队列60分...后来听ztz11说有单调性,新加入的蚯蚓一定比原先在的蚯蚓长度长,开三个队列,分别放原先的长度,切掉后大的那一半,切掉后小的那一半. ...
- Noip2016day2
P2822 组合数问题 题目描述 组合数 C_n^mCnm 表示的是从 nn 个物品中选出 mm 个物品的方案数.举个例子,从 (1,2,3)(1,2,3) 三个物品中选择两个物品可以有 (1,2) ...
- NOIP前的刷题记录
因为这几天要加油,懒得每篇都来写题解了,就这里记录一下加上一句话题解好了 P4071 [SDOI2016]排列计数 组合数+错排 loj 6217 扑克牌 暴力背包 P2511 [HAOI2008 ...
- 近期刷题总结 [19 03 17]
目录 P3703 [SDOI2017]树点涂色 [LCT + 线段树] CF739B Alyona and a tree [主席树] P4098 [HEOI2013]ALO [双向链表 + 可持久化0 ...
- Luogu 2827 [NOIP2016] 蚯蚓
原来真的是按题意模拟啊,还以为有高能的算法可以直接算每个$t$的值. 考虑到先切的蚯蚓一定比后切的蚯蚓长,于是可以弄三个队列分别存放原来的序列和两个切开后的序列,每次取出三个队头的最大值进行扩展. 考 ...
- BZOJ4943 洛谷3823 UOJ315:[NOI2017]蚯蚓排队——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4943 http://uoj.ac/problem/315 https://www.luogu.or ...
- 2020年10月30日提高组 B 超级蚯蚓
文章目录 ResultResultResult HyperlinkHyperlinkHyperlink DescriptionDescriptionDescription SolutionSoluti ...
- luogu P1549 棋盘问题(2) 题解
luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...
- [Luogu] 选学霸
https://www.luogu.org/problemnew/show/P2170 并查集+DP #include <iostream> #include <cstring> ...
最新文章
- 使用深度学习和OpenCV的早期火灾检测系统
- 如何让qtableview根据行列的宽度调整大小_T-200热熔打包机,打包宽度调整步骤
- 被低估的css滤镜,你所不知道的 CSS 滤镜技巧与细节
- mysql生成uui mybatis_mybatis----基础
- 【LOJ6363】「地底蔷薇」【点双】【指数型生成函数】【扩展拉格朗日反演】【多项式幂函数】
- 编程小技巧(一)——系统性能优化之多次数据库访问处理
- C#,COM口,接收,发送数据
- 反卷积,上采样,上池化的理解
- 计算机视觉实战(八)直方图与傅里叶变换
- Chrome 谷歌浏览器将整个网页保存为图片
- 计算机考试怎么复制粘贴文件,复制粘贴,教您电脑复制粘贴不能用了怎么解决...
- 202020 公文系统安装技巧
- VMware安装优麒麟20.04LTS
- 对于运维以及运维开发工程师的一些了解
- zcpa matlab,matlab习题结果解析.doc
- HDLBits 状态机练习题目 water reservoir 蓄水池控制器
- 第16章 货币政策与财政政策
- 使用Promise.all实现限制并发请求函数
- 五星好文·射频功率放大器(RF PA)概述
- 【人工智能AI2.0】国产开源 ChatGPT: ChatGLM-6B 搭建属于你的永远免费的本地 ChatGPT
热门文章
- c与c++分别是怎样动态分配和释放内存的,有什么区别?(转)
- 修改本地管理员密码脚本
- window启动过程讲解--PPT截图[张银奎]
- .NET : 在定义项目模板的时候使用占位符
- 微型计算机基础知识,微型计算机的基础知识
- 是否遇到过MySQL workbench text字段不能直接放入json格式内容
- 批量复制文件并改成有顺序的文件名
- Oracle 用户,角色,权限的sql语句
- springMVC 项目在jboss7中配置应用自己的log4j
- eclipse jar打包 jar line too long 异常处理方法