【NOIP2016提高组】蚯蚓
https://www.luogu.org/problem/show?pid=2827
首先考虑暴力:
每次都是拿最长的蚯蚓,容易想到用堆。
每次除拿出来的以外所有的蚯蚓都增长,容易想到用一个懒惰标记来记录所有的蚯蚓增长了多少。取最大的元素出来后加上标记的值,放元素进去的时候减去标记的值。
这时已经可以骗到60分了。
假设某一次取出来的元素长度为x,当前标记的值为inc,切完以后放进去的就是(x+inc)p-(inc+q)、(x+inc)(1-p)-(inc+q)两个元素
由于
(x+inc)p-(inc+q)-x=(x+inc)p-(x+inc)-q=(p-1)(x+inc)-q<0
(x+inc)(1-p)-(inc+q)-x=(x+inc)(1-p)-(x+inc)-q=-p(x+inc)-q<0
可知放进去的两个元素必定都小于刚取出来的元素,也就是每次放进去的两个元素依次递减。
因此可以开三个队列,第一个队列存放降序排序后的初始值,剩余两个队列分别存放每次切出来的两个元素。可以保证这三个队列都是单调递减的。每次比较三个队列的头元素,取最大的。
因为STL自带队列在不开优化的NOIP里比较慢,所以最好手写队列。
#include <cmath>
#include <iostream>
#include <queue>
#include <algorithm>
#include <functional> template <class T>
struct myqueue
{
#define maxlength 8000005
T data[maxlength];
int p[] = {, }; // 头尾指针
int size = ;
void push(T val)
{
size++;
data[p[]] = val;
if (++p[] >= maxlength)
p[] -= maxlength;
}
void pop()
{
size--;
if (++p[] >= maxlength)
p[] -= maxlength;
}
T front()
{
return data[p[]];
}
bool empty()
{
return size == ;
}
}; #define maxn 100005
using namespace std;
int n, m, q, t;
long double p, eps = 1e-;
myqueue<int> x, y, z;
int increase = ;
int pop_max()
{
int from = ;
int ew = -;
if (!x.empty() && x.front() + increase > ew)
{
from = ;
ew = x.front() + increase;
}
if (!y.empty() && y.front() + increase > ew)
{
from = ;
ew = y.front() + increase;
}
if (!z.empty() && z.front() + increase > ew)
{
from = ;
ew = z.front() + increase;
}
switch (from)
{
case :
x.pop();
break;
case :
y.pop();
break;
case :
z.pop();
break;
}
return ew;
}
int tmp[maxn];
int main()
{
ios::sync_with_stdio(false);
int a, b;
cin >> n >> m >> q >> a >> b >> t;
p = a * 1.0 / b; for (int i = ; i <= n; i++)
cin >> tmp[i];
sort(tmp + , tmp + + n, greater<int>());
for (int i = ; i <= n; i++)
x.push(tmp[i]); int ew;
for (int i = ; i <= m; i++)
{
ew = pop_max();
a = ew * p + eps;
b = ew - a;
if (i % t == )
cout << ew << ' ';
increase += q;
y.push(a - increase);
z.push(b - increase);
}
cout << endl;
for (int i = ; i <= m + n; i++)
{
ew = pop_max();
if (i % t == )
cout << ew << ' ';
}
cout << endl;
return ;
}
【NOIP2016提高组】蚯蚓的更多相关文章
- Noip2016 提高组 蚯蚓
刚看到这道题:这题直接用堆+模拟不就可以了(并没有认真算时间复杂度) 于是用priority_queue水到了85分-- (STL大法好) 天真的我还以为是常数问题,于是疯狂卡常--(我是ZZ) 直到 ...
- [NOIp2016提高组]蚯蚓
题目大意: 给你n个不同长度蚯蚓,每秒从里面取出最长的砍下u/v变成两只,又把剩下的加长q. 问你在m之前的t,2t,3t...的时间上,砍的蚯蚓长度, 以及m秒后剩下所有的蚯蚓长度. 思路: 很容易 ...
- Luogu P2827 [NOIp2016提高组]蚯蚓 | 神奇的队列
题目链接 80分思路: 弄一个优先队列,不停地模拟,切蚯蚓时就将最长的那一条出队,然后一分为二入队,简单模拟即可.还要弄一个标记,表示从开始到当前时间每一条蚯蚓应该加上的长度,操作时就加上,入队时就减 ...
- 洛谷P2827 [NOIP2016 提高组] 蚯蚓 (二叉堆/队列)
容易想到的是用二叉堆来解决,切断一条蚯蚓,其他的都要加上一个值,不妨用一个表示偏移量的delta. 1.取出最大的x,x+=delta: 2.算出切断后的两个新长度,都减去delta和q: 3.del ...
- 【题解】NOIP2016提高组 复赛
[题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ...
- 【题解】NOIP2016 提高组 简要题解
[题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
- [日记&做题记录]-Noip2016提高组复赛 倒数十天
写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...
- 【NOIP2016提高组day2】蚯蚓
那么我们开三个不上升队列, 第一个记录原来的蚯蚓, 第二个记录乘以p的蚯蚓 第三个记录乘以(1-p)的蚯蚓, 在记录每条就要入队列的时间,就可以求出增加的长度 每次比较三个队列的队首,取最大的值x的切 ...
- 【NOIP2016提高组】 Day2 T2 蚯蚓
题目传送门:https://www.luogu.org/problemnew/show/P2827 自测时被题面所误导...,题面中说逢t的倍数才输出答案,以为有什么玄妙的方法直接将m次操作变成了m/ ...
随机推荐
- git常用命令集合
git命令 git init:创建一个仓库并在目录下新建一个.git的文件(初始化一个git仓库) 注:.git文件在工作区,是一个隐藏文件(用ls -ah命令查看),但是它不算工作区,而是git 的 ...
- 利用canvas 导出图片
1.使用canvas绘制图片,并将图片导出. 在本地直接访问静态网页时,无法使用toDataURL(),需要将网页发布后,canvas才能使用toDataURL获取画布上的内容.因为canvas不允许 ...
- HTML5 Geolocation API工作原理[转载]
大家都知道,HTML5 Geolocation 可以使用 IP 地址.基于 Web 的数据库.无线网络连接和三角测量或 GPS 技术来确定经度和纬度. 问题: 在一个基于地理位置服务的个人业余项目(小 ...
- Linux双网卡绑定实现负载均衡
系统环境:CentOS release 6.9 (Final) Linux centos6 2.6.32-696.10.1.el6.x86_64 Ubuntu系统下使用ifenslave进行网卡配置, ...
- 一些神奇的JS功效
1: 沉睡排序 var numbers=[1,2,3,4,5,5,99,4,20,11,200]; numbers.forEach((num)=>{ setTimeout(()=>{ co ...
- NHibernate 慎用Session.Merge
Session.Merge其意思有两个步骤, 一般用法: Session.Merge(obj); 1. 从当前的Session中获取obj对象, 如果未获取到则从数据库获取. 2. 把程序中的obj的 ...
- CopyOnWriteArrayList并发容器
CopyOnWriteArrayList并发容器 Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才 ...
- 如何在RHEL7上搭建Samba服务实现Windows与Linux之间的文件共享
如何在RHEL7上搭建Samba服务实现Windows与Linux之间的文件共享 实现环境:VMware workstations.RHEL7.0 第一步:配置网卡IP及yum软件仓库 命令:vim ...
- 在ASP.NET Core Web API中为RESTful服务增加对HAL的支持
HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务 ...
- C#中float, double的精度问题
在工作中我发现了一个C#浮点数的精度问题,以下的程序运行结果并未得到我预期的结果: view source print? 01 namespace FloatTest 02 03 class ...