NOIP2016 提高组 蚯蚓

news/2024/11/20 17:05:01/文章来源:https://www.cnblogs.com/superl61/p/18558768

NOIP2016 提高组 蚯蚓

算法一

容易想到用优先队列维护最大值,但是有 “其余蚯蚓长度增加 \(q\)” 这个条件,考虑怎么快速地处理。我们把增加的总长度记为偏移量 \(delta\)。每个数在加入前,把不产生贡献的时间的偏移量减去,再存进去就可以了。时间复杂度 \(O(mlogn)\),用 priority_queue 会被卡常,换成 heap 能卡过去。

#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l);i<=(r);++i)
#define G(i,r,l) for(int i(r);i>=(l);--i)
using namespace std;
using ll = long long;
const int LEN = 5e7;
char buf[100], *p1 = buf, *p2 = buf, obuf[LEN], *o = obuf;
inline int gc(){return (p1 == p2) && (p2 = (p1 = buf) + fread(buf, 1, 100, stdin), p1 == p2) ? EOF : *p1++;
}
inline int rd(){int x = 0; char ch; bool f = 1;while(!isdigit(ch = gc())) f ^= (ch == '-');do x = (x << 3) + (x << 1) + (ch ^ 48); while(isdigit(ch = gc()));return f ? x : -x;
}
inline void output(int x){if(x < 0){x = ~x + 1;*o++='-';}if(x > 9) output(x / 10);*o++=(x % 10 + 48);
}
inline void write(int x, char c){output(x);*o++=c;
}
const int N = 1e5 + 5, M = 7e6 + 5;
int n, m, k, opt, cnt = 0; ll u, v;
int q[N + M];
signed main(){
//	freopen("earthworm.in","r",stdin);
//	freopen("earthworm.out","w",stdout);n = rd(), m = rd(), k = rd(), u = rd(), v = rd(), opt = rd();F(i, 1, n) q[++ cnt] = rd() - k;make_heap(q + 1, q + cnt + 1);F(t, 1, m){pop_heap(q + 1, q + cnt + 1);int ret = q[cnt] + t * k, x = ret * u / v, y = ret - x;if(t % opt == 0) write(ret, ' ');q[cnt] = x - (t + 1) * k;push_heap(q + 1, q + cnt + 1);q[++ cnt] = y - (t + 1) * k;push_heap(q + 1, q + cnt + 1);}*o++='\n';sort(q + 1, q + cnt + 1, [&](const int &i, const int &j){return i > j;});F(i, 1, cnt) if(!(i % opt)) write(q[i] + (m + 1) * k, ' ');fwrite(obuf, o - obuf, 1, stdout);return fflush(0), 0;
}

算法二

对于每次的最大值 \(x\),容易发现 \(x\)\(\lfloor px \rfloor\) 都具有单调性。想一下 \(x - \lfloor px \rfloor\) 有没有单调性。

先不考虑取整符号,可以化简为 \((1 - p)x\),考虑小数部分的话,这是具有单调性的。

加上取整符号呢?发现 $ x - \lfloor px \rfloor = \lceil (1 - p)x \rceil$,相当于会把一些数向右移动一点点变成最近的整数,容易理解这仍然具有不严格单调性。

所以三种值都具有不严格单减性

所以我们直接开三个队列分别维护 \(x, \lfloor px \rfloor, x - \lfloor px \rfloor\),每次取出的最大值就是三个队首中的最大值。模拟找数删数的过程就做完了。

时间复杂度 \(O(nlogn + m)\)

#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l);i<=(r);++i)
#define G(i,r,l) for(int i(r);i>=(l);--i)
#define mk make_pair
#define pii pair<int, int>
using namespace std;
using ll = long long;
char buf[100], *p1 = buf, *p2 = buf;
inline int gc(){return (p1 == p2) && (p2 = (p1 = buf) + fread(buf, 1, 100, stdin), p1 == p2) ? EOF : *p1++;
}
inline int rd(){int x = 0; char ch; bool f = 1;while(!isdigit(ch = gc())) f ^= (ch == '-');do x = (x << 3) + (x << 1) + (ch ^ 48); while(isdigit(ch = gc()));return f ? x : -x;
}
const int N = 1e5 + 5;
const int inf = 2e9;
int n, m, k, t, delta = 0;
ll u, v;
int a[N];
queue<int> q[3];
signed main(){n = rd(), m = rd(), k = rd(), u = rd(), v = rd(), t = rd();F(i, 1, n) a[i] = rd();sort(a + 1, a + n + 1, [&](const int &i, const int &j){return i > j;});F(i, 1, n) q[0].push(a[i]);F(i, 1, m){pii mx = max({ mk(q[0].empty() ? -inf : q[0].front(), 0), mk(q[1].empty() ? -inf : q[1].front(), 1), mk(q[2].empty() ? -inf : q[2].front(), 2)});q[mx.second].pop(), mx.first += delta, delta += k;q[1].push(mx.first * u / v - delta), q[2].push(mx.first - mx.first * u / v - delta);if(!(i % t)) printf("%d ", mx.first);} puts("");int cnt = 0;while(q[0].size() || q[1].size() || q[2].size()){pii mx = max({ mk(q[0].empty() ? -inf : q[0].front(), 0), mk(q[1].empty() ? -inf : q[1].front(), 1), mk(q[2].empty() ? -inf : q[2].front(), 2)});q[mx.second].pop();		if(!((++ cnt) % t)) printf("%d ", mx.first + delta);} return fflush(0), 0;
}

