NOIP 2016 提高组 复赛 第二天 第二题 蚯蚓 earthworm AC代码(单调队列)+15分代码(排序)+35分代码(堆 大顶堆 优先队列)+85分代码(更改堆中元素)

article/2025/9/26 10:06:50

NOIP 2016 提高组 复赛 第二天 第二题 蚯蚓  earthworm  AC代码(单调队列)+15分代码(排序)+35分代码(堆   大顶堆  优先队列)+85分代码(更改堆中元素)

总目录详见:NOIP 提高组 复赛 试题 目录 信奥 历年

在线测评地址:https://www.luogu.com.cn/problem/P2827

读题比较辛苦,参数多,需对照样例来读。

要完整的做完此题,三个样例,都需模拟一遍。

1.AC代码

思路部分摘自:https://blog.csdn.net/chen1352/article/details/53339860

这题打暴力,用堆来做,理论上是可以拿80分,所以比赛还是打暴力好。
但是,正解又短又机智。
我们假设x1>x2。
那么x1肯定会在x2之前就被剪断。
设x1被剪成p1和q1,p1=⌊px1⌋,q1=x1−⌊px1⌋
设x2x2被剪成p2和q2,p2=⌊px2⌋,q2=x2−⌊px2⌋
我们可以得到一个很显然的结论,p1>p2,q1>q2,也就是说p1一定会在p2之前被剪断,q1一定会在q2之前被剪断。
我们来简单的证明一下:
假设x1剪断之后到剪断x2经过了i的时间,
那么此时x2=x2+i∗q,p1=⌊px1⌋+i∗q,q1=x1−⌊px1⌋+i∗q
剪断x2之后p2=⌊p(x2+i∗q)⌋,q2=x2+i∗q−⌊p(x2+i∗q)⌋
我们先比较一下p1和p2p1和p2的大小关系:
我们如果不考虑取整的话,p1−p2=p(x1−x2)+q∗(i−i∗p),因为p是小于1的,所式子一定是大于0的。
p2和q2的大小关系同理。
得证。
那么知道了这个结论之后要怎么去用呢。
我们设三个队列,一个a[0],a[1],a[2]。
a[0]预先存原序列的从大到小的排序。
a[1]存px的从大到小排序
a[2]存x-px的从大到小排序
那么每次取出最大的队首,然后拆掉存到a[1]和a[2]中,根据结论这样一定合法。

那么这道题的思路就很明显了,开三个队列,对于第一个队列,存排好序的初始蚯蚓,第二个队列存被切出来的长度为⌊px⌋的蚯蚓,第三个队列存长度为x-⌊px⌋的蚯蚓,每次找出每条队列中长度最大的蚯蚓进行比较,得到在所有蚯蚓中长度最大的那只,拿出来切开再塞回第二第三条队列就好了。

#include <cstdio>
#include <algorithm>
const int maxlongint=2147483647;
const int mo=1000000007;
const int N=7100005;
using namespace std;
struct ddx{int v,t;
}d[3][N];
int s[3],t[3],n,m,tt,q,v,u;
bool cmp(ddx x,ddx y){return x.v>y.v;
}
int get(int i,int x){if(s[i]>t[i]) return -maxlongint;//队列中无元素 return d[i][s[i]].v+q*(x-d[i][s[i]].t-1);
}
int compete(int x){int pos=0;for(int i=0;i<=2;i++){if(s[i]<=t[i])if(get(i,x)>get(pos,x)) pos=i;}return pos;
}
int main(){scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&tt);for(int i=1;i<=n;i++) scanf("%d",&d[0][i].v);sort(d[0]+1,d[0]+1+n,cmp);s[0]=s[1]=s[2]=1;//队首位置 t[0]=n;//队尾位置 for(int i=1;i<=m;i++){int pos=compete(i),val=get(pos,i);//pos在三个队列中的某个队列 if(i%tt==0) printf("%d ",val);s[pos]++;d[1][++t[1]].v=int(u*1.0/v*val);d[2][++t[2]].v=val-int(u*1.0/v*val);d[1][t[1]].t=i;d[2][t[2]].t=i;}printf("\n");for(int i=1;i<=n+m;i++){int pos=compete(m+1),val=get(pos,m+1);if(i%tt==0) printf("%d ",val);s[pos]++;}
}

