题解:P7818 [RC-05] 排列

news/2025/2/11 18:44:56/文章来源:https://www.cnblogs.com/Red-maple/p/18710307

luogu

题意

够清晰了,不再赘述。

思路

首先,由于是字典序,所以我们要让前几位尽量小,也就是要让第 \(i\) 位取到 \(\min^{\min(n,i+k)}_{j=i}p_j\),假设取到了 第 \(i+o\) 位,取完后相应的让 \(k=k-o\),并把它移到第 \(i\) 位,于是考虑如何维护。

接着,我们可以先维护一个区间和并支持区间加的线段树,因为把第 \(i+o\) 位移到 \(i\) 位,就是把 \([i+o,n]\) 这一段区间内移到未取到的值的最前面所需要的次数减一,我们就可以将第 \(i\) 位移到未取到的值的最前面所需要的次数的初值设为 \(i-1\)。这样,我们查找最小值的区间右端点就可以用二分求出,即二分找到第一个移到未取到的值的最前面所需要的次数大于 \(k\) 的地方 \(r\),然后查找区间的右端点就取 \(r-1\)

然后,我们再维护一个区间最小值并支持单点修改的线段树,可以查找 \([i,r-1]\) 这一区间内的最小值 \(p_{min}\),并在查询完后将这个最小值压入答案队列并修改为无穷大,这样就不会再取到。然后在找到最小之后就可以在维护的第一个线段树中把 \([min,n]\) 这一段区间内的到未取到的值的最前面所需要的次数都减一。然而上述操作只在维护的第二个线段树中维护一个最小值是不够的,所以还要维护一个编号。

最后,注意到题目中要求的是恰好 \(k\) 次,所以当所有位置都填完后 \(k\) 是一个奇数,那就交换答案的最后两个位置,可以证明这是最优的。然后输出。

代码

//by _maple_leaf_ uid:964876
void push_down(int id,int l,int r){tr[id<<1]+=tr[id];tr[id<<1|1]+=tr[id];tr[id]=0;
}
void build(int id,int l,int r){if(l==r){tr[id]=l-1;return ;}int mid=l+r>>1;build(id<<1,l,mid);build(id<<1|1,mid+1,r);
}
void update(int id,int l,int r,int s,int t,int v){if(s<=l&&r<=t){tr[id]+=v;return ;}push_down(id,l,r);int mid=l+r>>1;if(s<=mid)update(id<<1,l,mid,s,t,v);if(mid<t)update(id<<1|1,mid+1,r,s,t,v);
}
int find(int id,int l,int r,int x){if(l==r)return tr[id];push_down(id,l,r);int mid=l+r>>1;if(x<=mid)return find(id<<1,l,mid,x);else return find(id<<1|1,mid+1,r,x);
}
struct node{int z,id;//维护的编号bool operator <(const node &b)const{return z==b.z?id<b.id:z<b.z; }//重载运算符方便比较
}trr[N<<2];
void init(int id,int l,int r){if(l==r){trr[id]={a[l],l};return ;}int mid=l+r>>1;init(id<<1,l,mid);init(id<<1|1,mid+1,r);trr[id]=min(trr[id<<1],trr[id<<1|1]);
}
void gx(int id,int l,int r,int x,int v){if(l==r){trr[id].z=v;return ;}int mid=l+r>>1;if(x<=mid)gx(id<<1,l,mid,x,v);else gx(id<<1|1,mid+1,r,x,v);trr[id]=min(trr[id<<1],trr[id<<1|1]);
}
node get(int id,int l,int r,int s,int t){if(s<=l&&r<=t){return trr[id];}int mid=l+r>>1;node ret={1919810,114514};if(s<=mid)ret=min(ret,get(id<<1,l,mid,s,t));if(mid<t)ret=min(ret,get(id<<1|1,mid+1,r,s,t));return ret; 
} 
vector<int>ans;
bool f[N];
signed main(){n=read(),k=read();for(int i=1;i<=n;i++)a[i]=read();build(1,1,n);init(1,1,n);//初始化for(int i=1;i<=n;i++){int l=1,r=n;while(l<r){int mid=l+r>>1;if(find(1,1,n,mid)>k)r=mid;else l=mid+1;}//二分查找node tmp;if(find(1,1,n,r)>k)tmp=get(1,1,n,1,r-1);else tmp=get(1,1,n,1,r);ans.push_back(tmp.z);k-=find(1,1,n,tmp.id);gx(1,1,n,tmp.id,1919810);//修改为无穷大update(1,1,n,tmp.id+1,n,-1);}if(k&1ll)swap(ans[n-2],ans[n-1]);for(auto i:ans)write(i,-1);return 0;
}

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

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

