2024.11.14 鲜花

news/2024/11/14 20:46:19/文章来源:https://www.cnblogs.com/xrlong/p/18546751

双调排序的正确性证明暨第八交响曲题解

推歌:Double Agent

好多题解都写的或多或少有问题(包括那篇 \(30\) 分钟速通),终于是整明白了。

首先给出双调序列的定义:满足一下条件之一的序列

  1. \(\exists k, \forall i<k,a_i>a_{i+1} \land \forall i>k,a_i<a_{i+1}\) 即是单谷。
  2. 其可以通过循环位移满足 1

注意到根据定义 \(5,6,7,6,5,1,2,3\) 是双调序列,因为其可以通过循环位移成 \(6,5,1,2,3,5,6,7\),这里有很多题解都是错的,大多是说是单峰或单谷,GGrun 有 hack 1,2,8,7,6,5,4,3

过程不再解释,但是需要指出的是,双调序列满足从中间分成相等两段后依次经过 Batcher 比较器(即 Compare And Swap 操作)后满足左右两段都是双调序列并且左边所有值都小于右边所有值,并不需要重新构造。

如果这个结论是真的,那么整个算法的正确性是显然的,考虑证明这个结论。

首先应用高德纳的 \(0-1\) 原理,即对于任意排序算法,若其能对 \(0/1\) 序列排序,则其能对所有序列排序。

证明大致就是考虑二进制分解,其对于每一位都能排对。

考虑一个双调的 \(0/1\) 序列,容易发现其收尾相接一定最多只有连续的一段 \(1\)

对于没有 \(1\)\(0\),算法显然正确。

然后考虑分讨 \(0/1\) 位置和划分区间,下面用 \(00011|10000\) 序列 \(0001110000\) 分成 \(00011\)\(10000\) 两段。

  1. 形如 \(0011111000\) 的序列,即 \(1\) 是连续一段:

    • \(00001|11000\) 即划分到 \(1\)\(1\) 中间:

      容易发现其左边一定是前缀,右面一定是后缀,所以若两边的按位与不为 \(0\),则经过交换后右边一定是连续的一段 \(1\),左边经过将一定后缀变成 \(0\) 也一定最多存在一段连续的 \(1\),满足定义。

      若按位或是 \(0\),其左边一定是 \(0\),右边一定是一段前缀加一段后缀。

    • \(00110|00000\) 即没有划分到 \(1\)\(1\) 中间:

      容易发现其经过交换后右边一定是连续的一段 \(1\),左边一定全是 \(0\),满足定义。

类似分讨 \(11100011\),即是前后缀的划分点,容易证明其算法的正确性。

Code
#include<bits/stdc++.h>
using namespace std;
using llt=long long;
using llf=long double;
using ull=unsigned long long;
#define endl '\n'
#ifdef LOCALFILE *InFile=freopen("in_out/in.in","r",stdin),*OutFile=freopen("in_out/out.out","w",stdout);
#elseFILE *InFile=freopen("symphony.in","r",stdin),*OutFile=freopen("symphony.out","w",stdout);
#endifconst int N=203;
int n,md;struct V{int l,r,d; V(int a,int b,int c):l(a),r(b),d(c){}};
vector<V> aas[13];void Srt(int l,int r,int d,vector<V> &c){if(l==r) return ;else{int mid=l+r>>1;for(int a=l,b=mid+1;a<=mid&&b<=r;++a,++b) c.emplace_back(a,b,d);Srt(l,mid,d+1,c),Srt(mid+1,r,d+1,c);}
}
void PSrt(int l,int r,int d,vector<V> &c){int mid=l+r>>1;for(int a=mid,b=mid+1;b<=r&&a>=l;--a,++b) c.emplace_back(a,b,d);Srt(l,mid,d+1,c),Srt(mid+1,r,d+1,c);
}void Slv(int l,int r,int d){if(l==r) return ;else{int mid=l+r>>1; md=max(md,d);Slv(l,mid,d+1),Slv(mid+1,r,d+1);PSrt(l,r,0,aas[d]);}
}int main(){ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);cin>>n; int r=1; while(r<n) r<<=1;Slv(1,r,1);int cnt=0;for(int i=md;i;--i){sort(aas[i].begin(),aas[i].end(),[](const V &a,const V &b){return a.d<b.d;});int la=0;for(auto k:aas[i]) if(k.r<=n) if(la!=k.d) ++cnt,la=k.d;++cnt;}cout<<cnt<<endl;for(int i=md;i;--i){int la=0;for(auto k:aas[i]) if(k.r<=n){if(la!=k.d) cout<<endl,la=k.d;cout<<"CMPSWP R"<<k.l<<" R"<<k.r<<' ';}cout<<endl;}
}
P