总结

本题中 \(m\) 过大的范围提示我们需要寻求一种更快速的线性维护方法,显然这个方法一定没有普适性,所以我们应该大胆猜想题目的情景有一些好用的性质,比如单调性、二分性等等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/837408.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySql Is Null和is not null索引失效的问题

简介mysql的sql查询语句中使用is null、is not null、!=对索引并没有任何影响,并不会因为where条件中使用了is null、is not null、!=这些判断条件导致索引失效而全表扫描。 mysql官方文档也已经明确说明is null并不会影响索引的使用。 事实上,导致索引失效而全表扫描的通常是…

由于目前头像不足

一个人收两个头像咋样

CH592工具更新说明

①首先拔除电脑上的所有串口工具,再插入我们需要烧录程序的串口,确保能找到我们要下载固件的COM口,一般同一个串口工具在同一台电脑上所分配的COM号是唯一的 ②打开工具,点击Search Device,会跳出对应的COM号③搜索到COM号后可以拔掉串口,开始硬件接线,VCC接串口3V3,GN…

批量解除 此文件来自其他计算机,可能被阻止以帮助保护该计算机

下载微软工具 - Streams https://learn.microsoft.com/en-us/sysinternals/downloads/ streams -s -d D:/file留待后查,同时方便他人 联系我:renhanlinbsl@163.com

使用linq查询报错English Message : Join a needs to be the same as OrderBy it

可以使用 .Select 和 .MergeTable() 将多表结果集变成单表:这样问题就可以解决了

【淘汰9成NLP工程师的常识题】LSTM的前向计算如何进行加速?

【淘汰9成NLP工程师的常识题】LSTM的前向计算如何进行加速? 重要性:★★★ 💯 这是我常用的【淘汰9成NLP工程师的常识题】LSTM的前向计算如何进行加速? 重要性:★★★ 💯这是我常用的一个面试题。看似简单的基础题,但在面试中能准确回答的不足10% ,常识题的错误反而会…

【论文阅读笔记】多模态大语言模型必读 —— LLaVA

LLaVA (Large Language and Vision Assistant),proposed by Haotian Liu (UWM), et al.论文地址:https://arxiv.org/abs/2304.08485 代码地址:https://github.com/haotian-liu/LLaVA目录简介Visual Instruction 数据生成视觉指令微调模型架构训练 简介 人类对于世界的认知是…

接口文档和编写接口测试用例

一、熟悉接口文档和分析接口 1、发送接口文档 2、分析接口文档 3、了解需要测试接口,分析需求文档接口请求参数:接口返回参数:成功整理接口:(自己项目有哪些借款) cms项目接口:查询接口,登录接口,添加用户接口,用户管理接口,文章管理接口,删除用户接口,删除栏目接…

python代码实现RNN, LSTM, GRU

安装torch, transformers, loguru(本代码实现为下方版本,其余版本实现可比葫芦画瓢自行摸索)pip install torch==1.13.1 transformers==4.44.1 numpy==1.26.4 loguru -i https://pypi.tuna.tsinghua.edu.cn/simple/RNN:Recurrent Neural Network,网络结构如下图所示:import nu…

ChatGPT国内中文版镜像网站整理合集(2024/11/20)

ChatGPT 镜像站的用途 镜像站(Mirror Site)ChatGPT镜像网站是指通过复制原始网站内容和结构,创建的备用网站。其主要目的是在原始网站无法访问时,提供相同或类似的服务和信息。​ 一、ChatGPT中文镜像站 ① yixiaai.com 支持4o以及o1,支持MJ绘画 ② chat.lify.vip 支持通用…

鸿蒙NEXT开发案例:随机数生成

【引言】 本项目是一个简单的随机数生成器应用,用户可以通过设置随机数的范围和个数,并选择是否允许生成重复的随机数,来生成所需的随机数列表。生成的结果可以通过点击“复制”按钮复制到剪贴板。 【环境准备】 • 操作系统:Windows 10• 开发工具:DevEco Studio NEXT Be…