本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

Description

本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3。蛐蛐国最近蚯蚓成灾了!隔壁跳
蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓。蛐蛐国里现在共有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个数)。蛐蛐国王当然知道怎
么做啦!但是他想考考你......
 

Input

第一行包含六个整数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。
 

Output

第一行输出[m/t]个整数,按时间顺序,依次输出第t秒,第2t秒,第3t秒……被切断蚯蚓(在被切断前)的长度。
第二行输出[(n+m)/t]个整数,输出m秒后蚯蚓的长度;需要按从大到小的顺序
依次输出排名第t,第2t,第3t……的长度。
同一行中相邻的两个数之间,恰好用一个空格隔开。即使某一行没有任何数需要 输出,你也应输出一个空行。
请阅读样例来更好地理解这个格式。
 

Sample Input

3 7 1 1 3 1
3 3 2

Sample Output

3 4 4 4 5 5 6
6 6 6 5 5 4 4 3 2 2
 
 
 
正解:单调队列
解题报告:
 
60分

考虑每次取出一个最大值这个操作,堆来维护比较方便,但是每次加上一个q似乎不好处理。我们考虑增加一个全局变量tag,表示每个数都需要加上tag,这样就可以避免对于堆中所有元素增加,而只需把每次新的两个元素减去q,再放入堆中即可。具体做法:系统堆维护,每次取出最大元素,然后加上tag,得到真实值,算出两个新元素值,tag加上q,两个新元素值减去tag,丢入堆中。

65分

系统堆常数太大了,加上CCF的评测机的速度有限,30w的点刚好被卡T。换成手写堆即可通过第18个测试点。

90分

注意到q=0同样有很多的部分分,如果我们能解决掉q=0的情况,再加上上述算法,即可获得90分。

首先q=0表示每次没有自增操作,很容易发现其实所有的元素都是在单调下降(或者说不增)的,也就是说每次取出来的最大元素肯定是不增的,这就说明切掉之后分成的两个新元素,一定比之前任何一次切掉之后的新元素要小。

这启示我们,似乎在q=0的时候具有单调性。我们维护三个队列q1、q2、q3。初始时q1是从大到小排列的n个数,q2,q3为空。每次操作,取出三个队列的队首元素中最大的那个,设为x,把px丢到q1中,x-px丢到q2中。根据我们上面所说的,我们可以保证任何时候取出来的都是不增的,所以我们可以保证这三个队列在任何时候都是单调不增的。这样就可以通过90%的测试点了。

100分

通过对于q=0时单调性的研究,我们可以发现其实q≠0的时候同样具备单调性。

我们对于q≠0的时候,假设不满足单调性,即存在之前的某次分割的为a,中间间隔了N轮之后,这次分割的元素在a分割时它为b,则此时为b+N*q,并且b切出来的部分比之前a切出来的要长。假设上述情况存在,则说明满足:

  $${a*p+N*q<(b+N*q)*p(只考虑乘以p的部分)}$$

  因为a>=b,而右边展开之后就变成了$${b*p+N*q*p}$$因为p<1,而a>=b,显然上式不成立。可以通过反证法说明这一点。

  从单调性的角度也可以证明算法的正确性:因为我们每次取出一个元素x,分成两部分,然后把整体加上q,再把这两个新元素-q。是不是意味着在队列中保存的元素的值仍然是单调递减的(因为没有任何加法操作,只会因为被分成两半而变小)?也就是说,不管怎么变,这个全局的增量tag是不会影响相对大小的,因为tag的针对对象是全体元素,所以如果在减掉tag的情况下满足的大小关系加上tag后显然满足,因为同时加上一个数,相对大小并不会改变。所以我们可以发现,在q≠0的时候,队列中的元素同样满足单调性,套用上述算法即可获得满分。

注意事项

  由于题目中不是直接给出的p,而是通过给出分子分母要求我们自己计算p,来降低精度误差。在乘的时候需要开一个long long的临时变量,除完之后再转成int就可以了。其余的均可只开int。

 
 
 
 //It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <string>
using namespace std;
typedef long long LL;
const int MAXN = ;
const LL inf = (1LL<<);
int n,m,q,t,tag,Q[][MAXN],head[],tail[];
LL u,v; inline int getint(){
int w=,q=; char c=getchar(); while((c<''||c>'') && c!='-') c=getchar();
if(c=='-') q=,c=getchar(); while (c>=''&&c<='') w=w*+c-'',c=getchar(); return q?-w:w;
}
inline bool cmp(int q,int qq){return q>qq;}
inline void work(){
n=getint(); m=getint(); q=getint(); u=getint(); v=getint(); t=getint(); int ljh1,ljh2,from; LL now; int out=;
for(int i=;i<=n;i++) Q[][i]=getint(); sort(Q[]+,Q[]+n+,cmp); tag=; head[]=head[]=head[]=; tail[]=n; tail[]=tail[]=;
for(int i=;i<=m;i++) {
now=-inf; from=-; for(int j=;j<;j++) if(head[j]<=tail[j]) { if(Q[j][head[j]]>now) { now=Q[j][head[j]]; from=j; } }
now+=tag; out++; if(out==t) { printf("%lld ",now); out=; }
ljh1=now*u/v; ljh2=now-ljh1; head[from]++; tag+=q;
ljh1-=tag; ljh2-=tag;
Q[][++tail[]]=ljh1; Q[][++tail[]]=ljh2;
}
printf("\n"); m+=n; out=;
for(int i=;i<=m;i++) {
now=-inf; from=-; for(int j=;j<;j++) if(head[j]<=tail[j]) { if(Q[j][head[j]]>now) { now=Q[j][head[j]]; from=j; } }
now+=tag; out++; if(out==t) { printf("%lld ",now); out=; }
head[from]++;
}
} int main()
{
work();
return ;
}

