NOIP2016 提高二试 蚯蚓 题解

【NOIP2016提高组复赛】蚯蚓 题解 【NOIP2016提高组复赛】蚯蚓 Description Input 阅读详情

根据题意,每次都选取长度最长的蚯蚓将其切开,这不由的让我们想到了大顶堆和优先队列(其实优先队列的实质也是堆),但这种做法的复杂度却达到了O[M*log(N+M)],将题目最大数据规模代入约为1.4亿,这显然无法在1s的时间内通过。

那还有什么更好的算法能让我们快速的在一组数据中找到一个最大值呢?

假设存在长度分别为a[ i ]和a[ j ]的蚯蚓,令其满足i<j且a[ i ]>=a[ j ](可以认为a[]数组是单调非递增的)。

因为a[ i ]>=a[ j ]

所以a[ i ]*p>=a[ j ]*p (p>=0, p∈R)

所以int(a[ i ]*p)>=int(a[ j ]*p) (int()相当于下取整)

所以{ a[ i ] - int(a[ i ]*p) } >= { a[ j ] - int(a[ j ]*p }

也就是说,如果存储待切蚯蚓长度的数组a[]满足单调非递增,则其按题意产生的左右两段蚯蚓的长度一定也能够按被切的顺序单调非递增。分析到这里,有没有看出什么猫腻呢?没错,我们可以用单调队列解决!

我们开三个队列(在这我就不用STL了,用数组模拟)a[], x[], y[],分别存储原始蚯蚓长度(即读入的)、被切为左段的长度、被切为右段的长度。当然a[]是预先进行非递减排序的。这样,每1秒从三个队列选取值最大的队头出队,将其“切”成两段后再分别从队尾存入x[]和y[]。

 

代码如下:(max函数返回的是三个队列中最大队头的值,同时对队头最大的对列进行出队操作。)

 

const int MaxN = 100000+2;
const int MaxM = 7000000+2;

int a[MaxN], front_a, back_a;
int x[MaxN+MaxM], front_x, back_x;
int y[MaxN+MaxM], front_y, back_y;

int max(){
	int *front = NULL;
	int Max = 1<<31;
	if(front_a!=back_a && a[front_a]>Max){
		front = &front_a;
		Max = a[front_a];
	}
	if(front_x!=back_x && x[front_x]>Max){
		front = &front_x;
		Max = x[front_x];
	}
	if(front_y!=back_y && y[front_y]>Max){
		front = &front_y;
		Max = y[front_y];
	}
	++(*front);
	return Max;
}

最核心的问题解决了。现在还面临一个问题:每1秒除刚刚产生的蚯蚓外,其余长度全部增加q。如果按照题意来模拟,将其余全部队列中的元素扫描一遍并加q,单次操作的复杂度便达到了O(N+M),这是显然吃不消的。

 

还有更优的办法吗?

反过来想:他让我们把其余元素加q,那我们不妨把新产生的两个元素减q,这样各个元素之间的相对值是保持不变的。但是最终所有元素的值与实际值也肯定存在一个相对值“Plus”,我们只要最后把他加回来就好了。

代码如下:

 

bool flag = false;
int Plus = 0;
int cnt = 0;
for(int m = 1; m<=M; ++m){
	now = max()+Plus;
		
	if(m%T==0 && cnt<M/T){
		flag ? printf(" ") : flag = true;
		printf("%d", now);
		++cnt;
	}
		
	_x = int(now*P);    //left
	_y = now-_x;        //right
		
	Plus += Q;
	
	x[back_x++] = _x-Plus;
	y[back_y++] = _y-Plus;
}
printf("\n");


最主要的两个问题解决了,其他的估计也就顺理成章了吧!下附总代码

 

 

#include <cstdio>
#include <algorithm>
using namespace std;

const int MaxN = 100000+2;
const int MaxM = 7000000+2;

int N, M, Q, U, V, T;
int _x, _y, Plus;
int cnt, now;
double P;
bool flag;

int a[MaxN], front_a, back_a;
int x[MaxN+MaxM], front_x, back_x;
int y[MaxN+MaxM], front_y, back_y;

inline bool cmp(int a, int b){
	return a>b;
}

int max(){
	int *front = NULL;
	int Max = 1<<31;
	if(front_a!=back_a && a[front_a]>Max){
		front = &front_a;
		Max = a[front_a];
	}
	if(front_x!=back_x && x[front_x]>Max){
		front = &front_x;
		Max = x[front_x];
	}
	if(front_y!=back_y && y[front_y]>Max){
		front = &front_y;
		Max = y[front_y];
	}
	++(*front);
	return Max;
}

int main() {
	freopen("earthworm.in", "r", stdin); //freopen("earthworm.out", "w", stdout);

	scanf("%d %d %d %d %d %d", &N, &M, &Q, &U, &V, &T);
	P = U/double(V);
	
	for(int i = 0; i<N; ++i) scanf("%d", &a[back_a++]);
	sort(a, a+N, cmp);
	
	for(int m = 1; m<=M; ++m){
		now = max()+Plus;
		
		if(m%T==0 && cnt<M/T){
			flag ? printf(" ") : flag = true;
			printf("%d", now);
			++cnt;
		}
		
		_x = int(now*P);
		_y = now-_x;
		
		Plus += Q;
		
		x[back_x++] = _x-Plus;
		y[back_y++] = _y-Plus;
	}
	printf("\n");
	
	flag = false;
	cnt = 0;
	
	for(int m = 1; cnt<(N+M)/T; ++m){
		now = max()+Plus;
		if(m%T==0){
			flag ? printf(" ") : flag = true;
			printf("%d", now);
			++cnt;
		}
	}
	printf("\n");
	fclose(stdin); fclose(stdout); return 0;
}

 

 

 

 

 

「NOIP2016」[提高组Day2T2] 蚯蚓earthworm (数组模拟队列)超详细题解 前言 这里是蒟蒻TIMEpings,这是我第一次真正动手写题解 (虽然之前有想过很多次) ,有误之处请各位大佬多多指出(=・ω・=)! 快速导航ε=ε=(ノ≧∇≦ノ思路1-完全模拟(TLE警告)全局变量们main()doworm()bool cmp(const int &amp;amp;amp;amp;a,const int &amp;amp;amp;amp;b)cut(int topworm)grow()print_answer()思路2-各... 阅读详情

相关推荐

题解:洛谷 P2827 [NOIP 2016 提高组] 蚯蚓

题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。蛐蛐国王知道这样不是长久之计,因为蚯蚓不仅会越来越多,还会越来越长。每一秒,神刀手会在所有的蚯蚓中,准确地找到最长的那一只(如有多个则任选一个)将其切成两半。隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓。同一行中相邻的两个数之间,恰好用一个空格隔开。此外,除了刚刚产生的两只新蚯蚓,其余蚯蚓的长度都会增加。的有理数)决定,设这只蚯蚓长度为。,神刀手会将其切成两只长度分别为。

团爸讲算法 1018

【题解】「NOIP2016」蚯蚓

经典的队列优化题,细节贼多,本人抽时间补一下详解。 #include<bits/stdc++.h> using namespace std; const int inf=-0x3f3f3f3f; int n,m,q,u,v,t,in[100005],delta; double p; queue<int> a,b,c; void read() { scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);

cqbzlydd的博客 845

Python量化交易实战:pytdx库高效获取通达信分笔成交数据

本文详细介绍了如何使用Python的pytdx库高效获取通达信分笔成交数据,为量化交易提供关键市场微观结构分析。通过环境搭建、服务器连接、数据获取与清洗的完整流程,帮助开发者快速掌握这一免费高质量数据源,并实现分笔数据的实战分析与应用。

weixin_29061509的博客 1347

【NOIP2016提高组】蚯蚓

                                              蚯蚓 题目背景 NOIP2016 提高组 Day2 T2 题目描述 本题中,我们将用符号  表示对 c 向下取整,例如: 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓。 蛐蛐国里现在共有 n 只蚯蚓(n为正整数)。每只蚯蚓拥有长度,我们设第 i ...

ETO的博客 1803

基于Active-HDL的HDL设计录入与仿真

作者:毛茏玮 / Saint 掘金:https://juejin.im/user/5aa1f89b6fb9a028bb18966a 微博:https://weibo.com/5458277467/profile?topnav=1&amp;wvr=6&amp;is_all=1 GitHub:github.com/saint-000 优快云: https://me.youkuaiyun.com/qq_4053...

一个会写代码的烤鸭 7780

紫光同创PGL50H开发板实战:盘古50KH视频板的多媒体处理与高速通信方案

本文详细介绍了基于紫光同创PGL50H FPGA芯片的盘古50KH视频开发板在多媒体处理与高速通信方面的实战应用。文章从开发板硬件架构解析入手,逐步指导开发环境搭建、DDR3内存控制器配置、HDMI视频输入输出实战,并重点探讨了利用板载HSST高速收发器实现光纤通信与万兆以太网的方案。最后,通过构建一个集多路视频采集、处理与光纤传输于一体的系统案例,展示了该开发板在高性能实时数据处理领域的强大潜力。

b9c0d的博客 485

刷题总结——蚯蚓(NOIP2016DAY2T2)

题目: 题目背景 NOIP2016提高组Day2T2 题目描述 本题中,我们将用符号表示对c向下取整,例如: 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓。 蛐蛐国里现在共有n只蚯蚓(n为正整数)。每只蚯蚓拥有长度,我们设第i只蚯蚓的长度为ai(i=1,2,...,n),并保证所有的长度...

banzhangzhi8819的博客 283

mobaXterm连接vmWare虚拟机上的centOS7提示连接失败的解决方法

1.问题描述: mobaXterm安装后连接虚拟机vmWare上的centOS7发现连接不上,如下图所示: 2.解决方法 先是查了一下centOS的ip 开始错误的以为 virbr0: 后面的inet就是虚拟机的IP 实则不然(正确的ip是在ens33后面的inet中的ip,大佬们勿喷) 这个值需要配置一下的,具体配置过程如下: step1: 进入centOS下的/...

hss19214的博客 7890

NOIP 2016 蚯蚓 题解

题目传送门(洛谷)        题目大意:有n条蚯蚓,每次把最长的切成两半,长度分别为⌊px⌋和x-⌊px⌋,其他的蚯蚓长度加q,重复m次,问某些时候切的蚯蚓的长度和最后的一些蚯蚓的长度。        十分显然的,这道题我们可以用堆轻易实现,用堆来维护最长的蚯蚓,拿出来切成两半然后再塞回堆里面去。顺手再输出一下,这道题就ok了,于是我无脑的打出了以下代码: #include &lt;c...

a_forever_dream的博客 1170

038、OIS 光学防抖原理与调试:陀螺仪数据融合、Lens Shift OIS 的闭环控制

本文分享了OIS光学防抖系统的调试经验和关键技术要点。作者通过一个"呼吸感"Bug案例,揭示了陀螺仪数据融合和闭环控制的重要性。系统介绍了OIS的三个关键层次:传感器层(陀螺仪特性)、控制层(复合算法)和执行层(闭环控制)。重点讲解了陀螺仪数据融合的互补滤波实现、Lens Shift闭环控制的PID优化策略(包括积分抗饱和和微分滤波),以及前馈补偿的应用。最后总结了调试中的关键问题:数据同步、霍尔校准、温度补偿和性能评估方法,并给出实用建议:平衡算法复杂度与性能、预留带宽余量、重视产线校准等。文章强调OIS

sundong_81的博客 258

OpenGL 进阶系列10 - 光线跟踪实现简介(Ray Tracing)

OpenGL 实现光线跟踪(Ray Tracing)是一个相对复杂但有趣的挑战,通常用于生成高度逼真的图像效果,如反射、折射、阴影等。OpenGL 本身并不是为光线跟踪设计的,但可以通过结合计算着色器和现代 OpenGL 功能实现光线跟踪。光线跟踪的基本思路是从相机(或视点)出发,发射光线并计算这些光线与场景中物体的交点。光线与场景中物体相交的计算。计算交点的光照(基于表面法线、光源位置、材质等)。反射和折射的处理(如果物体是透明或反射的)。

GPU全栈博主 1534

NOIp2016提高组 蚯蚓————单调队列

题解:本题主要考查单调队列。 简要题意:题面 1.单调队列: (1).对于505050分的q=0q=0q=0,也就是蚯蚓不会增长和合并果子差不多,我们就可以用优先队列处理。 (2).对于858585分的数据,和合并果子的思想差不多,就是没被切的蚯蚓加一定长度。用优先队列和数组模拟都不好处理,这就需要转换思想。利用差分的思想,没被切的蚯蚓加一定长度就是被切的减少,每次再记录累计加的长度即可。 代码如...

wly1127的博客 308

基于深度学习的航拍图像中地物变化检测

随着无人机技术的飞速发展,航拍图像成为获取地表信息的重要手段之一。然而,由于地球表面的不断变化,监测和识别航拍图像中的地物变化成为一项具有挑战性的任务。在人工智能领域,深度学习技术的兴起为地物变化检测提供了全新的解决方案。本文将介绍基于深度学习的航拍图像中地物变化检测的方法,并附上相应的代码实例。

一键难忘的博客 4176

P2827 [NOIP 2016 提高组] 蚯蚓题解

本文介绍了NOIP2016提高组的一道关于蚯蚓切割的题目。题目要求在m秒内,每秒找到最长蚯蚓切割,并记录切割前长度。同时,其他蚯蚓每秒增长q。最终需要输出特定时间点的切割长度和所有蚯蚓的最终长度。解题思路采用了单调队列优化,通过维护三个队列来高效处理蚯蚓的切割和生长。代码实现了对初始蚯蚓排序、切割处理、结果输出等功能,确保在时间限制内完成大规模数据处理。该解法巧妙地利用了队列的性质,避免了复杂的数值计算,体现了算法优化的思想。

bz02_2023f2的博客 868

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

NOIP2016 提高组总结

题解每天的第二题和第三题题解已经在我的博客中放出 链接: NOIP2016提高组 第一天第二题 天天爱跑步running 题解 NOIP2016提高组 第一天第三题 换教室 classroom 题解 NOIP2016 提高组 第二天第二题 蚯蚓earthworm 题解 NOIP2016提高组 第二天第三题 愤怒的小鸟angrybirds 题解 洛谷题目链接第二次参加提高组,原来的目标是5

Jacky35 8089

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

#185. [NOIP2016 提高组] 蚯蚓题解

本题中,我们将用符号⌊c⌋表示对c⌊3.0⌋=⌊3.1⌋=⌊3.9⌋=3。蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓。蛐蛐国里现在共有n只蚯蚓(n为正整数)。每只蚯蚓拥有长度,我们设第i只蚯蚓的长度为ai​(i=1,2,…,n),并保证所有的长度都是非负整数(即可能存在长度为0的蚯蚓)。每一秒,神刀手会在所有的蚯蚓中,准确地找到最长的那一只(如有多个则任选一个)将其切成两半。p0。.........

XDFZ_ST_HYX的博客 321

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

NOIP2016 提高组 第二天第二题 蚯蚓earthworm 题解

NOIP2016 提高组 第二天第二题 蚯蚓earthworm 题解 NOIP2016 提高组 Day2第二题 蚯蚓earthworm 题解 题目描述本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3。蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓。蛐蛐国里现在共有n只蚯蚓(n为正整

Jacky35 3125

P2827 [NOIP2016 提高组] 队列

题意 传送门 P2827 [NOIP2016 提高组] 蚯蚓 题解 容易想到使用二叉堆维护长度的最大值,由于每次新产生之外的蚯蚓长度都增加 qqq,而难以修改已经在堆中的元素,那么对新产生的蚯蚓长度减 qqq,可以使长度的相互关系保持不变。时间复杂度 O(mlog⁡n)O(m\log n)O(mlogn),显然难以胜任。 设当前切割蚯蚓长度为 x1x_1x1​,那么新增蚯蚓长度分别为 ⌊px1⌋\lfloor px_1\rfloor⌊px1​⌋ 与 x1−⌊px1⌋x_1-\lfloor px_1\rflo

neweryyy的博客 186

蚯蚓 NOIP2016 提高组 Day2 T2

描述本题中,我们将用符号⌊c⌋表示对c向下取整,例如:⌊3.0⌋=⌊3.l⌋=⌊3.9⌋=3。 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓。 蛐蛐国里现在共有n只蚯蚓(n为正整数)。每只蚯蚓拥有长度,我们设第i只蚯蚓的长度为ai(i=1, 2, …, n),并保证所有的长度都是非负整数(即:可能存在长度为0的蚯蚓)。 每一秒,神刀手会在所有的

Loi_feather的博客 595

NOIP2016 提高组 题解

//随便放上我写的总结 DAY1 【NOIP 2016 提高组】玩具谜题 【NOIP 2016 提高组】天天爱跑步 【NOIP 2016 提高组】换教室 DAY2 【NOIP 2016 提高组】组合数问题 【NOIP 2016 提高组】蚯蚓 【NOIP 2016 提高组】愤怒的小鸟

1117

历年NOIP/CSP题解(持续更新)

文章目录2020年NOIPCSPJCSPS2019年CSPJCSPS2018年NOIP普及组NOIP提高组2017年NOIP普及组NOIP提高组2016年NOIP普及组NOIP提高组2015年NOIP普及组 2020年 NOIP NOIP2020T1题解 NOIP2020T2题解 NOIP2020T3题解 NOIP2020T4题解:暂无 CSPJ CSP-J2020第一题(优秀的拆分)题解 CSP-J2020第二题(直播获奖)题解 CSP-J2020第三题(表达式)题解 CSP-J2020第四题(方格取数)

风斯在下 2921

NOIP2016提高 总结

如果不出状况的话能在[330,350]区间之内,这次比赛我认为我比较正常发挥 之前所说的400+出现了一些运算错误前一天十点多被叫去开会,发了高嘉煊的满分总结与自己的准考证。Day1: 预计100+45+28=173今天有一些迟钝,做题的速度有一些慢,第三题其实我能多拿24分,主要还是没时间,键盘不顺手 我要证明一下我记住了题目 P1 题目大意是给出了n个小人围成一个圈,题目逆时针给出,每个小

white_elephant的博客 1476

P2827 NOIP2016 提高组 蚯蚓

P2827 NOIP2016 提高组 蚯蚓 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 事实上,本题疑似所有题解和 lyd 蓝书上的证明均有误,本篇题解将给出一个严谨的单调性正确性证明。 一眼看上去容易想到 \(q = 0\) 的 \(\mathcal{O}(m \log m)\) 堆做法。 \(q >0\) 时,暴力给集合中的元素 \(+q\) 显然是不可取的。观察...

crab_xbc的博客 237

{题解}[jzoj4907]【NOIP2016提高组复赛】蚯蚓

传送门DesriptionAnalysis65分想法:用堆维护一个最大值,暴力切割。 100分做法: 考虑一个有序序列a(当前蚯蚓长度) 每次必定是选择第一个,删除第一个,考虑把分裂出的插入序列,保证有序。 当切割一条蚯蚓a1a_1时,设分成了x1>y1x_1>y_1 对于另一条蚯蚓a2<a1a_2<a_1,它所分成的x2>y2x_2>y_2必定也满足x2<x1,y2<y1x_2 < x_

FarmerJohn 5110

NOIP2016 提高组题解口胡

持续更新ing……蚯蚓容易想到一个暴力算法,直接用堆维护最大值,外面设一个变量来统计没被切掉的蚯蚓长度的增加值。入堆时元素减去这个值就可以维护了。复杂度是O(mlogm)O(mlogm) 的,无法接受。注意到一个性质,每一次切的蚯蚓的长度必然是单调不增的,这意味着每一次看下来的两段也是单调不增的。既然不增,就没必要用堆,用队即可维护。建两三个队分别维护初始蚯蚓序列,切掉后较长的一段,切掉后较短的一段

无尽 426
上一篇: 2005年全国信息学分区联赛模拟赛 猫猫的小鱼 题解
下一篇: [解法二] CodeVS1063 合并果子 题解
Coder.AN
博客等级 码龄9年 8粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值