题意:蛐蛐国里现在共有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. JAVA中使用Date和SimpleDateFromat类表示时间

    转自:https://www.imooc.com/code/2335 仅做个人学习保存之用,侵删! 在程序开发中,经常需要处理日期和时间的相关数据,此时我们可以使用 java.util 包中的 Dat ...

  2. "字母全变小写"组件:<lowercase> —— 快应用组件库H-UI

     <import name="lowercase" src="../Common/ui/h-ui/text/c_text_lowercase">& ...

  3. string 从下标0 一直截到倒数第三位

    StringUtils.substring(String.valueOf(maxSequence), 0, -3)如上,关键就是那个-3,表示倒数第三位.

  4. AJ学IOS(50)多线程网络之GCD简单介绍(任务,队列)

    AJ分享,必须精品 GCD简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果 ...

  5. 跳转语句break与continue的使用环境

    break:改变程序控制流 常用于do-while.while.for .switch循环中,终止某个循环,程序跳转到循环块外的下一条语句 continue:跳出本次循环,进入下一次循环

  6. 弱智破解法——用python破解WIFI

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:李嘉图 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自 ...

  7. 食物链 POJ - 1182 (并查集的两种写法)

    这是一个非常经典的带权并查集,有两种写法. 1 边权并查集 规定一下,当x和y这条边的权值为0时,表示x和y是同类,当为1时,表示x吃y,当为2时,表示x被y吃. 一共有三种状态,如图,当A吃B,B吃 ...

  8. C - Sigma Function LightOJ - 1336 (数论)

    一个让人脑洞大开的题. 题目大意比较简单,询问[1,n]有多少个数其因子和为偶数. 因子分解定理中求因子和的公式是 f(n)=(1+p1+p1^2+p1^3+...+p1^a1)(1+p2+p2^2+ ...

  9. vue2.x学习笔记(四)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12563162.html. 模板语法 vue使用了基于html的模板语法,允许开发者声明式地将dom绑定到底层vue ...

  10. 资料整理:python接口类

    1开发原则(七大原则) 一:开放封闭原则 二:接口隔离原则(将不同接口对象一一展现出来,分别调用各自的接口,完成各自的功能) 三:依赖倒置原则 高级模块不能依赖低级模块,可以依赖抽象 规范的定义: 高 ...