UOJ264 【NOIP2016】蚯蚓的更多相关文章

  1. [Noip2016]蚯蚓 D2 T2 队列

    [Noip2016]蚯蚓 D2 T2 Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯 ...

  2. 【BZOJ】4721: [Noip2016]蚯蚓 / 【洛谷】P2827 蚯蚓(单调队列)

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

  3. NC16430 [NOIP2016]蚯蚓

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

  4. 【uoj264】 NOIP2016—蚯蚓

    http://uoj.ac/problem/264 (题目链接) 题意 n条蚯蚓,时间为m.每单位时间要可以将最长的蚯蚓切成len/2和len-len/2两份,长度为0的蚯蚓不会消失,因为每单位时间所 ...

  5. 【bzoj4721】[Noip2016]蚯蚓

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

  6. BZOJ4721 [Noip2016]蚯蚓

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  7. [NOIp2016] 蚯蚓

    类型:单调队列 传送门:>Here< 题意:有$N$只蚯蚓,每秒都会伸长$q$.每一次都会有人选出最长的一条切成两半,长度分别是$\left \lfloor px \right \rflo ...

  8. luogu2827 [NOIp2016]蚯蚓 (模拟)

    可以直观地想到用优先队列来做,但数据范围是O(n)的 然后我们发现,因为我们每次挑出来的蚯蚓是单调的,所以把每个切成两段后,那两段也是对应单调的 也就是说,算上最一开始的蚯蚓,我们一共维护三个队列,三 ...

  9. [NOIp2016]蚯蚓 (队列)

    #\(\color{red}{\mathcal{Description}}\) LInk 这道题是个\(zz\)题 #\(\color{red}{\mathcal{Solution}}\) 我们考虑如 ...

  10. 【bzoj4721】[Noip2016]蚯蚓 乱搞

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

随机推荐

  1. EntityFramework 启用迁移 Enable-Migrations 报异常 "No context type was found in the assembly"

    转自:http://www.cnblogs.com/stevenhqq/archive/2013/04/18/3028350.html 以前做项目的时候,没有采用分类库的形式,所以迁移一致非常顺利,没 ...

  2. 代码滑动panorama-即程序中设置SelectedIndex

    我们都知道panorama的SelectedIndex属性是只读的,所以通过修改它,在程序滑动panorama似乎不可能.那么是不是就没有办法了呢?其实我们可以通过设置SelectedItemProp ...

  3. 完全背包变型题(hdu5410)

    这是2015年最后一场多校的dp题,当时只怪自己基础太差,想了1个多小时才想出来,哎,9月份好好巩固基础,为区域赛做准备.题目传送门 题目的意思是给你n元钱,m类糖果,每类糖果分别有p, a, b, ...

  4. 让 HTML5 来为你定位

    Geolocation HTML5 的 geolocation 是一个令人兴奋的 API,通过这套 API,Javascript 代码就能够访问到用户的当前位置.当然,访问之前必须得到用户的明确认可, ...

  5. des解密不完整,前面几位是乱码的解决办法

    在工作中遇到的Des解密问题,第三方发来的数据需要我们进行des解密,但是解密的结果前几位始终是乱码.废了半天劲,终于找到了问题所在. 下面先介绍一下des,了解des的同学可以直接看下面的解决办法. ...

  6. 为Visual Studio更换皮肤和背景图

    最近在博客上别人在老早之前就有加了背景图,想想怎么能这么out,于是乎,百度一下,能否知道? 咳咳,资源还是有滴!可惜都是比较旧的跟新版本的配置方法可能有点不一样, 可能会有很多人会觉得不适应,不过没 ...

  7. [bzoj2286][Sdoi2011]消耗战(虚树上的DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2286 分析:对于普通的树形dp:f[x]=min(∑f[son],m[x]),其中f[ ...

  8. Learning to Rank 之 listwise ranking

    详细文章: http://www.machinelearning.org/proceedings/icml2007/papers/139.pdf

  9. 从B 树、B+ 树、B* 树谈到R 树

    从B 树.B+ 树.B* 树谈到R 树 作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开始谈起,然后论述B+树.B*树,最后谈到R 树.其中B树.B+树及B*树部分由 ...

  10. Android开发之SlidingMenu开源项目的使用和问题

    一.关于如何导入lib 第一步:New Module  点击+: 第二步:选择Import Eclipse ADT Project: 第三步:选择你想引入的lib文件,选择完成后,会开始编译你添加的项 ...