刚看到这道题:这题直接用堆+模拟不就可以了(并没有认真算时间复杂度)

于是用priority_queue水到了85分…… (STL大法好)

天真的我还以为是常数问题,于是疯狂卡常……(我是ZZ)

直到我下了组数据,结果它跑了……跑了……10s (这叫我怎么卡常)

OK,闲聊到次结束,接下来说正解


其实这道题并不需要用堆,因为我们可以蚯蚓其实是满足单调性的,因为后切的蚯蚓一定要比先切的短,所以堆是不必要的,我们只用三个队列,分别记录没被切的蚯蚓、被切了的短的蚯蚓、被切了的长的蚯蚓,每次把三个队列的队头取出来比较,切掉最长的,再分别入队。

时间复杂度:\(O(n+m)\)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int read(){
    int k=0,f=1; char c=getchar();
    for(;c<'0'||c>'9';c=getchar())
      if(c=='-') f=-1;
    for(;c>='0'&&c<='9';c=getchar())
      k=(k<<3)+(k<<1)+c-48;
    return k*f;
}
double p;
int qy[100010],cut1[10000010],cut2[10000010];
int h=1,ta,h1=1,t1,h2=1,t2;
bool cmp(int x,int y){
    return x > y;
}
int main(){
    //freopen("hhh.in","r",stdin);
    //freopen("hhh.out","w",stdout);
    int n=read(),m=read(),q=read(),u=read(),v=read(),t=read();
    memset(cut1,-127,sizeof(cut1));
    memset(cut2,-127,sizeof(cut2));
    memset(qy,-127,sizeof(qy));
    p=(double)u/(double)v; ta=n;
    for(int i=1;i<=n;i++) qy[i]=read();
    sort(qy+1,qy+n+1,cmp);
    for(int i=1;i<=m;i++){
        int maxn=-2147483647; bool flag=0;
        if(qy[h]>=cut1[h1]&&qy[h]>=cut2[h2]&&h<=ta){
            maxn=qy[h]+(i-1)*q; h++; flag=1;
            //printf("%d %d\n",h,ta);
        }
        if(cut1[h1]>=cut2[h2]&&cut1[h1]>=qy[h]&&!flag&&h1<=t1){
            maxn=cut1[h1]+(i-1)*q; h1++; flag=1;
            //printf("%d %d\n",h1,t1);
        }
        if(cut2[h2]>=cut1[h1]&&cut2[h2]>=qy[h]&&!flag&&h2<=t2){
            maxn=cut2[h2]+(i-1)*q; h2++; flag=1;
            //printf("%d %d\n",h2,t2);
        }
        //printf("%d %d %d\n",qy[h],cut1[h1],cut2[h2]);
        if(i%t==0) printf("%d ",maxn);
        int k=maxn*p;
        cut1[++t1]=k-i*q; cut2[++t2]=maxn-k-i*q;
    }
    printf("\n");
    for(int i=1;i<=n+m;i++){
        int maxn=-2147483647; bool flag=0;
        if(qy[h]>=cut1[h1]&&qy[h]>=cut2[h2]&&h<=ta){
            maxn=qy[h]+m*q; h++; flag=1;
        }
        if(cut1[h1]>=cut2[h2]&&cut1[h1]>=qy[h]&&!flag&&h1<=t1){
            maxn=cut1[h1]+m*q; h1++; flag=1;
        }
        if(cut2[h2]>=cut1[h1]&&cut2[h2]>=qy[h]&&!flag&&h2<=t2){
            maxn=cut2[h2]+m*q; h2++; flag=1;
        }
        if(i%t==0)
          printf("%d ",maxn);
    }
    return 0;
}

Noip2016 提高组 蚯蚓的更多相关文章

  1. [NOIp2016提高组]蚯蚓

    题目大意: 给你n个不同长度蚯蚓,每秒从里面取出最长的砍下u/v变成两只,又把剩下的加长q. 问你在m之前的t,2t,3t...的时间上,砍的蚯蚓长度, 以及m秒后剩下所有的蚯蚓长度. 思路: 很容易 ...

  2. Luogu P2827 [NOIp2016提高组]蚯蚓 | 神奇的队列

    题目链接 80分思路: 弄一个优先队列,不停地模拟,切蚯蚓时就将最长的那一条出队,然后一分为二入队,简单模拟即可.还要弄一个标记,表示从开始到当前时间每一条蚯蚓应该加上的长度,操作时就加上,入队时就减 ...

  3. 洛谷P2827 [NOIP2016 提高组] 蚯蚓 (二叉堆/队列)

    容易想到的是用二叉堆来解决,切断一条蚯蚓,其他的都要加上一个值,不妨用一个表示偏移量的delta. 1.取出最大的x,x+=delta: 2.算出切断后的两个新长度,都减去delta和q: 3.del ...

  4. 【题解】NOIP2016提高组 复赛

    [题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ...

  5. 【题解】NOIP2016 提高组 简要题解

    [题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...

  6. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  7. [日记&做题记录]-Noip2016提高组复赛 倒数十天

    写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...

  8. 【NOIP2016提高组day2】蚯蚓

    那么我们开三个不上升队列, 第一个记录原来的蚯蚓, 第二个记录乘以p的蚯蚓 第三个记录乘以(1-p)的蚯蚓, 在记录每条就要入队列的时间,就可以求出增加的长度 每次比较三个队列的队首,取最大的值x的切 ...

  9. 【NOIP2016提高组】 Day2 T2 蚯蚓

    题目传送门:https://www.luogu.org/problemnew/show/P2827 自测时被题面所误导...,题面中说逢t的倍数才输出答案,以为有什么玄妙的方法直接将m次操作变成了m/ ...

随机推荐

  1. Java 虚拟机(Java Virtual Machine)

    Java 编译器将 Java 程序编译成虚拟机能够识别的二进制代码,这种代码称为字节码(Bytecode).字节码就是虚拟机的机器指令,它与平台无关,有统一的格式,不依赖于具体的硬件环境,只运行在 J ...

  2. 【OpenJ_Bailian - 4137】最小新整数 (贪心)

    最小新整数 Descriptions: 给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0.n的位数为m.现在从m位中删除k位(0<k < ...

  3. C 语言实例 - 字符串中各种字符计算

    C 语言实例 - 字符串中各种字符计算 C 语言实例 C 语言实例 计算字符串中的元音.辅音.数字.空白符. 实例 #include <stdio.h> int main() { ]; i ...

  4. C笔记列表

    笔记列表 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明. 要理解指针就要先理解计算机的内存.计算机内存会被 ...

  5. 使用MethodSwizzle导致按home app进入后台或者app间切换发生crash的解决方法

    参考文章: 1.http://blog.csdn.net/alincexiaohao/article/details/45913857 2.http://www.cocoachina.com/ios/ ...

  6. PAT甲级——1130 Infix Expression (25 分)

    1130 Infix Expression (25 分)(找规律.中序遍历) 我是先在CSDN上面发表的这篇文章https://blog.csdn.net/weixin_44385565/articl ...

  7. HDU-1556:Color the ball(前缀和)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  8. Python开发 第01课 Python 简介

    一.Python 介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...

  9. js操作表格

    js 操作table: insertRow(),deleteRow(),insertCell(),deleteCell()方法 表格有几行: var trCnt = table.rows.length ...

  10. arcgis jsapi接口入门系列(3):各种类型的图层添加

    这里说的tomcat切片,是指arcgis server切片后,把切片图片文件用tomcat发布(其他任意web服务器发布都行) //添加tomcat切片图层 addTomcatTileLayer: ...