[noip2016]蚯蚓<单调队列+模拟>
题目链接:https://vijos.org/p/2007
题目链接:https://www.luogu.org/problem/show?pid=2827#sub
说实话当两个网站给出AC后,我很感动。。。。这题啊,思路容易想到,就是小细节太烦了。。。。。
【思路】
这道题要开三个队列,而且需要证明到一个点才能够做。。
就是先切的蚯蚓的部分,比后切的蚯蚓的对应部分长。。。有可能你会想蚯蚓不是随时在长吗,当然这不影响。。我们来简单证明一下
------------------------------------------------证明部分-------------------------------------------------------
首先第一存初始的蚯蚓,x1>x2,先切x1,切完是x1*p(A部分)和x1-x1*p(B部分),另外一个变长成为x2+q;
第二个时间点切原来x2这条,切完是(x2+q)*p(A部分)和x2+q-(x2+q)*p(B部分),第一条蚯蚓切后长成x1*p+q和x1-x1*p+q
然后来对应比较 我们以A部分为例子 x1*p+q : (x2+q)*p=x2*p+q*p
由题意可以知道p的范围是0<p<1,所以x1*p>x2*p,q>q*p进一步得出所以 x1*p+q> (x2+q)*p,同理,切出来的另一半也是这样的。。
-----------------------------------------------------------------------------------------------------------------
所以我们只要不断的将新切出来的蚯蚓按A部分和B部分分别压入两个队列,那这两个队列都是单调队列
每次选择要切的蚯蚓只需要取这三个队列队首的最大值
第二个要考虑的问题就是蚯蚓长大的问题,为了更好的处理这个细节,我们对每一个蚯蚓对还原成最初状态,即在变长后切割完就减去当前的时间*q。。
减去以后,三个队列里的蚯蚓都是没有成长的状态,有可能有负数但是不影响。。。
【细节问题】
1.首先是数组范围,队列我没试过,但是我数组开10^6是runtime error了。后来开成10^7才通过
2.接着是用来找最大值的ans,就是用来更新并求最大值的一个变量(详细见代码),这个东东的初值要是10^9以上的,虽然题目说蚯蚓长小于10^8,但是在m秒后长大了
m*q的长度,这加起来就接近10^8次方了,所以这也是一个细节
3.还有就是把蚯蚓减回初识形态时,不仅要减去之前时间大家长大的长度,还要额外减去一个,因为被砍的蚯蚓当前这一秒是不会生长,相对于所有就要少一个q,为了保证最后所有的蚯蚓+m*q就是正确值,就要对当前切开的蚯蚓额外减去q
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #include<cstdlib>
- #include<cmath>
- #include<queue>
- #define maxn 100005
- #define maxm 700005
- #define maxv 10000005
- #define inf 2000000005
- using namespace std;
- int h[],t[],a[maxm];//h->指针,队首......t->队的长度
- int b[][maxv],n,m,q,u,v,tt,del;
- int comp(const void*a,const void*b){
- return (*(int*)a)<(*(int*)b)?:-;
- }
- int main(){
- scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&tt);
- h[]=h[]=h[]=;
- for(int i=;i<=n;i++)scanf("%d",&a[i]);
- a[]=inf;
- qsort(a,n+,sizeof(int),comp);
- for(int i=;i<=n;i++)b[][i]=a[i];
- t[]=n;
- for(int i=;i<=m;i++){
- int ans=-inf,num=;//num表示当前选出队首最大的那个队列序号
- for(int j=;j<=;j++){
- if(h[j]<=t[j]){//指针不越界
- if(b[j][h[j]]>ans){
- ans=b[j][h[j]];num=j;//找三个队列的队首最大值
- }
- }
- }
- if(i%tt==)printf("%d ",ans+del);
- h[num]++;//理解为删除操作
- b[][++t[]]=(long long)(ans+del)*u/v-del-q;//队尾压入一个切开的A值
- b[][++t[]]=ans+del-(long long)(ans+del)*u/v -del-q;//队尾压入一个切开的B值
- del+=q;
- }
- printf("\n");
- for(int i=;i<=n+m;i++){
- int ans=-inf,num=;
- for(int j=;j<=;j++){
- if(h[j]<=t[j]&&b[j][h[j]]>ans){
- ans=b[j][h[j]];num=j;
- }
- }
- if(i%tt==){ printf("%d ",ans+del);}
- h[num]++;
- }
- return ;
- }
【总结】
1.对于一道题,要分析数据的变化,就像这题中蚯蚓的长度一样,不是始终小于题所给的10^8,所以要分析全局来赋值
2.数组的大小要严谨分析,在不会爆内存的情况下可以多开,虽然我刚刚开始开的是n+m大小,但是因为不会删去之前的蚯蚓,所以这个大小还不够,还是会越界
3.很多题是带有结论的,需要去证明,所以不要盲目去做一题,稍加分析,当然也可以先打暴力来辅助分析
[noip2016]蚯蚓<单调队列+模拟>的更多相关文章
- [Noip2016]蚯蚓 D2 T2 队列
[Noip2016]蚯蚓 D2 T2 Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯 ...
- 【BZOJ】4721: [Noip2016]蚯蚓 / 【洛谷】P2827 蚯蚓(单调队列)
Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮 ...
- NC16430 [NOIP2016]蚯蚓
NC16430 [NOIP2016]蚯蚓 题目 题目描述 本题中,我们将用符号 \(\lfloor c \rfloor\) 表示对 c 向下取整,例如:\(\lfloor 3.0 \rfloor = ...
- 【bzoj4721】[Noip2016]蚯蚓
题目描述 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓.蛐 ...
- 【uoj264】 NOIP2016—蚯蚓
http://uoj.ac/problem/264 (题目链接) 题意 n条蚯蚓,时间为m.每单位时间要可以将最长的蚯蚓切成len/2和len-len/2两份,长度为0的蚯蚓不会消失,因为每单位时间所 ...
- BZOJ4721 [Noip2016]蚯蚓
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- [NOIp2016] 蚯蚓
类型:单调队列 传送门:>Here< 题意:有$N$只蚯蚓,每秒都会伸长$q$.每一次都会有人选出最长的一条切成两半,长度分别是$\left \lfloor px \right \rflo ...
- luogu2827 [NOIp2016]蚯蚓 (模拟)
可以直观地想到用优先队列来做,但数据范围是O(n)的 然后我们发现,因为我们每次挑出来的蚯蚓是单调的,所以把每个切成两段后,那两段也是对应单调的 也就是说,算上最一开始的蚯蚓,我们一共维护三个队列,三 ...
- [NOIp2016]蚯蚓 (队列)
#\(\color{red}{\mathcal{Description}}\) LInk 这道题是个\(zz\)题 #\(\color{red}{\mathcal{Solution}}\) 我们考虑如 ...
- 【bzoj4721】[Noip2016]蚯蚓 乱搞
题目描述 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓.蛐 ...
随机推荐
- vue 打包体积过大 实现懒加载 ????
import Vue from ‘vue’ import Router from 'vue-router' //把路由对应的组件定义成异步组纪检 const hello = resolve => ...
- Git建立本地分支和远程分支的映射关系
git branch -vv:查看本地分支和远程分支的映射关系 在切换分支前,须本地建立新分支,例如:git branch release/v1.1 //本地建立release/v1.1分支成功后 ...
- GPS同步时钟装置应用及选择
GPS同步时钟装置应用及选择 GPS是全球定位系统的简称,GPS具有全天时.全天候.高精度.定位和授时服务,GPS卫星授时成本低.安全可靠.覆盖范围广.GPS同步时钟装置,是指从GPS卫星上获取时间信 ...
- PHP变量存储结构
首先声明,我并没有去读PHP的源码,只是对于PHP的有时候诡异的表现感兴趣,找了一下开发人员laruence的博客结合PHP提供的函数debug_zval_dump刺探得到了本博客所阐述的工作机理.如 ...
- Effective Go中文版(更新中)
原文链接:https://golang.org/doc/effective_go.html Introduction Go是一种新兴的编程语言.虽然它借鉴了现有语言的思想,但它具有不同寻常的特性,使得 ...
- ggplot2(1) 简介
1.1 简介 ggplot2是一个用来绘制统计图形(数据图形)的R软件包,与其他大多数的图形软件包不同,ggplot2是由其背后的一套图形语法所支持的.ggplot2可以绘制出很多美观度的图形,同时能 ...
- Windows下EDK2环境的搭建以及经典的程序设计Print Hello World !-----(Linux下的待后续熟练了再更新)
很久没有更新博客了,之前的博客末尾有提到过要写有关EDK2环境搭建的博客,现在就是完成的时候了,后续博客更新会比较规律(大概每周一篇?) 本人博客仅仅发表于博客园,本人主页为 http ...
- ReentrantReadWriteLock 源码分析以及 AQS 共享锁 (二)
前言 上一篇讲解了 AQS 的独占锁部分(参看:ReentrantLock 源码分析以及 AQS (一)),这一篇将介绍 AQS 的共享锁,以及基于共享锁实现读写锁分离的 ReentrantReadW ...
- 结题报告--hih0CoderP1041
题目:点此 描述 小Hi和小Ho准备国庆期间去A国旅游.A国的城际交通比较有特色:它共有n座城市(编号1-n):城市之间恰好有n-1条公路相连,形成一个树形公路网.小Hi计划从A国首都(1号城市)出发 ...
- js 实现弹性运动的简单应用----导航栏中弹性
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...