传送门

pts85/90(90应该是个意外,第一次交是90之后都是85了):

优先队列模拟题意

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int n,m,q,u,v,t,tim;
double p;
priority_queue<int>qq;
int main()
{
scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
p=1.0*u/(1.0*v);
for(int i=,x;i<=n;i++){
scanf("%d",&x);
qq.push(x);
}
while(m--){
tim++;
int x=qq.top();
qq.pop();
if(tim%t==)printf("%d ",x+(tim-)*q);
int y=(int)(p*(double)(x+(tim-)*q));
x=(x+(tim-)*q)-y;
qq.push(x-tim*q),qq.push(y-tim*q);
}
printf("\n");
int now=;
while(qq.size()){
now++;
if(now%t==){
printf("%d ",qq.top()+tim*q);
}
qq.pop();
}
return ;
}

优先队列

顺手练一下手写二叉堆

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,q,u,v,t,tim,a[*],num;
double p;
bool cmp(int x,int y){
return x>y;
}
int main()
{
scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
p=1.0*u/(1.0*v);
for(int i=,x;i<=n;i++){
scanf("%d",&a[i]);
x=i;
while(x>&&a[x]>a[x>>]){
swap(a[x],a[x>>]);
x>>=;
}
}
while(m--){
tim++;
int x=a[];
if(tim%t==)printf("%d ",x+(tim-)*q);
int y=(int)(p*(double)(x+(tim-)*q));
x=(x+(tim-)*q)-y;
a[]=x-tim*q;
int now=;
while((a[now]<a[now<<]||a[now]<a[now<<|])&&(now<<|)<=n){
if(a[now<<]<a[now<<|]){
swap(a[now],a[now<<|]);
now<<=;
now|=;
}
else{
swap(a[now],a[now<<]);
now<<=;
}
}
if(a[now]<a[now<<]&&(now<<)<=n){
swap(a[now],a[now<<]);
}
a[++n]=y-tim*q;
now=n;
while(now>&&a[now]>a[now>>]){
swap(a[now],a[now>>]);
now>>=;
}
}
printf("\n");
sort(a+,a+n+,cmp);
for(int i=;i<=n;i++){
if(i%t==){
printf("%d ",a[i]+tim*q);
}
}
return ;
}

手写二叉堆

正解:

发现先切的蚯蚓产生的长段永远不小于后切的蚯蚓产生的长段,短段也是。因为从准备切先切的开始,后切的生长t个单位长度的同时,先前切好的两段都生长了t-1个单位长度。

切好的长段集合和短段集合本身就具有单调性。

用三个队列分别储存未切的,切好的长段,切好的短段,每次从三个队头寻找最大的进行操作。

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
int n,m,q,u,v,t,tim,maxx,pos,a[*],inf=;
double p;
queue<int>qq[];
bool cmp(int x,int y){
return x>y;
}
int main()
{
scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
p=1.0*u/(1.0*v);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+,a+n+);
for(int i=n;i>=;i--)qq[].push(a[i]);
while(m--){
tim++;
maxx=pos=-inf;
if(qq[].front()>maxx&&qq[].size())maxx=qq[].front(),pos=;
if(qq[].front()>maxx&&qq[].size())maxx=qq[].front(),pos=;
if(qq[].front()>maxx&&qq[].size())maxx=qq[].front(),pos=;
qq[pos].pop();
if(tim%t==)printf("%d ",maxx+(tim-)*q);
int y=(int)(p*(double)(maxx+(tim-)*q));
maxx=(maxx+(tim-)*q)-y;
qq[].push(max(maxx,y)-tim*q),qq[].push(min(maxx,y)-tim*q);
}
printf("\n");
n=;
while(qq[].size()){
a[++n]=qq[].front();
qq[].pop();
}
while(qq[].size()){
a[++n]=qq[].front();
qq[].pop();
}
while(qq[].size()){
a[++n]=qq[].front();
qq[].pop();
}
sort(a+,a+n+,cmp);
for(int i=;i<=n;i++){
if(i%t==){
printf("%d ",a[i]+tim*q);
}
}
return ;
}