![](https://img2024.cnblogs.com/blog/2918735/202411/2918735-20241114204445091-380552008.jpg

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

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

相关文章

ABB AC900F学习笔记331:使用ST做自定义功能块,计算最近60秒的分钟均值和最近60分钟的小时均值

前面自己学习了在西门子TIA使用SCL编程,施耐德Unity中使用ST编程做分钟均值和小时均值的方法,今晚在家练习了在ABB Freelance中自定义功能块使用ST语言做分钟均值和小时均值。 新建项目、插入硬件、仿真器、操作站等不做介绍。新建一个用户功能块池,下面建一个功能块类。功能…

DBeaver如何设置自动刷新数据库表的数据,彻底解放双手!

前言 大家好,我是小徐啊。 DBeaver是一款常用的数据库连接工具,它的优点是免费使用,而且支持的数据库类型超级多,甚至可以直接安装数据库对应的驱动jar包来连接数据库。 比如达梦数据库,之前版本是可以通过jar包方式设置驱动来连接达梦数据库的。好了,言归正传,今天小徐…

Intellij IDEA如何设置中文版?安装中文汉化包插件?失败问题解决!

前言 大家好,我是小徐啊。 Intellij IDEA默认是英文的操作界面,因为是外国人开发的嘛~对于英文好一点的同学来说,英文就英文吧,但对于英文比较差的同学,就还是希望能够汉化一下,变成熟悉的中文。今天小徐就来介绍下如何在IDEA中安装汉化插件,以及在这过程中,我遇到的奇…

TCP_UDP

TCP, UDP Flood 攻击原理TCP Flood攻击配置环境Windows Server 2016配置服务器管理器,创建一个Web服务器并开启该服务器功能kali配置 vim /etc/network/interfacesifup eth0 开启网络 查看Kali ip 信息:修改路由器信息: 拓扑关系如下所示:GNS 3 中修改路由器 R1:GNS3 中修改…

Python用CEEMDAN-LSTM-VMD金融股价数据预测及SVR、AR、HAR对比可视化

全文链接:https://tecdat.cn/?p=38224 原文出处:拓端数据部落公众号分析师:Duqiao Han股票市场是一个复杂的非线性系统,股价受到许多经济和社会因素的影响。因此,传统的线性或近线性预测模型很难有效、准确地预测股票指数的价格趋势。众所周知,深度学习通过逐层特征转换…

java 反序列化 cc4 复现

java 反序列化 cc4 复现复现环境:jdk<=8u65,commonsCollections=4.0 CommonsCollections4.x版本移除了InvokerTransformer类不再继承Serializable,导致无法序列化.但是提供了TransformingComparator为CommonsCollections3.x所没有的,又带来了新的反序列化危险. cc4的执行命令…

ICMP 重定向攻击

ICMP 重定向攻击原理 ICMP (Internet Control Message Protocol) :Internet 控制报文协议,用于在 IP 主机和 路由器之间传递控制消息(控制消息指网络是否通、主机是否可达、路由器是否可用等)ICMP 重定向 在某些特定情况下,路由器在检测到主机使用非优化路由时,会向主机发送…

java 反序列化 cc3 复现

java 反序列化 cc3 复现版本要求:jdk版本<=8u65,common-collections版本<=3.2.1 在很多时候,Runtime会被黑名单禁用.在这些情况下,我们需要去构造自定义的类加载器来加载自定义的字节码. 类加载机制 双亲委派 这里直接粘别人的了.实现一个自定义类加载器需要继承 ClassLo…

使用Tailwind CSS的几个小Tips

前情 Tailwind CSS 是一个原子类 CSS 框架,它将基础的 CSS 全部拆分为原子级别。它的工作原理是扫描所有 HTML 文件、JavaScript 文件以及任何模板中的 CSS 类名,然后生成相应的样式代码并写入到一个静态 CSS 文件中。Tailwind CSS 快速、灵活、可靠、没有运行时负担。自从接…

给朋友写的爬Steam游戏评论的爬虫

详见配图如果你需要的话,可以从这里下载(包括程序、说明和演示视频): https://pan.baidu.com/s/1lN-DNTB7pVXan94hCsqYUQ?pwd=72mg(本来想传蓝奏云的,但是蓝奏云不支持传图片和视频,而且单文件大小有限制,弄起来会比百度云盘还麻烦)

apisix~限流插件的使用

参考:https://i4t.com/19399.html https://github.com/apache/apisix/issues/9193 https://github.com/apache/apisix/issues/9830 https://apisix.apache.org/docs/apisix/plugins/limit-conn/ https://blog.frankel.ch/different-rate-limits-apisix/在 Apache APISIX 中,限…

项目冲刺11.14

这个作业属于哪个课程 计科22级34班这个作业要求在哪里 作业要求这个作业的目标 进行为期七天的项目冲刺并记录前言 本篇博客是项目冲刺的第六篇,七篇博客的汇总如下:博客汇总第一篇博客第二篇博客第三篇博客第四篇博客第五篇博客第六篇博客第七篇博客团队简介队名 拖延是你不…