【NOIP2016】蚯蚓(单调队列)
题意:

思路:
我们发现,
对于任意两次切割i和j,i<j,
在进行完第j次切割后,第i次切割的u/v部分一定大于等于第j次切割的u/v部分,
第i次的1-u/v部分也一定大于等于第j次的1-u/v部分
证明很显然,
假设在第i次切割的时候,切割的蚯蚓长度为x,
第j次的时候为y+(i-j)q,
那么有x>=y,px+(i-j)q显然大于等于p(y+(i-j)q)
那么我们维护三个队列,
刚开始的时候把所有蚯蚓排序后推到第一个队列里,
然后每次取三个队头里最长的,
把他弹出来,再把切开的两半分别推入第二和第三个队列即可
From http://blog.csdn.net/neither_nor/article/details/53300255
线性复杂度还是被卡一个点 也是醉了
var q:array[..,..]of longint;
t,w:array[..,..]of longint;
a:array[..]of longint;
n,m,q1,u,v,t1,i:longint;
now,s1,s2:longint; procedure swap(var x,y:longint);
var t:longint;
begin
t:=x; x:=y; y:=t;
end; procedure qsort(l,r:longint);
var i,j,mid:longint;
begin
i:=l; j:=r; mid:=a[(l+r)>>];
repeat
while mid<a[i] do inc(i);
while mid>a[j] do dec(j);
if i<=j then
begin
swap(a[i],a[j]);
inc(i); dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end; function h(x:longint):longint;
begin
if t[x,]>w[x,] then exit(-maxlongint);
exit(q[x,t[x,]]);
end; begin
assign(input,'bzoj4721.in'); reset(input);
assign(output,'bzoj4721.out'); rewrite(output);
readln(n,m,q1,u,v,t1);
for i:= to n do read(a[i]);
qsort(,n);
for i:= to n do q[,i]:=a[i];
t[,]:=; t[,]:=; t[,]:=;
w[,]:=n; w[,]:=; w[,]:=;
for i:= to m do
begin
if (h()<>-maxlongint)and(h()>=h())and(h()>=h()) then
begin
now:=h(); inc(t[,]);
end
else if (h()<>-maxlongint)and(h()>=h())and(h()>=h()) then
begin
now:=h(); inc(t[,]);
end
else
begin
now:=h(); inc(t[,]);
end;
now:=now+(i-)*q1;
if i mod t1= then
begin
write(now);
if i+t1<=m then write(' ');
end;
s1:=int64(now)*u div v;
s2:=int64(now)-s1;
inc(w[,]); q[,w[,]]:=s1-i*q1;
inc(w[,]); q[,w[,]]:=s2-i*q1;
end;
writeln;
for i:= to n+m do
begin
if (h()<>-maxlongint)and(h()>=h())and(h()>=h()) then
begin
now:=h(); inc(t[,]);
end
else if (h()<>-maxlongint)and(h()>=h())and(h()>=h()) then
begin
now:=h(); inc(t[,]);
end
else
begin
now:=h(); inc(t[,]);
end;
now:=now+m*q1;
if i mod t1= then
begin
write(now);
if i+t1<=n+m then write(' ');
end;
end; close(input);
close(output);
end.
【NOIP2016】蚯蚓(单调队列)的更多相关文章
- [noip2016]蚯蚓<单调队列+模拟>
题目链接:https://vijos.org/p/2007 题目链接:https://www.luogu.org/problem/show?pid=2827#sub 说实话当两个网站给出AC后,我很感 ...
- luogu 2827 蚯蚓 单调队列/优先队列
易知可利用优先队列选取最大值: 但是通过分析可知,先取出的蚯蚓分开后仍然要比后分的长,所以可直接利用单调队列找队头即可,分三个单调队列,分别找未切割,切割,切割2三种情况 #include<bi ...
- 洛谷P2827 蚯蚓(单调队列)
题意 初始时有$n$个蚯蚓,每个长度为$a[i]$ 有$m$个时间,每个时间点找出长度最大的蚯蚓,把它切成两段,分别为$a[i] * p$和$a[i] - a[i] * p$,除这两段外其他的长度都加 ...
- 【BZOJ】4721: [Noip2016]蚯蚓 / 【洛谷】P2827 蚯蚓(单调队列)
Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮 ...
- [Noip2016]蚯蚓 (单调队列)
题干 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓.蛐蛐国 ...
- [Noip2016]蚯蚓 D2 T2 队列
[Noip2016]蚯蚓 D2 T2 Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯 ...
- NOIP2016-D2-T2 蚯蚓(单调队列)
构建三个单调队列(用STL),分别储存未切的蚯蚓,切后的第一段,切后的第二段,即可简单证明其单调性. 证明:设$q$为单调队列$\because a_1 \geqslant a_2 \geqslant ...
- 【uoj264】 NOIP2016—蚯蚓
http://uoj.ac/problem/264 (题目链接) 题意 n条蚯蚓,时间为m.每单位时间要可以将最长的蚯蚓切成len/2和len-len/2两份,长度为0的蚯蚓不会消失,因为每单位时间所 ...
- BZOJ4721 [Noip2016]蚯蚓
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- [NOIp2016] 蚯蚓
类型:单调队列 传送门:>Here< 题意:有$N$只蚯蚓,每秒都会伸长$q$.每一次都会有人选出最长的一条切成两半,长度分别是$\left \lfloor px \right \rflo ...
随机推荐
- ava的动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- Maximum Subsequence Sum 最大子序列和的进击之路
本文解决最大子序列和问题,有两个题目组成,第二个题目比第一个要求多一些(其实就是要求输出子序列首尾元素). 01-复杂度1 最大子列和问题 (20分) 给定KK个整数组成的序列{ N1, N2 ...
- 学JAVA第二十二天,StringBuffer的好处
五一的假期今天就结束了,又要回来上课了. 今天就写一下StringBuffer的好处吧. StringBuffer类的对象能够被多次的修改,并且不产生新的未使用对象. 也就是说,我们平时用String ...
- SQLite busy handler
SQLite doesn't support high concurrency. In case of a lot of concurrent access from multi-process or ...
- this常用的用法
1.函数作为对象的方法时,this指的是该对象: var obj ={ name:"bob", age:25, getName:function(){ console.log(th ...
- node.js入门之二
NPM 1.NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM ...
- blockdev - 从命令行调用区块设备控制程序
总览(SYNOPSIS) blockdev [options] commands devices 描述(DESCRIPTION) blockdev 工具允许从命令行调用区块设备控制程序. 选项(OPT ...
- 【东软实训】SQL函数
SQL函数 SQL是用于访问和处理数据库的标准的计算机语言,我们所使用的的是Oracle SQL 一个数据库通常包含一个或多个表,每个表有一个名字表示,下图即为一个名为“emp”的表,接下来的操作都将 ...
- 06XML JavaScript
1. XML JavaScript XMLHttpRequest 对象 XML DOM (XML Document Object Model) 定义了访问和操作 XML 文档的标准方法.
- vue 轮播插件使用
<template> <div> <Swiper ref="swiper" v-if="list.length > 0" : ...