洛谷P2827 蚯蚓的更多相关文章

  1. 洛谷P2827 蚯蚓 题解

    洛谷P2827 蚯蚓 题解 题目描述 本题中,我们将用符号 ⌊c⌋ 表示对 c 向下取整. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现 ...

  2. NOIP 2016 洛谷 P2827 蚯蚓 题解

    题目传送门 展开 题目描述 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手 ...

  3. 洛谷 P2827 蚯蚓 解题报告

    P2827 蚯蚓 题目描述 本题中,我们将用符号 \(\lfloor c \rfloor\) 表示对 \(c\) 向下取整,例如:\(\lfloor 3.0 \rfloor = \lfloor 3.1 ...

  4. 洛谷——P2827 蚯蚓

    P2827 蚯蚓 题目描述 本题中,我们将用符号 \lfloor c \rfloor⌊c⌋ 表示对 cc 向下取整,例如:\lfloor 3.0 \rfloor = \lfloor 3.1 \rflo ...

  5. 洛谷P2827 蚯蚓——思路题

    题目:https://www.luogu.org/problemnew/show/P2827 思路... 用优先队列模拟做的话,时间主要消耗在每次的排序上: 能不能不要每次排序呢? 关注先后被砍的两条 ...

  6. 洛谷 P2827 蚯蚓

    题目描述 本题中,我们将用符号\lfloor c \rfloor⌊c⌋表示对c向下取整,例如:\lfloor 3.0 \rfloor= \lfloor 3.1 \rfloor=\lfloor 3.9 ...

  7. 洛谷P2827 蚯蚓(单调队列)

    题意 初始时有$n$个蚯蚓,每个长度为$a[i]$ 有$m$个时间,每个时间点找出长度最大的蚯蚓,把它切成两段,分别为$a[i] * p$和$a[i] - a[i] * p$,除这两段外其他的长度都加 ...

  8. 洛谷p2827蚯蚓题解

    题目 算法标签里的算法什么的都不会啊 什么二叉堆?? qbxt出去学习的时候讲的,一段时间之前做的,现在才写到博客上的 维护3个队列,队列1表示最开始的蚯蚓,队列2表示每一次被切的蚯蚓被分开的较长的那 ...

  9. 洛谷 P2827 蚯蚓 题解

    每日一题 day32 打卡 Analysis 我们可以想一下,对于每一秒除了被切的哪一个所有的蚯蚓都增长Q米,我们来维护3个队列,队列1表示最开始的蚯蚓,队列2表示每一次被切的蚯蚓被分开的较长的那一部 ...

  10. 洛谷P2827蚯蚓

    题目 堆+模拟,还有一个小优化(优化后跟堆关系不大,而是类似于贪心). 如果不加优化的话,卡常可以卡到85. 思路是对于对每一秒进行模拟,用堆来维护动态的最大值,然后对于每个长度都加q的情况可以用一个 ...

随机推荐

  1. ie9 jscript7 内存不足 页面无响应

    花了我差不多一天时间 我是加载一个datagrid ,多表联查,查询几遍(不一定,又是1遍就死了)后 就卡死了...后台日志都是过的.... 后来我发现数据库某个表的数据很多有一模一样的两条,把一份删 ...

  2. Java工具之NotePad++使用技巧

    按住Alt键 拖动鼠标左键 批量添加 如,等 批量添加逗号, 下面, 竖排 变 横排 ctrl + f 使用正则表达式 \r\n 替换换行符 使用:sql语句中的 过滤条件 in中,往往适合范围查找 ...

  3. mac nginx php php-fpm

    #the php-fpm config and cammand... cp /private/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf ...

  4. Linux-c对一个十六进制数的某一位取反

    enum SWITCH_FLAG { SWITCH_ALL_FLAG = , SWITCH_WEB_FLAG = , …… } unsigned int switch_by_bit_value = 0 ...

  5. 2016.10.7初中部上午NOIP普及组比赛总结

    2016.10.7初中部上午NOIP普及组比赛总结 这次的题还可以,重新入了比赛的前十. 进度: 比赛:90+10+70+30=200 改题:AC+AC+AC+AC=AK 找试场 这题很简单,但是被欺 ...

  6. C++模拟实现Objective-C动态类型(附源码)

    在OC(Objective-C)里面有动态类型分为以下几类: -(BOOL)isKindOfClass:classObj 是否是classObj类或其子类 -(BOOL)isMemberOfClass ...

  7. LUOGU P2949 [USACO09OPEN]工作调度Work Scheduling (贪心)

    解题思路 明明一道比较简单的贪心结果挂了好几次23333,就是按照时间排序,然后拿一个小根堆维护放进去的,如果时间允许就入队并且记录答案.如果不允许就从堆里拿一个最小的比较. #include< ...

  8. angularjs中使用swiper时不起作用,最后出现空白位

    controller.js中定义swipers指令: var moduleCtrl = angular.module('newscontroller',['infinite-scroll','ngTo ...

  9. Python import用法以及与from...import的区别

    Python import用法以及与from...import的区别 在python用import或者from...import来导入相应的模块.模块其实就是一些函数和类的集合文件,它能实现一些相应的 ...

  10. codeforces 1195D2-Submarine in the Rybinsk Sea

    传送门:QAQQAQ 题意:自己看 思路:就是一个类似于数位DP的东西... 统计a[i]数位分解的数在每一位出现的个数,即分两种讨论: 1.位数小于当前j,则j会出现在q+i,而且计算顺序互换会计算 ...