题意:蛐蛐国里现在共有n只蚯蚓(n为正整数)。每只蚯蚓拥有长度,我们设第i只蚯蚓的长度为a_i(i=1,2,...,n),并保证所有的长度都是非负整数(即:可

能存在长度为0的蚯蚓)。每一秒,神刀手会在所有的蚯蚓中,准确地找到最长的那一只(如有多个则任选一个)
将其切成两半。神刀手切开蚯蚓的位置由常数p(是满足0<p<1的有理数)决定,设这只蚯蚓长度为x,神刀手会将其
切成两只长度分别为[px]和x-[px]的蚯蚓。特殊地,如果这两个数的其中一个等于0,则这个长度为0的蚯蚓也会被
保留。此外,除了刚刚产生的两只新蚯蚓,其余蚯蚓的长度都会增加q(是一个非负整常数)。蛐蛐国王知道这样不
是长久之计,因为蚯蚓不仅会越来越多,还会越来越长。蛐蛐国王决定求助于一位有着洪荒之力的神秘人物,但是
救兵还需要m秒才能到来......(m为非负整数)蛐蛐国王希望知道这m秒内的战况。具体来说,他希望知道:?m秒内
,每一秒被切断的蚯蚓被切断前的长度(有m个数)?m秒后,所有蚯蚓的长度(有n+m个数)。
第一行包含六个整数n,m,q,u,v,t,其中:n,m,q的意义见问题描述;
u,v,t均为正整数;你需要自己计算p=u/v(保证0<u<v)t是输出参数,其含义将会在输出格式中解释。
第二行包含n个非负整数,为ai,a2,...,an,即初始时n只蚯蚓的长度。
同一行中相邻的两个数之间,恰好用一个空格隔开。
保证1<=n<=10^5,0<m<7*10^6,0<u<v<10^9,0<=q<=200,1<t<71,0<ai<10^8。
分析:一看到这个题很容易想到优先队列来维护,但再一看数据范围mlgm的复杂度很难接受,那么就可以考虑利用已有的单调性减少用优先队列维护的次数,相当于根据题目的数据优化优先队列,甚至不用优先队列
首先考虑两个蚯蚓x,y,令x>y
则x要比y先被切,假设x是第tx秒被切,y是第ty秒被切,显然tx<ty
那么x在切之前长度就应该是x0+(tx-1)*q,而切之后会变成两段,一段为[xp],另一段位x-[xp]
当然y也同理
在切之前长度是y0+(ty-1)*q,切后两段是[yp]和y-[yp]
再设一个时间t表示两蚯蚓都被切后的某个时间
那么x那两段的长度就应该是[xp]+(t-tx)*q,(x-[xp])+(t-tx)*q
y那两段的长度就应该是[yp]+(t-ty)*q,(y-[yp])+(t-ty)*q
这里很容易发现[xp]>[yp],(t-tx)*q>(t-ty)*q,(x-[xp])>(y-yp),
也就是说x被切成的两段永远大于y被切成的两段
所以对于被这两段中的每一段都满足先来的大于后来的,所以可以用队列维护,新入队的就是最小的,先入队的就是最大的
所以要开两个队列,维护这两种被切割的段,因为最大的永远在队首,所以只需要将原蚯蚓中最大的与这两个队列的队首找个最大的就可以确定当前选出要被切割的蚯蚓,切完后再push到这两个队列里即可
当然,在原蚯蚓中找最大也可以sort一下,写个指针指向最大值就行了
这里虽然看似优化到了O(n)但是常数还是卡的稍微有点死,这里有一些优化的方法 以及加速的多少(1-5:少-多)
1.快读   |3|(这里输入个数较少(1e5))
int read()
{
char ch=getchar();int ans=;
while(ch>''||ch<'') ch=getchar();
while(ch<=''&&ch>='')
{
ans=(ans<<)+(ans<<)+ch-'';
ch=getchar();
}
return ans;
}
2.快输   |4|(这里输出个数较多(1e7))
void write(int x)
{
if(x>) write(x/);
putchar(x%+'');
}
3.i++改为++i     |1|
for(int i=;i<=m;++i)
4.stl改为手写队列   |3|
for(int i=;i<=a_cnt;++i) d[++d_cnt]=a[i]+sum;
for(int i=b_str;i<=b_end;++i) d[++d_cnt]=b[i].val+sum-b[i].tim;
for(int i=c_str;i<=c_end;++i) d[++d_cnt]=c[i].val+sum-c[i].tim;
5.将相同的运算开变量先存结果,比如+q*m要算多次,就开qm=q*m然后后面都用qm代替q*m     |5|(这里真的加快很多,因为类似的乘法运算估计要被优化5e7次以上)
int sum=q*(i-);
int nowa=((!a_cnt)?-:(a[a_cnt]+sum));
int nowb=((b_str>b_end)?-:(b[b_str].val+sum-b[b_str].tim));
int nowc=((c_str>c_end)?-:(c[c_str].val+sum-c[c_str].tim));
6.在写代码的时候尽量将数据利用到最大化,比如某些地方交换运算顺序能将同样的运算简化    |2|

