博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[NOIP2016]蚯蚓(单调性乱搞)
阅读量:5032 次
发布时间:2019-06-12

本文共 2019 字,大约阅读时间需要 6 分钟。

题目

思路

最简单的思路肯定就是直接用堆维护,每次取最大的那一个,切成两截扔回堆里面(至于所有蚯蚓加上\(q\),可以看做是新生成的蚯蚓减去\(time*q\),最后再加回去即可,其中\(time\)即第几秒),然而这样子做是\(O(n+m)log(n+m)\)的,过不了

分析后可以发现单调性,即如果把切出来的两部分分别放到一个数组里面,它们分别单调递减

证明也很简单,设先切的蚯蚓长度为\(len1\),后切的在切\(len1\)的这个时候长度为\(len2\),那么有\(len2\)\(\leq\)\(len1\),它们长度不增长的时间仅仅是切的时候,即它们的增加量相等,那么有\(len2+c\)\(\leq\)\(len1+c\)恒成立

所以把它们分成三个数组(队列),分别存初始蚯蚓、(切了一刀之后)第一节、第二节,对初始蚯蚓排序可以使第一个数组从大到小排序,将后切出来的蚯蚓放到队列后面可以使得这两个数组也满足从大到小排序,取最大的蚯蚓即从三个队列的队头取最大值

对于第二问,将三个队列进行归并排序即可

时间复杂度为\(O(nlogn+m)\)

#include
#define N 100005#define M 7000005using namespace std;int n,m,q,u,v,t;int a[3][M],top[3];int b[N+M],c[N+M];template
void read(T &x){ char c;int sign=1; while((c=getchar())>'9'||c<'0') if(c=='-') sign=-1; x=c-48; while((c=getchar())>='0'&&c<='9') x=x*10+c-48; x*=sign;}bool cmp(int a,int b) {return a>b;} int main(){ read(n);read(m);read(q); read(u);read(v);read(t); for(register int i=1;i<=n;++i) read(a[0][i]); a[0][0]=n; top[0]=top[1]=top[2]=1; sort(a[0]+1,a[0]+n+1,cmp); for(register int i=1;i<=m;++i) { int maxx=(top[0]>n); if(a[maxx][top[maxx]]
<=a[1][0]) maxx=1; if(a[maxx][top[maxx]]
<=a[2][0]) maxx=2; int len=a[maxx][top[maxx]++]+(i-1)*q; int L=(long long)u*len/v; int R=len-L; a[1][++a[1][0]]=L-q*i; a[2][++a[2][0]]=R-q*i; if(i%t==0) printf("%d ",len); } printf("\n"); int l=top[0],r=top[1]; while(l<=a[0][0]&&r<=a[1][0]) { if(a[0][l]>a[1][r]) b[++b[0]]=a[0][l++]; else b[++b[0]]=a[1][r++]; } while(l<=a[0][0]) b[++b[0]]=a[0][l++]; while(r<=a[1][0]) b[++b[0]]=a[1][r++]; l=1;r=top[2]; while(l<=b[0]&&r<=a[2][0]) { if(b[l]>a[2][r]) c[++c[0]]=b[l++]; else c[++c[0]]=a[2][r++]; } while(l<=b[0]) c[++c[0]]=b[l++]; while(r<=a[2][0]) c[++c[0]]=a[2][r++]; for(int i=t;i<=n+m;i+=t) printf("%d ",c[i]+m*q); printf("\n"); return 0;}

转载于:https://www.cnblogs.com/Chtholly/p/11347779.html

你可能感兴趣的文章
SpringBoot 集成ehcache
查看>>
初步swift语言学习笔记2(可选类型?和隐式可选类型!)
查看>>
Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
查看>>
在Vs2012 中使用SQL Server 2012 Express LocalDB打开Sqlserver2012数据库
查看>>
Excel催化剂开源第42波-与金融大数据TuShare对接实现零门槛零代码获取数据
查看>>
【转】常用的latex宏包
查看>>
[TMS320C674x] 一、GPIO认识
查看>>
酷狗的皮肤文件存放在哪
查看>>
C++的引用
查看>>
T-SQL查询进阶--深入浅出视图
查看>>
MapKeyboard 键盘按键映射 机械革命S1 Pro-02
查看>>
Android读取url图片保存及文件读取
查看>>
完整ASP.Net Excel导入
查看>>
判断CPU大小端示例代码
查看>>
ARTS打卡第13周
查看>>
循环队列的运用---求K阶斐波那契序列
查看>>
pta 编程题14 Huffman Codes
查看>>
初始化bootstrap treeview树节点
查看>>
JS常用坐标
查看>>
关于git的认证方式
查看>>