【NOIP2016提高组】蚯蚓

article/2025/9/27 19:15:42

                                              蚯蚓

题目背景

NOIP2016 提高组 Day2 T2

题目描述

本题中,我们将用符号  表示对 c 向下取整,例如:

蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓。

蛐蛐国里现在共有 n 只蚯蚓(n为正整数)。每只蚯蚓拥有长度,我们设第 i 只蚯蚓的长度为 ai (i=1,2,... ,n),并保证所有的长度都是非负整数(即:可能存在长度为0的蚯蚓)。

每一秒,神刀手会在所有的蚯蚓中,准确地找到最长的那一只(如有多个则任选一个)将其切成两半。神刀手切开蚯蚓的位置由常数 p(是满足 0<p<1 的有理数)决定,设这只蚯蚓长度为 x ,神刀手会将其切成两只长度分别为  的蚯蚓。特殊地,如果这两个数的其中一个等于 0 ,则这个长度为 0 的蚯蚓也会被保留。此外,除了刚刚产生的两只新蚯蚓,其余蚯蚓的长度都会增加 q(是一个非负整常数)。

蛐蛐国王知道这样不是长久之计,因为蚯蚓不仅会越来越多,还会越来越长。蛐蛐国王决定求助于一位有着洪荒之力的神秘人物,但是救兵还需要 m 秒才能到来……(m为非负整数)

蛐蛐国王希望知道这 m 秒内的战况。具体来说,他希望知道:

  • m 秒内,每一秒被切断的蚯蚓被切断前的长度(有 m 个数);
  • m 秒后,所有蚯蚓的长度(有 n+m 个数)。

蛐蛐国王当然知道怎么做啦!但是他想考考你……

输入格式

第一行包含六个整数 n,m,q,u,v,t,其中:n,m,q 的意义见【问题描述】;u,v,t 均为正整数;你需要自己计算 p=u/v(保证 0<u<v);t 是输出参数,其含义将会在【输出格式】中解释。

第二行包含 n 个非负整数,为 a1,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。

输出格式

第一行输出  个整数,按时间顺序,依次输出第 t 秒,第 2t 秒,第 3t 秒,……被切断蚯蚓(在被切断前)的长度。

第二行输出  个整数,输出 m 秒后蚯蚓的长度;需要按从大到小的顺序,依次输出排名第 t,第 2t,第 3t,……的长度。

同一行中相邻的两个数之间,恰好用一个空格隔开。即使某一行没有任何数需要输出,你也应输出一个空行。

请阅读样例来更好地理解这个格式。

样例数据 1

输入

3 7 1 1 3 1 
3 3 2

输出

3 4 4 4 5 5 6 
6 6 6 5 5 4 4 3 2 2

样例数据 2

输入

3 7 1 1 3 2 
3 3 2

输出

4 4 5 
6 5 4 3 2

样例数据 3

输入

3 7 1 1 3 9 
3 3 2

输出

2

备注

【样例1说明】
在神刀手到来前:3 只蚯蚓的长度为 3,3,2。

【样例2说明】
这个数据中只有 t=2 与上个数据不同。只需在每行都改为每两个数输出一个数即可。
虽然第一行最后有一个 6 没有被输出,但是第二行仍然要重新从第二个数再开始输出。

【样例3说明】
这个数据中只有 t=9 与上个数据不同。
注意第一行没有数要输出,但也要输出一个空行。

  • 1 秒后:一只长度为 3 的蚯蚓被切成了两只长度分别为 1 和 2 的蚯蚓,其余蚯蚓的长度增加了 1 。最终 4 只蚯蚓的长度分别为 (1,2),4,3 。括号表示这个位置刚刚有一只蚯蚓被切断。
  • 2 秒后:一只长度为 4 的蚯蚓被切成了 1 和 3 。5 只蚯蚓的长度分别为:2,3,(1,3),4 。
  • 3 秒后:一只长度为 4 的蚯蚓被切断。6 只蚯蚓的长度分别为:3,4,2,4,(1,3)。
  • 4 秒后:一只长度为 4 的蚯蚓被切断。7 只蚯蚓的长度分别为:4,(1,3),3,5,2,4。
  • 5 秒后:一只长度为 5 的蚯蚓被切断。8 只蚯蚓的长度分别为:5,2,4,4,(1,4),3,5。
  • 6秒后:一只长度为5的蚯蚓被切断。9只蚯蚓的长度分别为:(1,4),3,5,5,2,5,4,6。
  • 7 秒后:一只长度为 6 的蚯蚓被切断。10只蚯蚓的长度分别为:2,5,4,6,6,3,6,5,(2,4)。

