CF Round 1011 题解合集

news/2025/3/31 12:04:31/文章来源:https://www.cnblogs.com/Kenma/p/18797978

here.

挺有意思的一场,但是我真不会 F2。

D

考虑把这个过程反过来,从后往前做,题意转化为每次进行两次操作中的一个:

  • \(r \to r+1\)

  • \(r \to r-k,ans\to ans+d_i\)

你发现这是一个经典的反悔贪心模型。

考虑用小根堆维护目前选择的 \(d_i\),然后每次能选就选,不能选考虑用之前的最小值尝试替换。

复杂度 \(O(n \log n)\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,n,k,ans,cnt,a[2000005];
priority_queue<int,vector<int>,greater<int> > q;
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>t;while(t--){cin>>n>>k;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=n;i>=1;i--){if(cnt<k){if(q.size() && q.top()<a[i]){q.pop();q.push(a[i]);}cnt++;}else{cnt-=k;q.push(a[i]);}}ans=cnt=0;while(q.size()){ans+=q.top();q.pop();}cout<<ans<<'\n';}return 0;
}

E

纯种诈骗题不是。

考虑两个序列的和做差,记为 \(d\),一定是 \(k\) 的倍数。

然后枚举 \(d\) 的所有因数,暴力检查它们是不是合法的 \(k\)

注意 \(d=0\) 时,因为 \(0\) 是所有数的倍数,所以我们直接检查 \(10^9\) 是否合法就行。

复杂度 \(O(能过)\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf=1e9;
int t,n,a[200005],b[200005],c[200005],suma,sumb,k,ans;
bool check(int k){if(k>inf) return false;for(int i=1;i<=n;i++){c[i]=a[i]%k;}sort(c+1,c+1+n);for(int i=1;i<=n;i++){if(b[i]!=c[i]) return false;}return true;
}
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>t;while(t--){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];suma+=a[i];}for(int i=1;i<=n;i++){cin>>b[i];sumb+=b[i];}sort(b+1,b+1+n);k=suma-sumb;if(k<0){cout<<-1<<'\n';}else{if(!k && check(inf)) ans=inf;for(int i=1;i*i<=k;i++){if(k%i==0){if(check(k/i)){ans=k/i;break;}else if(check(i)){ans=i;break;}} }if(ans) cout<<ans<<'\n';else cout<<-1<<'\n';}suma=sumb=k=ans=0;}return 0;
}

F1

考虑这个移动的过程,相当于在序列中每个颜色选择一个位置,然后让它们向中间靠拢,形成一段连续的区间。

考虑枚举区间和区间中点,我们希望每个颜色选择距离中点最近的一个,这个选择的过程也可以循环找出。

找出所有位置后,把它们排序,依次匹配 \([l,r]\) 中的点。

然后就做完了,复杂度 \(O(n^2 \log n)\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf=1e18;
int t,n,k,ans,sum,a[3005],pos[3005];
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>t;while(t--){cin>>n>>k;for(int i=1;i<=n;i++){cin>>a[i];}ans=inf;for(int l=1,r=k,mid=(l+r)>>1;r<=n;l++,r++,mid++){memset(pos,-1,sizeof(pos));pos[a[mid]]=mid;for(int i=1;i<=n;i++){if(mid-i>=1 && pos[a[mid-i]]==-1) pos[a[mid-i]]=mid-i;if(mid+i<=n && pos[a[mid+i]]==-1) pos[a[mid+i]]=mid+i;}sum=0;sort(pos+1,pos+1+k);for(int i=l;i<=r;i++){sum+=abs(pos[i-l+1]-i);}ans=min(ans,sum);}cout<<ans<<'\n';}
}

F2

考虑上面那个做法实在是太朴素了,能不能加点合并处理的部分。

首先我们把区间中点左边第一个遇到颜色为 \(i\) 的位置记为 \(l_i\),区间右边第一个遇到颜色为 \(i\) 的位置记为 \(r_i\)

那么实际上我们求的是 \(\sum_{i=1}^{k} \min(l_i,r_i)\)

考虑区间中点每次右移一位,\(\min(l_i,r_i)\) 只会 \(+1,-1\) 或者不变,具体地,设颜色 \(i\) 两次相邻出现的位置是 \(a,b\),那么当区间中点在 \(\frac{a+b}{2}\) 左侧时,移动一位增加 \(1\),在 \(\frac{a+b}{2}\) 右侧时,移动一位减少 \(1\),注意判断 \((a+b)\) 是奇数的情况。

然后其实可以差分求出贡献的,然后就做完了,但是实现上细节太多并不是很好调。