sum+=q;
b[++b_end].val=now*p,b[b_end].tim=sum;
c[++c_end].val=now-b[b_end].val;c[c_end].tim=sum;
 
……
大概优化就分为 思路上的优化,代码上的优化以及细节上的优化,显然在我们思路优化已经到顶的时候某些代码上的优化能使运行速度快不少(快读,快输,手写队列,变量存结果)
代码:

#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std; #define ll long long const int maxn=1e7+; struct Node
{
int tim,val;
}b[maxn],c[maxn];
int a[maxn],d[maxn]; int read()
{
char ch=getchar();int ans=;
while(ch>''||ch<'') ch=getchar();
while(ch<=''&&ch>='')
{
ans=(ans<<)+(ans<<)+ch-'';
ch=getchar();
}
return ans;
} void write(int x)
{
if(x>) write(x/);
putchar(x%+'');
} int main()
{
int u,v,n,m,t,q,a_cnt,b_str,b_end,c_str,c_end,d_cnt;
double p;
n=read(),m=read(),q=read(),u=read(),v=read(),t=read();
p=(double)u/v;
for(int i=;i<=n;++i) a[i]=read();
sort(a+,a+n+);
a_cnt=n,b_end=c_end=d_cnt=,b_str=c_str=;
for(int i=;i<=m;++i)
{
int now,sum=q*(i-);
int nowa=((!a_cnt)?-:(a[a_cnt]+sum));
int nowb=((b_str>b_end)?-:(b[b_str].val+sum-b[b_str].tim));
int nowc=((c_str>c_end)?-:(c[c_str].val+sum-c[c_str].tim));
if(nowa>=nowb&&nowa>=nowc) now=nowa,--a_cnt;
else if(nowb>=nowc&&nowb>=nowa) now=nowb,++b_str;
else now=nowc,++c_str;
sum+=q;
b[++b_end].val=now*p,b[b_end].tim=sum;
c[++c_end].val=now-b[b_end].val;c[c_end].tim=sum;
if(i%t==) write(now),putchar(' ');
}
putchar('\n');
int sum=q*m;
for(int i=;i<=a_cnt;++i) d[++d_cnt]=a[i]+sum;
for(int i=b_str;i<=b_end;++i) d[++d_cnt]=b[i].val+sum-b[i].tim;
for(int i=c_str;i<=c_end;++i) d[++d_cnt]=c[i].val+sum-c[i].tim;
sort(d+,d+d_cnt+);
for(int i=d_cnt+-t;i>=;i-=t) write(d[i]),putchar(' ');
putchar('\n');
return ;
}
 