所以,7 秒内被切断的蚯蚓的长度依次为 3,4,4,4,5,5,6。7 秒后,所有蚯蚓长度从大到小排序为 6,6,6,5,5,4,4,3,2,2。

【数据规模与约定】
测试点 1~3 满足 m=0。
测试点 4~7 满足 n,m≤1,000。
测试点 8~14 满足 q=0,其中测试点 8~9 还满足 m≤105。
测试点 15~18 满足 m≤3×105。
测试点 19~20 没有特殊的约定,参见原始的数据范围。
测试点 1~12,15~16 还满足 v≤2 ,这意味着 u,v 的唯一可能的取值是 u=1,v=2,即 p=0.5。这可能会对解决问题有特殊的帮助。

每个测试点的详细数据范围见下表。

 

题意:

       初始时有n个非负整数,进行m次操作,每次依次:将其中最大的数x移除,将剩下的每个数都增加q,加入两个新数⌊px⌋和x-⌊px(0<p<1,q>=0)

       没t次操作输出这次被移除的数。最后好药输出大小排名为t的倍数的数。保证每种输出的数不会超过10^{5}

 

解析:

       70分:

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

       100分:

       建立三个队列A,B,C,初始时A中元素为初始的数从大到小排序,B和C为空。每次操作时,从三个队列的队首(如果有)找出一个最大的元素出队,给最大的元素加上tag即为实际的最大值x。然后,将⌊px⌋减去tag插入到B的队尾,将x-⌊px⌋减去tag插入到C的队尾。所有操作完成后,通过类似归并的操作即可得到了从大到小排序的所有剩余的数。

       这个算法的正确性并不显然,因为后一次操作与前一次操作移除的数的大小关系没有必然联系,也就是说你不能确定三个队首就是当前前三大的数。

       我们一次考虑相邻的两个操作,设其中被移除的数分别为x1x2,则有x1>=x2-q,设加入⌊px_{1}⌋和x-⌊px_{1}⌋时维护的变量为tag,则加入⌊px_{2}⌋和x-⌊px_{2}⌋时维护的变量为tag+q

       对于队列B,两次操作中入队的数分别为⌊px_{1}-y与⌊px_{2}-(y+q)。由于x1>=x2-q,所以⌊px_{1}>=px_{2}-q,所以⌊px_{1}-y>=px_{2}-(y+q)。保证了实际入队的前面的数总是不小于后面的数。

       对于队列C同理。

       时间复杂度O(nlog_{n}+n+m)

       PS:注意开long long

 

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int Max=7000100;
int n,m,u,v,q,t,h1=1,t1,h2=1,t2,h3=1,t3,sum,x,pre,num;
int ans[Max],q1[Max],q2[Max],q3[Max];
inline int get_int()
{int x=0,f=1;char c;for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());if(c=='-') {f=-1;c=getchar();}for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';return x*f;
}
inline void print(int x){if(x > 9) print(x/10);putchar(x%10+'0');}
inline bool comp(const int &a,const int &b){return a>b;}
inline int calc(int x){return x*u/v;}
inline void solve()
{for(int i=1;i<=m;i++){num=max(q1[h1],max(q2[h2],q3[h3]));if(q1[h1]==num) h1++;else if(q2[h2]==num) h2++;else h3++;x=num+sum;sum+=q;if(!(i%t)) print(x),putchar(' ');num=calc(x),pre=x-num;q2[++t2]=num-sum,q3[++t3]=pre-sum; }
}
signed main()
{n=get_int(),m=get_int(),q=get_int(),u=get_int(),v=get_int(),t=get_int();memset(q1,-0x3f3f3f,sizeof(q1)),memset(q2,-0x3f3f3f,sizeof(q2)),memset(q3,-0x3f3f3f,sizeof(q3));for(int i=1;i<=n;i++) q1[i]=get_int();sort(q1+1,q1+n+1,comp);solve(),putchar('\n');for(int i=1;i<=n+m;i++){x=max(q1[h1],max(q2[h2],q3[h3]));if(q1[h1]==x) h1++;else if(q2[h2]==x) h2++;else h3++;if(!(i%t)) print(x+sum),putchar(' ');}return 0;
}

 