复杂度 \(O(n)\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf=1e18;
int t,n,k,s,d,ans,a[400005],lst[400005],sum[400005];
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>t;while(t--){cin>>n>>k;ans=inf;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n;i++){lst[a[i]]=sum[i]=0;}s=d=0;for(int i=1;i<=n;i++){if(!lst[a[i]]){s+=i-1;}else{int pre=lst[a[i]],mid=(pre+i)>>1;if((pre+i)&1) sum[mid]--,sum[mid+1]--;else sum[mid]-=2;}sum[i]+=2;lst[a[i]]=i;}d=-k;for(int i=1;i<=n;i++){ans=min(ans,s);d+=sum[i];s+=d;}for(int i=1;i<=k;i++){ans-=abs((k+1)/2-i);}cout<<ans<<'\n';}return 0;
}

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

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

相关文章

MCR106-ASEMI电机驱动专用MCR106

MCR106-ASEMI电机驱动专用MCR106编辑:LL MCR106-ASEMI电机驱动专用MCR106 型号:MCR106 品牌:ASEMI 封装:TO-92 阻断电压:600V 通态电流:2.55A 类型:单向可控硅 工作温度:-40℃~150℃ 在工业电机控制、大功率电源设备和新能源系统中,如何以更小损耗、更高可靠性应对频繁…

实战指南:智慧碳中和管理平台搭建全流程解析(一)

在“双碳”目标的推动下,企业正面临日益严格的碳排放监管要求。然而,当前的碳管理模式仍存在诸多痛点:数据采集渠道分散,难以形成统一的碳排放账本;碳核算流程复杂,依赖人工统计,效率低且易出错;减排策略缺乏精准测算,难以优化碳资产配置。此外,碳交易市场的发展对企…

基于MQTTX订阅端搭建及基于Qt的发布端搭建

1、基于MQTTX创建MQTT订阅端 MQTTX下载地址为:https://mqttx.app/zh,下载安装后,打开软件界面如下图所示2、创建新的链接 在上图基础上点击“New Connection”按钮,弹出如下所示界面按照图中填充界面相关内容后点击右上角“Connect”按钮进行与服务端的链接,连接成功后如下…

通过Linux包管理器提升权限

在Linux系统中,apt和yum是两种常见的包管理工具,分别用于Debian/Ubuntu和CentOS/RHEL等发行版,如果配置不当极有可能导致linux提权问题,进而导致服务器受到安全威胁。免责声明:本文所涉及的技术仅供学习和参考,严禁使用本文内容从事违法行为和未授权行为,如因个人原因造…

EDMI电表 mk6es关口表数据采集远程抄表点位信息表各种规约协议网关盒子全匹配

正向有功总电量:0169 正向有功峰电量:0160 正向有功平电量:0161 正向有功谷电量:0162 正向有功尖峰电量:0163反向有功总电量:0069 反向有功峰电量:0060 反向有功平电量:0061 反向有功谷电量:0062 反向有功尖峰电量:0063正向无功总电量:0369 正向无功峰电量:0360 正…

DeepSeek 3FS 架构分析和思考(上篇)

资料来源:火山引擎-开发者社区 2025 年 2 月28 日,DeepSeek 在其开源周最后一天压轴发布了自研的并行文件系统 Fire-Flyer File System,简称 3FS。该系统支撑了 DeepSeek V3&R1 模型训练、推理的全流程,在数据预处理、数据集加载、CheckPoint、KVCache 等场景发挥了重要…

Smooth min-entropy

信息论的神奇妙妙工具——Smoothed entropy (平滑熵) 回顾min-entropy 首先有\(\infty\)-divergence \[D_{\infty}(P \| Q) = \max_{x} \log \frac{P(x)}{Q(x)} \]用\(D_{\infty}\)定义min-entropy \[\begin{aligned}H_{\min}(X) &= - D_{\infty}(P_X\| 1) = -\log \ma…

Vue3封装支持Base64导出的电子签名组件

效果图准备工作 组件内用到elementPlus,vue-esign组件,使用前提前安装好。组件代码 <template><!-- 签名容器 --><div class="sign-container" ><div class="sign-preview" :class="[sizeClass, { has-sign: base64Img }]&quo…

产品经理研读:Agent的九种设计模式(图解+代码)

资料来源:火山引擎-开发者社区 引言 上周五我在一个社群里做了一次分享,题目是《从 YC 项目看 AI 趋势以及 AI agent 开发工具类产品该如何设计》,收到了大家不错的反馈,这篇文章和大家详细讲讲分享中提到的 Agent设计模式 1.Agent 的九种设计模式。 先来一张图镇楼,欢迎大…