NOIP2016 D2T2 蚯蚓
其实是一道不是很难的模拟题,暴力好像可以拿80,AC的话要发现其中隐含的单调性
首先是一个小技巧,每次将所有蚯蚓的长度都+q肯定时间复杂度很大,那我们就想,其他所有的蚯蚓加,就相当于取出的蚯蚓减,再存储一下这是第几秒,输出或切蚯蚓的时候将存储的值加上秒数*q即可
然后就是题目中的单调性。对于两只蚯蚓x1,x2,设x1>x2且两者被切时间相差t,由题意显然x1比x2先被切。
那么我们可以列式算出x1和x2切出的蚯蚓到x2被切完那一秒的长度
x1切成的蚯蚓:[px1]+tq,x1-[px1]+tq(取整符号打不出来用方括号[]代替)
x2切成的蚯蚓:[p(x2+tq)]=[px2+ptq],x2-[p(x2+tq)]=x2-[px2+ptq]
tq>ptq且x1>x2,所以[px1]+tq>[p(x2+tq)]。证后半部分时可先去掉取整符号看,上面是(1-p)x1+tq,下面是(1-p)x2-ptq,因为x1>x2,tq>-ptq,所以上面显然大于下面,加上取整后误差不大于1,所以x1-[px1]+tq>x2-[p(x1+tq)]
这样我们就证明了先被切的蚯蚓切成的蚯蚓长度一定大于后被切的蚯蚓切成的蚯蚓长度(按顺序)
然后我们就可以用三个数组来存放,第一个数组表示原蚯蚓,从大到小排序一遍即可,然后每次切的蚯蚓放在第二个数组和第三个数组,这样每个数组都一定是从大到小的,每次取最大的切就可以了(其实就相当于手写优先队列,只不过插入的元素是有序的而已)
最后再把三个数组中的剩余元素放在一起排序一下即可(不要用STL优先队列!会超时!)
贴个代码:
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
using namespace std;
int chong[][],left[]={,,},right[];//存储三堆蚯蚓及它们的左右位置
int ans[],tot;//存放答案并排序的数组
inline int front(int x)//取第x堆的队首元素
{
if(left[x]>right[x])
return INT_MIN;
else
return chong[x][left[x]];
}
bool comp(int a,int b)
{
return a>b;
}
int main()
{
int n,m,q,u,v,t,base=;//base是当前已进行的累加和
scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
right[]=n;
for(int i=;i<=n;i++)
scanf("%d",&chong[][i]);
sort(chong[]+,chong[]++n,comp);
for(int i=;i<=m;i++)
{
int flag=;//标记哪一堆的蚯蚓最大
int a=front(),b=front(),c=front();
if(c>=b&&c>=a)
flag=;
else if(b>=a&&b>=c)
flag=;
a=chong[flag][left[flag]]+base;//最大蚯蚓实际长度
b=(int)((long long)u*a/(double)v);
c=a-b;
b-=base+q,c-=base+q;//其他的加相当于取出的减
left[flag]++;//取蚯蚓
chong[][++right[]]=b;//放蚯蚓
chong[][++right[]]=c;
if(i%t==)//被t整除时输出长度
printf("%d ",a);
base+=q;//每次加q
}
printf("\n");
for(int i=;i<;i++)//将剩下的蚯蚓排列
for(int j=left[i];j<=right[i];j++)
ans[++tot]=chong[i][j];
sort(ans+,ans++tot,comp);
for(int i=;i<=tot;i++)
if(i%t==)
printf("%d ",ans[i]+base);
printf("\n");
return ;
}
两个注意事项:
1、要做长度标记(每个时刻蚯蚓伸长的总长度,切和输出时都要加上!)
2、判断三者大小关系时一定要用大于等于!且注意关系,比如c最大是c>=a&&c>=b而不是c>=b&&b>=a(第一次就因为这个WA成35分)
3、找三个队列中最大元素不能不判断队列是否为空,因为前面我们用减代替加,会有负数,初始化的元素为0会让我们取到,所以我直接写了一个取队首元素函数,当队列为空的时候就返回负无穷大
NOIP2016 D2T2 蚯蚓的更多相关文章
- NOIP 2016 D2T2 蚯蚓](思维)
NOIP 2016 D2T2 蚯蚓 题目大意 本题中,我们将用符号 \(\lfloor c \rfloor⌊c⌋\) 表示对 \(c\) 向下取整,例如:\(\lfloor 3.0 \rfloor = ...
- UOJ264 【NOIP2016】蚯蚓
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- 【NOIP2016】蚯蚓(队列,单调性)
题目不再重复叙述 请参考: 洛谷 CJOJ 题解 先来说说非完美解法,也是我去年考场上的做法 考虑一下每一只蚯蚓增加的长度, 这个值并不需要每一次依次增加, 用一个变量维护即可,每次取出蚯蚓就加上这个 ...
- 【NOIP2016】蚯蚓(单调队列)
题意: 思路: 我们发现,对于任意两次切割i和j,i<j,在进行完第j次切割后,第i次切割的u/v部分一定大于等于第j次切割的u/v部分,第i次的1-u/v部分也一定大于等于第j次的1-u/v部 ...
- 【NOIP2016】蚯蚓
Description 本题中,我们将用符号 ⌊c⌋表示对 cc 向下取整,例如:⌊3.0⌋=⌊3.1⌋=⌊3.9⌋=3. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀 ...
- $Noip2016/Luogu2827$蚯蚓
$Luogu$ $Sol$ 乍一看就是个模拟叭,用个优先队列维护不就好了.不过这里有一个问题就是怎么解决没被切的蚯蚓的增长问题.可以这样处理,每次切一条蚯蚓,给切完之后的都减去$q$,最后输出答案时都 ...
- 「NOIP2016」蚯蚓
传送门 Luogu 解题思路 很容易想到用一个堆去维护,但是复杂度是 \(O((n+m)\log(n+m))\) 的,显然过不了 \(7e6\). 其实这题有一个性质: 先被切开的蚯蚓,得到的两条新蚯 ...
- LOJ2362. 「NOIP2016」蚯蚓【单调队列】
LINK 思路 良心来说这题还挺思维的 我没看题解也不知道要这样维护 把每次斩断的点分别放进两个队列里面 因为要维护增长,所以可以让新进队的节点来一个负增长? 是不是就好了? 然后很容易发现因为在原始 ...
- 【noip2016】蚯蚓(单调性+队列)
题目贼长 大意是你有n个线段,每一秒你要拿出来最长的一个线段切成两段长度为[p*u](向下取整)和u-[p*u]两段(其中u是线段长,p是一个大于0小于1的实数)没被切的线段长度加q(0<q&l ...
随机推荐
- java hashset输出
for (Map.Entry<String, String> me : id_label_map.entrySet()) { System.out.println(me.getKey() ...
- 杂项-PIN:百科
ylbtech-杂项-PIN:百科 个人身份识别码(英语:Personal identification number,缩写为 PIN),又译为用户个人识别号码,常被称为PIN码(PIN number ...
- RandomAccessFile 文件读写中文乱码解决方案!
RandomAccessFile 读写文件时,不管文件中保存的数据编码格式是什么 使用 RandomAccessFile对象方法的 readLine() 都会将编码格式转换成 ISO-8859-1 ...
- 操作系统汇编语言之AT&T指令
转载时格式有问题,大家看原版吧! 作者:EwenWanW 来源:CSDN 原文:https://blog.csdn.net/xiaoxiaowenqiang/article/details/805 ...
- 第九周课程总结&实验报告7
实验任务详情: 完成火车站售票程序的模拟.要求:(1)总票数1000张:(2)10个窗口同时开始卖票:(3)卖票过程延时1秒钟:(4)不能出现一票多卖或卖出负数号票的情况. 实验代码: package ...
- sql query执行的顺序
第一, from, 选择或者join多个表得到基础数据表,所以,联结是第一步要执行的操作,它在获取最基础的数据表: 第二,where,过滤掉基础数据表中不符合条件的行,得到后续操作的数据表: 第三, ...
- JGit、SvnKit - 版本提交日志(1)提取
1.相关开源jar包 1>使用JGIT访问git项目 2>使用SVNkit访问svn Git官方JGit使用教程指导 2.Git历史提交日志导出到文件 在项目根目录执行如下命令,将日志 ...
- Bootstrap字体图标Font-Awesome 使用教程
转载自:https://blog.csdn.net/crper/article/details/46293295 以备记录使用.
- ccs中a链接的四种状态
什么是超链接? 超链接通俗地指从一个网页指向一个目标的连接关系,这个目标可以是另一个网页,也可以是相同网页上的不同位置,还可以是一个图片,一个电子邮件地址,一个文件,甚至是一个应用程序.而在一个网页中 ...
- 题解 CF292A 【SMSC】
蒟蒻本想发一篇黑题题解,没想到黑题竟然掉紫了QwQ. 趁着题解还只有几篇,赶紧来发一篇嘿嘿嘿. 这道题其实很简单,题解其实都不需要 AC代码: #include<bits/stdc++.h> ...