首页 > 其他分享 >2024.11.14 鲜花

2024.11.14 鲜花

时间:2024-11-14 20:42:58浏览次数:1  
标签:2024.11 双调 鲜花 int mid long 序列 out 14

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

推歌: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

upd:这个 hack 是双调,或者说所有的单峰和单谷都是双调,hack 的地方是将它拆开后 1,2,4,3|6,5,8,76,5,8,7 不是单峰或单谷,但它是双调

过程不再解释,但是需要指出的是,双调序列满足从中间分成相等两段后依次经过 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 LOCAL
	FILE *InFile=freopen("in_out/in.in","r",stdin),*OutFile=freopen("in_out/out.out","w",stdout);
#else
	FILE *InFile=freopen("symphony.in","r",stdin),*OutFile=freopen("symphony.out","w",stdout);
#endif

const 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


标签:2024.11,双调,鲜花,int,mid,long,序列,out,14
From: https://www.cnblogs.com/xrlong/p/18546751

相关文章

  • 14.策略者模式设计思想
    14.策略者模式设计思想目录介绍01.策略模式基础介绍1.1策略模式由来1.2策略模式定义1.3策略模式场景1.4策略模式思考1.5策略模式的重心1.6理解策略唯一性1.7主要解决的问题02.策略模式原理2.1罗列一个场景2.2用例子理解策略2.3需求普通实现2.4案例......
  • 241114 noip 模拟赛
    省流:\(90+100+20+10\)。t1t2花太久时间了。T1题意:给一张\(n\timesm\)的网格图,\((x,y)\)与\((x+1,y)\)的边为\(a_x+b_y\),\((x,y)\)与\((x,y+1)\)的边为\(c_x+d_y\)。求这张图的最小生成树的边权和。\(n,m\leq10^6\)。稍微画图注意到,一个点一定跟它......
  • 2024/11/14日 日志 关于 MVC 分层开发模式
    MVC是一种分层开发的模式,是我们在完成项目时常用的开发模式。点击查看代码--MVC模式--MVC是一种分层开发的模式,其中:--M:Model,业务模型,处理业务--V:View,视图,界面展示--C:Controller,控制器,处理请求,调用模型和视图----MVC好处--职责单一,互不影响--有利于分......
  • 项目冲刺11.14
    这个作业属于哪个课程计科22级34班这个作业要求在哪里作业要求这个作业的目标进行为期七天的项目冲刺并记录前言本篇博客是项目冲刺的第六篇,七篇博客的汇总如下:博客汇总第一篇博客第二篇博客第三篇博客第四篇博客第五篇博客第六篇博客......
  • 2024/11/14
    修改数组(蓝桥杯)分数20作者liudan单位石家庄铁道大学给定一个长度为N的数组A=[A1,A2,⋅⋅⋅AN],数组中有可能有重复出现的整数。现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改A2,A3,⋅⋅⋅,AN。当修改Ai时,小明会检查Ai是否在A1∼Ai−1中出......
  • 2024.11.14随笔&联考总结
    前言今天联考直接炸纲了。但是不得不说:HEZ的题要比BSZX好多了。联考今天联考题说实话难度应该比较适合我。第一题是推结论的题,我赛时20min想出正解,但是有两个细节没有考虑清楚,导致后来调题调了一个多小时,然后经典开警告但是不看秒了,期望得分100pts,实际0pts。原因bool......
  • PH热榜 | 2024-11-14
    DevNow是一个精简的开源技术博客项目模版,支持Vercel一键部署,支持评论、搜索等功能,欢迎大家体验。[在线预览](https://www.laughingzhu.c1.Vocera标语:利用模拟和监控加速语音代理上线这句话的意思是:通过使用模拟和监控工具,可以更快地开发并上线语音代理。解释:语......
  • UML精髓:带你读懂14种核心类型与流程图的绝妙之处
    目录 一、 什么是UML二、UML图的类型(1)活动(流程)图(2)用例图(3)交互概览图(4)时序图(6)序列图(7)通信UML图(8)类图(9)对象图(10)组件图(11)组合结构图(12)部署图(13)包图(14)剖面图三、流程图大揭秘(1)流程图中最重要的符号汇总(2)那么多样式的箭头,到底都是什么意思?四、 总结......
  • CTF攻防世界小白刷题自学笔记14
    fileclude,难度:1,方向:Web题目来源:CTF题目描述:好多file呀!给一下题目链接:攻防世界Web方向新手模式第17题。打开一看,这熟悉的味道,跟上一篇文章基本一摸一样的,我感觉我又行了。都是include,肯定是利用文件包含来绕过漏洞直接打开flag.php的内容。请牢记传奇php语句@include(......
  • 2024.11.14 NOIP训练赛
    2024.11.14NOIP训练赛Problem对满足以下条件的01矩阵\(A\)计数:行数为\(n+1\)(从\(0\)至\(n\)标号),列数为\(k\)(从\(1\)至\(k\)标号);不存在使得\(A_{0,i}\simA_{n-1,i}\)这\(n\)个数都为\(1\)的列\(i\);存在使得\(A_{1,i}\simA_{n,i}\)这\(n\)......