2.15分代码

思路:

m=0,t=1

因[m/t]=[0/1]=0,注意第一行没有数要输出,但也要输出一个空行。

第二行,只需自大到小输出即可。

 

15分代码如下: 

#include <cstdio>
#include <algorithm>
using namespace std;
int a[100010];
int n,m,u,v,q,t;
int cmp(int a,int b){return a>b;//自大到小输出 
}
int main(){int i;scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);for(i=1;i<=n;i++)scanf("%d",&a[i]);if(m==0){sort(a+1,a+1+n,cmp);printf("\n");for(i=1;i<=n;i++)printf("%d ",a[i]);}return 0;
}

3.35分代码

引入优先队列,按题意操作。

35分代码如下:

#include <cstdio>
#include <algorithm>
#include <queue>
#define LL long long
using namespace std;
LL n,m,q,u,v,t;
LL a[100010],b[7010010];
int cmp(LL a,LL b){return a>b;
}
priority_queue<LL,vector<LL>,less<LL> > pq[2];//大顶堆 
int main(){int i,now=0,bn;LL b1,b2,b3;scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&q,&u,&v,&t);for(i=1;i<=n;i++)scanf("%lld",&a[i]),pq[now].push(a[i]);for(i=1;i<=m;i++){b[i]=pq[now%2].top();pq[now%2].pop();b1=b[i]*u/v;b2=b[i]-b1;while(!pq[(now+1)%2].empty())pq[(now+1)%2].pop();pq[(now+1)%2].push(b1);pq[(now+1)%2].push(b2);while(!pq[now%2].empty()){b3=pq[now%2].top(),pq[now%2].pop();b3+=q;pq[(now+1)%2].push(b3);}now++;}for(i=1;i<=m/t;i++)printf("%lld ",b[i*t]);printf("\n");for(i=1;i<=n+m;i++)b[i]=0;bn=0;while(!pq[now%2].empty()){b[++bn]=pq[now%2].top();pq[now%2].pop();}sort(b+1,b+1+n+m,cmp);for(i=1;i<=(n+m)/t;i++)printf("%lld ",b[i*t]);return 0;
}

 4.85分代码

样例1,改进后的优先队列,模拟过程如下:

0s堆中元素如下,堆顶是3,堆顶将被1s取出
3 3 21s
(1,2) 4 30s的堆顶被取出,值是3,使用值是3+0=3
堆中元素剩下
3 2
将1-1=0,2-1=1加入堆,
堆中元素如下,堆顶是3,堆顶将被2s取出
0 1 3 2
堆中元素,每个都+1可变成
1 2 4 32s
2 3 (1,3) 41s的堆顶被取出,值是3,使用值是3+1=4
堆中元素剩下
0 1 2
将1-2=-1,3-2=1加入堆,
堆中元素如下,堆顶是2,堆顶将被3s取出
0 1 2 -1 1
堆中元素,每个都+2可变成
2 3 4 1 33s                               
3 4 2 4 (1,3)2s的堆顶被取出,值是2,使用值是2+2=4
堆中元素剩下
0 1 -1 1
将1-3=-2,3-3=0加入堆,
堆中元素如下,堆顶是1,堆顶将被4s取出
0 1 -1 1 -2 0
堆中元素,每个都+3可变成
3 4 2 4 1 34s
4 (1,3) 3 5 2 45s
5 2 4 4 (1,4) 3 56s
(1,4) 3 5 5 2 5 4 67s
2 5 4 6 6 3 6 5 (2,4)

85分代码如下:

#include <cstdio>
#include <algorithm>
#include <queue>
#define LL long long
using namespace std;
LL n,m,q,u,v,t;
LL a[100010],b[7010010];
int cmp(LL a,LL b){return a>b;
}
priority_queue<LL,vector<LL>,less<LL> > pq;//大顶堆 
int main(){int i,bn;LL b1,b2,b3;scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&q,&u,&v,&t);for(i=1;i<=n;i++)scanf("%lld",&a[i]),pq.push(a[i]);for(i=1;i<=m;i++){//算法的时间复杂度O(mlogn)b[i]=pq.top()+q*(i-1);pq.pop();b1=b[i]*u/v,b2=b[i]-b1;b1-=q*i,b2-=q*i;pq.push(b1);pq.push(b2);}for(i=1;i<=m/t;i++)printf("%lld ",b[i*t]);printf("\n");for(i=1;i<=n+m;i++)b[i]=0;bn=0;while(!pq.empty()){b[++bn]=pq.top()+q*m;pq.pop();}sort(b+1,b+1+n+m,cmp);for(i=1;i<=(n+m)/t;i++)printf("%lld ",b[i*t]);return 0;
}

 


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

