题意:蛐蛐国里现在共有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. 五个简单的shell脚本

    1.编写shell脚本 ex1.sh,提示用户输入用户名,并判断此用户名是否存在. (提示:利用read.grep和/etc/passwd) #!/bin/bash echo "请输入用户名 ...

  2. "Flex弹性布局"组件:<flex-row><flex-col> —— 快应用组件库H-UI

     <import name="flex-row" src="../Common/ui/h-ui/basic/c_flex_row"></im ...

  3. Struts2-学习笔记系列(14)-拦截器

    6.1对action 的拦截 自定义拦截器: public class MyInterceptor extends AbstractInterceptor { private String name; ...

  4. 《面试经典系列》- SpringMVC原理及工作流程

    前言 SpringMVC 作为 MVC 的开源框架,现在依旧是不少项目使用的重点框架.SpringMVC = Struts2 + Spring,SpringMVC就相当于 Struts2 + Spri ...

  5. 【Canvas】(2)---绘制折线图

    绘制折线图 之前在工作的时候,用过百度的ECharts绘制折线图,上手很简单,这里通过canvas绘制一个简单的折线图.这里将一整个绘制过程分为几个步骤: 1.绘制网格 2.绘制坐标系 3.绘制点 4 ...

  6. Docker安装Redis并介绍漂亮的可视化客户端进行操作

    1 简介 Redis是使用ANSI C语言开发的基于Key-Value的高性能NoSQL数据库,在解决高并发.高可用等一系列问题中,它扮演着重要的角色.它的优势主要有: 速度快. 持久化. 原子性. ...

  7. pytorch cheatsheet

  8. I NEED A OFFER! HDU - 1203

    概率+0 1背包 要算成功的最大概率,那就是失败的最小概率,所以01背包直接让失败的概率最小就行了. 注意: 概率与概率之间是要相乘的,不是相加. #include<bits/stdc++.h& ...

  9. B2 - TV Subscriptions (Hard Version)

    题目连接:https://codeforces.com/contest/1247/problem/B2 题解:双指针,,一个头,一个尾,头部进入,尾部退出,一开始先记录1到k,并记录每个数字出现的次数 ...

  10. 杭电 How far away ?

    There are n houses in the village and some bidirectional roads connecting them. Every day peole alwa ...