题目分享T的更多相关文章

  1. 2019年腾讯PHP程序员面试题目分享

    有需要学习交流的友人请加入交流群的咱们一起,有问题一起交流,一起进步!前提是你是学技术的.感谢阅读! 点此加入该群​jq.qq.com 1. php 的垃圾回收机制 PHP 可以自动进行内存管理,清除 ...

  2. 20190924-LeetCode解数独题目分享

    解决数独 题目描述 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以 ...

  3. 题目分享E 二代目

    题意:一棵点数为n的树,每个节点有点权,要求在树中中找到一个最小的x,使得存在一个点满足max(该点点权,该点相邻的点的点权+1,其他点的点权+2)=x 分析:首先要能把题目转化为上述题意 首先题目让 ...

  4. 题目分享D 二代目

    题意:给定一个T条边的无向图,求S到E恰好经过N条边的最短路径 T≤100 N≤1000000 分析:(据说好像假期学长讲过) 首先很容易想到的是dp[i][j][k]表示从i到j经过k条边的最短路径 ...

  5. 题目分享C 二代目

    题意:一个数列是由 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6.....组成,也就是1-1,1-2,1-3......并且如果遇到多位数也要拆成数字比如1-10 ...

  6. 题目分享X

    题意:一张票有n位数,如果这张票的前一半数字的和等于后一半数字的和(n一定是偶数),就称这张票为快乐票.有些数被擦除了,标记为’?’(’?‘的个数也是偶数),现在Monocarp 和 Bicarp 进 ...

  7. 题目分享V

    题意:现在两个人做游戏,每个人刚开始都是数字1,谁赢了就能乘以k^2,输的乘以k(k可以是任意整数,每次不一定相同)现在给你最终这两个人的得分,让你判断是否有这个可能,有可能的话Yes,否则No. 分 ...

  8. 题目分享P

    题意: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根.接下来从女生开始,双方轮流进行 操作.当一方操作时,他们需要先选择一个不为根的 ...

  9. 题目分享H 二代目

    题意:有m个限制,每个限制l1,r1,l2,r2四个数,限制了一个长度为n的数第l1到r1位要与第l2到r2相同,保证r1-l1=r2-l2,求在限制下一共有多少种数 分析: 暴力的话肯定是从l1-r ...

随机推荐

  1. 第一天总结(while计数器+成绩大小+获取时间+猜拳大小)

    #*_* coding:utf-8 *_*# while 先有一个计数器 input = 0# input = input('输入数字')while input < 5: input= inpu ...

  2. C#多线程系列(2):多线程锁lock和Monitor

    1,Lock lock 原型 lock 编写实例 2,Monitor 怎么用呢 解释一下 示例 设置获取锁的时效 C# 中,可以使用 lock 关键字和 Monitor 类来解决多线程锁定资源和死锁的 ...

  3. Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析

    Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析 本文简要介绍了基于 Spring 的 web project 的启动流程,详细分析了 Spring 框架将开发人员基于 XML ...

  4. java的套接字实现远程连接

    package jnet;//客户端程序,使用套接字连接服务器import java.net.*;import java.io.*;import javax.swing.*; public class ...

  5. Daily Scrum 12/17/2015

    Process: Zhaoyang:完成了相册图片的异步加载. Yandong&Dong:   对Azure的体系架构进行学习和相应的编程. Fuchen:   对Oxford计划中的NLP接 ...

  6. PHP修改脚本最大执行时间和最大内存限制

    PHP设置脚本最大执行时间的三种方法 1.在php.ini里面设置 max_execution_time = 120; 2.通过PHP的ini_set函数设置 ini_set("max_ex ...

  7. Liunx常用操作(一)-删除命令

    在linux命令行模式下,如何一次性快速删除一行刚刚输入的命令? 经常在命令行输入命令的时候,一段文字都需要删除,一个字段一个字段,比较耗费时间 以下提供一些命令,配合在一起操作,可以一定程度提高工作 ...

  8. Java 多线程 -- lambda 表达式推导

    jdk 8 开始 java 引入了lambda 表达式. lambda适用场景: 1.接口或父类 2.接口或父类只有一个方法 我们从多线程写法来推导一下: 1.外部类写法: package com.x ...

  9. Nginx知多少系列之(十四)Linux下.NET Core项目Nginx+Keepalived高可用(主从模式)

    目录 1.前言 2.安装 3.配置文件详解 4.工作原理 5.Linux下托管.NET Core项目 6.Linux下.NET Core项目负载均衡 7.负载均衡策略 8.加权轮询(round rob ...

  10. jquery选择时分插件

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...