相关文章

后渗透——内网转发之利用EarthWorm与proxifier搭建反向代理服务器

EarthWorm是一款用于开启 SOCKS v5 代理服务的工具&#xff0c;基于标准 C 开发&#xff0c;可提供多平台间的转接通讯&#xff0c;用于复杂网络环境下的数据转发。 Proxifier是一款功能非常强大的socks5客户端&#xff0c;可以让不支持通过代理服务器工作的网络程序能通过HTTP…

【教程】使用Earthworm (EW) 做Socks5代理完成内网穿透

EW 是一套便携式的网络穿透工具&#xff0c;具有 SOCKS v5服务架设和端口转发两大核心功能&#xff0c;可在复杂网络环境下完成网络穿透。 考虑到该工具影响很坏&#xff0c;该工具永久停止更新。 介绍&#xff1a; 示意图&#xff1a; 该工具能够以“正向”、“反向”、“…

内网穿透大杀器--EarthWorm

0x00 前言如果感觉本文对你有帮助&#xff0c;请在文章末尾点个赞&#xff0c;谢谢表哥们支持&#xff01; 当你在内网渗透&#xff0c;并且拿下一台机器的权限时&#xff0c;你是不是觉得已经算是一次完整的渗透了&#xff1f; 不来一次内网漫游&#xff0c;渗透是不完整的&am…

EW(EarthWorm) 反向 socks5 代理

今天本想对学校的内网服务器进行人生中第一次横向渗透&#xff0c;奈何情况不允许&#xff0c;但好歹学习了一些东西&#xff0c;总要写下来保存 工具&#xff1a; EW: https://github.com/idlefire/ew proxychains: https://github.com/rofl0r/proxychains-ng 小米随身wifi…

使用Earthworm (EW) 做Socks5代理

正向代理 1.选择合适的ew文件&#xff08;将文件ew_…改为ew.exe,为了在命令行少敲几个字母&#xff09;&#xff0c;上传到边缘服务器 2.边缘服务器输入 ew.exe -s ssocksd -l 8000 3.可借助proxifier工具配置攻击机整台机器的代理(proxifier添加代理服务器&#xff0c;ip为边…

EarthWorm结合proxifier的使用学习

拿下一个目标机器的web权限后&#xff0c;如何在本机就可以通过这台被拿下webshell的机器访问内网的其他主机的端口服务呢&#xff1f; 拿下一个shell后&#xff0c;想要访问这个shell主机的其他内网机器的服务&#xff0c;可以用earthworm作为一个流量转发&#xff0c;把ew对应…

内网渗透-Earthworm的简单使用(内网穿透工具)

Earthworm的简单介绍&#xff08;一&#xff09; 文章目录 EarthWorm下载地址1. 普通网络 1.1 跳板机存在公网IP 1.1.1 网络环境1.1.2 使用方法1.1.3 流量走向 1.2 跳板机不存在公网IP&#xff0c;可出网 1.2.1 网络环境1.2.2 使用方法1.2.3 流量走向 2. 二级网络 2.1 一级跳…

基于EarthWorm的正反向socks5代理

EarthWorm EarthWorm&#xff08;ew&#xff09;是一套便携式的网络穿透工具&#xff0c;具有 SOCKS v5服务架设和端口转发两大核心功能&#xff0c;能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道&#xff0c;直达网络深处&#xff0c;可在复杂网络环境下完成…

earthworm系列-earthworm介绍

earthworm的官方网站&#xff1a;http://www.earthwormcentral.org 1 Earthworm 简介 Earthworm 项目始于1993 年&#xff0c;主要目的是为了解决美国地震区域台网出现的问题。当时&#xff0c;区域内的地震台网存在的主要问题有&#xff1a;观测设备陈旧&#xff0c;…