相关文章

另辟新径实现 Blazor/MAUI 本机交互(一)

本系列由浅入深逐个文件解析工作原理 目录:WebViewNativeApi.cs NativeApi.cs MainPage.xaml.cs 实战 串口 小票机 蓝牙WebViewNativeApi.cs WebViewNativeApi.cs 文件中的代码实现了一个 NativeBridge 类,用于在 .NET MAUI 应用程序中的 WebView 和本地代码之间进行通信。以下…

AI 如何重塑劳动力市场:基于 Claude 数据的深度分析

前言 本文翻译自 Anthropic 今天发布的 The Anthropic Economic Index ,经济指数报告,这份报告基于 Claude 的数据对目前的 AI 使用情况做了汇总。 引言 在未来的几年里,人工智能系统将对人们的工作方式产生重大影响。因此,我们推出了 Anthropic Economic Index,这是一个旨…

Nacos Python SDK 强势来袭,动态管理大模型 Prompt!

Nacos 从 0.8.0 版本开始就一直参与 Python 生态建设,努力作为 Python 生态中分布式微服务发现和配置管理的解决方案一直往前演进。目前随着 AI 领域的发展,Nacos 社区的 Python 开发者用户越来越多,因此这次我们迭代了 Python 的 GA 稳定版本,对不少历史问题做了修复以及易…

踩坑记录-二分搜索的不同情况

二分搜索的不同情况 二分搜索可以用来查找满足条件的值,但是满足条件的值可能只有1个,也可能有多个。比如查找1的索引,对于【1,1,2,2】来说,就有2个。一般要求的就是:满足条件最大值/满足条件最小值。 二分搜索详细介绍可以参考:https://programmercarl.com/0704.二分…

《ESP32-S3使用指南—IDF版 V1.6》第五章 搭建开发环境

第五章 搭建开发环境 1)实验平台:正点原子DNESP32S3开发板 2)章节摘自【正点原子】ESP32-S3使用指南—IDF版 V1.6 3)购买链接:https://detail.tmall.com/item.htm?&id=768499342659 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/esp32/AT…

内测之家介绍

内测之家:助力应用开发与迭代的专业平台内测之家是一款功能强大且全面的应用内测与管理平台,专为 iOS 和 Android 开发者打造,旨在为他们提供便捷高效、安全可靠的一站式服务。无论是从资源安全到传输安全,还是从数据保护到应用管理、统计分析,内测之家都展现出卓越的能力…

如何用好 AI 编码工具,让通义灵码帮你做更多工作

通义灵码,是阿里云与通义实验室联合打造的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力,提供代码智能生成、研发智能问答能力。通义灵码,是阿里云与通义实验室联合打造的智…

用EXPLAIN检查SQL是否有慢查询

先看下面两张图: 图一 图二 同样都是查询语句,图一的条件采用的是模糊匹配,产生了全表扫面(type:a…

【触想智能】工控一体机在机械臂上应用的四大优势

随着工业自动化的发展,机械臂已成为现代制造业中不可或缺的一部分。为了使机械臂能够高效、精确地执行各种任务,工控一体机的应用变得越来越广泛。触想工控一体机在机械臂上的应用工控一体机是一种集计算、控制和通信于一体的高性能工业计算机,它不仅具备强大的计算能力,还…

CTFShow-Web167:

CTFShow-Web167:.htaccess利用 <button type="button" class="layui-btn" id="upload" lay-data="{url: upload.php, accept: images,exts:jpg}"> 限制上传类型为jpg文件 题目提示httpd,并且404页面返回Apache/2.4.25 (Debian…

对极几何(Epipolar Geometry)总结

为什么stereo很有用? 当我们需要从单一视角恢复结构时,我们的信息来源有以下几种: \(\bullet\) 从标定架可以获取标定架的位置 / 姿态以及相机内参 K。 \(\bullet\) 从无穷远点和线,加上正交的线和平面等信息,可以获取场景的结构和相机内参 K 。 但是由于内在歧义性,从单…