http://chatgpt.dhexx.cn/article/KSiPOGb1.shtml

相关文章

NOIP2016提高组 day1

1.玩具谜题 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业。 有一天, 这些玩具小人把小南的眼镜藏了起来。 小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图: 这时 s i n g e r singer singer告诉小南一个谜題: “眼镜藏在我左数第3个玩具…

[NOIP2016 普及组] 魔法阵

[NOIP2016 普及组] 魔法阵 - 洛谷 题意分析 给定一个四元组&#xff0c;四个数分别为a,b,c,d&#xff0c;满足以下条件&#xff1a; 1.a<b<c<d 2.b-a2*(d-c) 3.b-a(c-b)/3 //注意是实除 现在给你一个序列X&#xff0c;请你求出序列X中每个数分别作为a,b,c,d的个数。…

NOIP 2016 普及组

文章目录 T1 买铅笔T1分析 T2 回文日期T2分析 T3 海港T3分析 T4 魔法阵T4分析 T1 买铅笔 题目点击→计蒜客 [NOIP2016]买铅笔 题目描述 P 老师需要去商店买 n n n 支铅笔作为小朋友们参加 NOIP 的礼物。她发现商店一共有 3 3 3 种包装的铅笔&#xff0c;不同包装内的铅笔数…

题解 【NOIP2016】魔法阵

【NOIP2016】魔法阵 Description 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法量。 大魔法师有m个魔法物品,编号分别为1,2,...,m。每个物品具有一个魔法值,我们用xi表示编号为i的物品的魔法值。每个魔法值xi是不超过n的正整数,可能有多个物品的魔…

NOIP2016总结

Day1&#xff1a; T1&#xff1a;模拟&#xff1b; 1 #include<iostream>2 #include<cstdio>3 #include<cstdlib>4 #include<cstring>5 #include<string>6 #include<ctime>7 #include<cmath>8 #include<set>9 #include<map…

2016noip-问题求解超级详细解

noip2016普及组问题求解 从一个44的棋盘&#xff08;不可旋转&#xff09;中选取不在同一行也不在同一列上的两个方格&#xff0c;共有&#xff08; &#xff09;种方法。 解题&#xff1a;首先是如下棋盘 于是我们发现这是组合问题&#xff0c;也就是从16个格子中选择两个格子…

MIPI D-PHY C-PHY

MIPI可分为物理层和逻辑层两大部分。物理层尽可能采用通用内容&#xff0c;逻辑层则是分别面向摄像头、显示屏、移动通信、存储等不同用途的专用协议。MIPI的物理层有D-PHY、M-PHY、C-PHY等3种。D-PHY现在大量应用于应用处理器与显示屏、摄像头连接的部分。随着摄像头、显示屏的…

以太网phy学习

关键词 10BASE2:采用细同轴电缆接口的IEEE 802.3 10Mb/s物理层规格(参见IEEE 802.3 Clause 10.) 10BASE5:采用粗同轴电缆接口的IEEE 802.3 10Mb/s物理层规格(参见IEEE 802.3 Clause 8.) 10BASE-F:采用光纤电缆接口的IEEE 802.3 10Mb/s物理层规格(参见IEEE 802.3 Clause 15.) 1…

M-PHY协议解读一:M-PHY整体概述

1.1 M-PHY整体概述 M-PHY协议思维导图如下&#xff1a; 思维导图主要分为两大部分&#xff1a;M-PHY基本特点和基本概念。第一部分对M-PHY的基本特点进行描述&#xff0c;通过与D-PHY/C-PHY多个维度的对比分析&#xff0c;对M-PHY有一个整体的基本认识&#xff1b;第二部分对M…

以太网PHY 开发与解析

目录 1.PHY芯片介绍 1.1 芯片引脚定义和说明 1.2 PHY芯片功能说明 1.3 供电管理 1.4 寄存器说明 1.4.1 控制寄存器 1.4.2 状态寄存器 1.4.3 PHY ID寄存器 1.4.4 自协商广播寄存器 1.4.5 自动协商链接合作伙伴能力寄存器 1.4.6 自动协商扩展寄存器 1.4.7 AVICOM指定…

