[ICPC 2022 Nanjing R] 聊天程序题解
摘要:本文提出一个序列操作优化问题,要求在给定整数序列上至多执行一次特定等差数列加法操作,使得操作后序列的第k大值最大化。输入包括序列长度n、目标排名k、等差数列参数m、c、d,以及初始序列。通过二分查找结合贪心策略,判断是否存在操作能使至少k个元素达到目标值。算法使用差分数组优化区间统计,时间复杂度为O(n log(max_value))。三个样例展示了不同情况下的最优解,包括选择最优操作位置和
题目描述
您是国际聊天程序公司(International Chatting Program Company,ICPC)的研究员。今天,您在浏览研究数据时,发现了以下聊天记录。
SUA(2022/12/04 23:01:25)
我已经用光了程序设计竞赛题目的点子!请给我一道关于序列的题目。
机器人(2022/12/04 23:01:27)
当然可以,下面是一道关于序列的程序设计竞赛的题目。
给定一个长度为 n 的整数序列 a1,a2,⋯,an,同时给定另外四个整数 k,m,c 与 d,您的目标是最大化序列中第 k 大的值。
为了达成这一目标,您可以进行以下操作至多一次:选择一个长度恰为 m 的连续子数组,并将一个长度为 m,首项为 c,公差为 d 的等差序列加到该连续子数组上。
更正式地,您可以选择一个整数 p 满足 1≤p≤n−m+1,并对于所有 0≤i<m,将 ap+i 增加 (c+di)。
求至多一次操作之后,序列中第 k 大的值最大可能是多少。
序列中第 k 大的值,指的是将序列从大到小排序后,位于序列第 k 项的值。例如,序列 {5,7,1,9} 中,第 3 大的值为 5;而序列 {9,7,5,9} 中,第 3 大的值为 7。
SUA(2022/12/05 00:15:17)
这道题目好像很难!请告诉我它的解法。
机器人(2022/12/05 00:15:30)
当然可以。首先,我们可以...
[数据删除]
遗憾的是,部分聊天记录由于硬盘损坏而丢失了。您为聊天程序可以创造程序设计竞赛的题目而感到非常惊奇。为了验证聊天程序是否能创造有效的题目,您决定尝试解决这道题目。
输入格式
每个测试文件仅有一组测试数据。
第一行输入五个整数 n,k,m,c 和 d(1≤k,m≤n≤2×105,0≤c,d≤109)表示序列的长度,您的目标,等差序列的长度,首项和公差。
第二行输入 n 个整数 a1,a2,⋯,an(0≤ai≤109)表示给定的序列。
输出格式
输出一行一个整数,表示至多一次操作之后,序列中第 k 大的值最大可能是多少。
输入输出样例
输入 #1复制
6 4 3 1 2 1 1 4 5 1 4
输出 #1复制
4
输入 #2复制
7 3 2 4 0 1 9 1 9 8 1 0
输出 #2复制
9
输入 #3复制
8 3 5 0 0 2 0 2 2 1 2 1 8
输出 #3复制
2
说明/提示
对于第一组样例数据,可以选择 p=3 使序列变为 {1,1,5,8,6,4}。序列中第 4 大的值为 4。
对于第二组样例数据,可以选择 p=5 使序列变为 {1,9,1,9,12,5,0}。序列中第 3 大的值为 9。
对于第三组样例数据,容易发现操作不改变序列的值,因此我们选择不进行操作。序列中第 3 大的值为 2。

OpenAI ChatGPT 正在鼓励选手
思路
二分判断能否,内部贪心即可。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long n,k,m,c,d,a[200005],st[200005];
bool abc(long long a1){
for(int i=0;i<=n;i++){
st[i]=0;
}
for(int i=1;i<=n;i++){
if(a[i]>=a1){
st[1]++;
}
else if(a[i]+c+min(m-1,(long long)i-1)*d>=a1){
st[max(1ll,i-m+1)]++;
if(d!=0){
st[min((long long)i,i-(a1-a[i]-c+d-1)/d)+1]--;
}
else{
st[i+1]--;
}
}
}
long long gh=0,qd=0;
for(int i=1;i<=n-m+1;i++){
gh+=st[i];
if(gh>=k){
qd=1;
}
}
return qd;
}
int main(){
cin>>n>>k>>m>>c>>d;
for(int i=1;i<=n;i++){
cin>>a[i];
}
long long l=0,r=1e18+7,md=0;
while(l<=r){
long long mid=(l+r)/2;
if(abc(mid)==1){
md=max(md,mid);
l=mid+1;
}
else{
r=mid-1;
}
}
cout<<md<<endl;
return 0;
}
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)