内网渗透工具Earthworm简单使用

EW 是一套便携式的网络穿透工具&#xff0c;具有 SOCKS v5服务架设和端口转发两大核心功能&#xff0c;可在复杂网络环境下完成网络穿透。该工具能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道&#xff0c;直达网络深处&#xff0c;用蚯蚓独有的手段突破网络限…

【内网—内网转发】——代理转发_ew(Earthworm)代理转发

文章目录 一、环境准备&#xff1a;二、工具&#xff1a;三、概念&#xff1a;四、学习目的&#xff1a;五、ew(Earthworm)介绍&#xff1a;六、ew(Earthworm)使用说明&#xff1a;七、ew(Earthworm)正向代理(适用于被控服务器拥有一个公网IP)&#xff1a;1. 场景&#xff1a;…

苹果xsmax是什么接口_为什么苹果PD快充线头是银色而非金黄色?原来那根本就不是镀的银...

苹果开放第三方授权后&#xff0c;目前市面上已有不少苹果MFi认证的PD快充线&#xff0c;1小时就能充满iPhone X。苹果PD数据线&#xff0c;即USB-C to Lighting数据线&#xff0c;是苹果自家定义的一套数据线规范&#xff0c;一端为Type-C接口&#xff0c;另一端为苹果Lightin…

PD诱骗方案

方案1 如果在小制作中使用pd诱骗&#xff0c;可以参考国产方案 一个网友的设计 芯片手册提供的原理图如下 原理图1 原理图2 原理图3 原理图4 如果在一些小制作中使用还是比较方便的。 方案2 上面方案缺点仅支持PD2.0&#xff0c;不具有PPS&#xff0c;用于一些简单应用还是…

USB-PD 协议解析 - 简单易懂协议详解

目录 1. 简介 2. USB PD3.0 通信流程 2.1 发送数据包 2.2 接收数据包 2.3 双相标记编码&#xff08;BMC&#xff09; 2.4 符号编码(4B5B) 3. 数据包格式 3.1 前导码&#xff08;Preamble&#xff09; 3.2 SOP*&#xff08;Start of Packet Sequence&#xff09; 3.3 …

雷达干扰技术(一)PD雷达的特征

文章目录 1 多普勒频率2 PD雷达基本原理和组成3 PD雷达的信号特征 1 多普勒频率 雷达使用多普勒频率来提取目标的径向速度&#xff08;距离变化率&#xff09;&#xff0c;以及区分运动和静止目标与物体&#xff0c;例如杂波。 多普勒现象描述了由于目标相对于辐射源的运动而…

详解PD3.0协议

通过65W充电头,给电池充电,中间有个充电芯片CCG3PA,电池可充可放,也就是PD的Power role可以是Source也可以是Sink。 在充电时的PD协议中的Device Discovery,通过SOP_Prime类型的消息进行交互,5个VDO包含了必要信息。其中cable VDO会告知自己是3A还是5A的线,不同的线能承…

PD-1和PD-L1到底是什么?

PD-1全称程序性死亡受体1&#xff0c;英文名字为Programmed Death 1&#xff0c;是一种重要的免疫抑制分子&#xff0c;为CD28超家族成员。以PD-1为靶点的免疫调节在抗肿瘤、抗感染、抗自身免疫性疾病及器官移植存活等方面均有重要的意义。其配体PD-L1也可作为靶点&#xff0c;…

药物相关 PK(药代动力) 、PD(药效)指标知识

1、PK&#xff08;药代动力&#xff09; Pharmacokinetic PK&#xff08;Pharmacokinetics&#xff09;主要研究药物在体内的吸收、分布、代谢和排泄过程&#xff0c;主要包括药物的药代动力学参数&#xff0c;如清除率、半衰期、分布容积等 PK代表药物的药代动力学&#xff…

pd.melt

一、函数 pd.melt( [frame, id_varsNone, value_varsNone, var_nameNone, "value_namevalue", col_levelNone] 参考官方文档 melt: V (使)熔化&#xff0c;融化 pd.melt将多列数据进行融合。 二、参数 id_vars: tuple, list, or ndarray, optional 用作标识符的列…