PHY MAC

常用网卡芯片 DM9000 MAC(数据链路层)PHY(物理层) CS8900 PHY LAN91C111 MACPHY PHY 百科名片 PHY指物理层&#xff0c;OSI的最底层。 一般指与外部信号接口的芯片。 以太网PHY芯片 。小小的不起眼但又无处不在的网卡。如果在5年前&#xff0…

MIPI C-PHY 与 D-PHY

MIPI&#xff1a;即移动产业处理器接口&#xff08;Mobile Industry Processor Interface 简称MIPI&#xff09;联盟&#xff1b;是MIPI联盟发起的为移动应用处理器制定的开放标准和一个规范。 CSI&#xff1a;MIPI-CSI-2协议是MIPI联盟协议的子协议&#xff0c;专门针对摄像头…

MIPI系列之“C-PHY”

本篇主要介绍物理层WG中的C-PHY。C-PHY基于3-Phase symbol编码技术&#xff0c;通过three-wire trios传输2.28 bits/symbol&#xff0c;其目标速率是2.5Gsymbols/s。C-PHY与D-PHY有许多共同点&#xff0c;C-PHY的绝大部分特性都是从D-PHY改编而来的。C-PHY被设计成能够与D-PHY在…

ethernet phy

phy处于physical层&#xff0c;上一层是data link层&#xff1a;MAC&#xff0c;两者通过xMII和MDIO接口通信。 xMII XMII包含MII(802.3 sec22&#xff0c;适用于10M和100M传输)&#xff0c;GMII(802.3 sec35.2.2&#xff0c;适用于1000M传输)&#xff0c;RGMII(GMII的简化版)…

USB的PHY

Linux USB 3.0驱动分析&#xff08;六&#xff09;——USB主机控制器HCD分析 网卡芯片,也有 controller(mac芯片) 和 PHY部分 USB 芯片,也有 controller 和 PHY部分 5G 芯片,也有 协议层 和 PHY部分USB主机控制器和USB PHY是如何完成收发数据的 USB 全套硬件组成ControllerC…

PHY芯片

以太网媒体接入控制器(MAC) 物理接口收发器(PHY) 以太网接口可分为协议层和物理层。 协议层是由一个叫MAC(Media Access Layer&#xff0c;媒体访问层)控制器的单一模块实现。 物理层由两部分组成&#xff0c;即PHY(Physical Layer&#xff0c;物理层)和传输器。 常见的网卡芯片…

C-PHY技术是什么

2018年5月17日&#xff0c;一加发布了自家旗舰手机一加6&#xff0c;在相机的宣传图片中&#xff0c;首次见到提起C-PHY技术和Type-2对焦这两个概念&#xff0c;于是经过在网络的挖掘和学习&#xff0c;先总结下C-PHY技术的基本概念 C-PHY技术来自哪里 图像传感器&#xff0c;…

MIPI 系列之 D-PHY

目录 1、简述 2、管脚连接 3、D-PHY 的时钟 4、D-PHY Lane (Clock Lane And Data Lane) 4.1、信号摆幅 4.2、信号含义 4.3、状态码 5、传输特性和方向 6、D-PHY Data Lane 6.1、高速 Data Lane 传输 6.2、双向传输 Data Lane Turnaround 6.3、Data Lane 的 Escape …

PHY- PHY芯片概述

1 PHY概述 关于Internet Protocal的分层模型可以参考文章 :【Internet Protocal-OSI模型中的网络分层模型】,下面我们讲讲底层以太网控制器和收发器的知识。其主要是处理OSI模型中的物理层和链路层的事情。 在CAN/CANFD、FlexRay等总线中,有控制器Controller和收发器Transc…

以太网PHY原理介绍

一、以太网分层模型 基于 OSI 七层网络模型&#xff0c; 车载以太网的网络拓扑结构如图1-1所示。 图1-1 车载以太网网络拓扑结构图 从图中可以看到位于 Layer1 和 Layer2 的为物理层和数据链路层。 Layer3 以上各层包含了 TCP/IP、 DOIP、SomeIP 等协议&#xff0c; 由 EthSt…