当前位置: 首页 > news >正文

P8023 [ONTAK2015] Tasowanie 题解

Description

给你两个数组 \(A\)\(B\),长度分别为 \(m\)\(n\)。你每次操作都可以选择一个数组,拿出他的第一个元素并加入数组 \(C\) 的末尾。显然你最后会得到一个长度为 \(n+m\) 的数组 \(C\),你需要使 \(C\) 字典序最小。

\(1\le n,m\le 10^5\)

Solution

先从简单贪心入手。

假设前面已经钦定了 \(i\)\(A\) 中的元素和 \(j\)\(B\) 中的元素,当前需要抉择取 \(A_{i+1}\) 还是 \(B_{j+1}\)。(\(1\le i< n,1\le j<m\)

要求字典序最小,那么显然在 \(C_{i+j+1}\) 上放 \(\min(A_{i+1},B_{j+1})\) 不会对后续决策产生影响。不过当 \(A_{i+1}=B_{j+1}\) 时,我们需要考虑 \(A_{i+1}\)\(B_{j+1}\) 后面第一组不同的数谁大谁小。

形式化来说:

  • \(A_{i+1}>B_{j+1}\),则 \(C_{i+j+1}=B_{j+1}\)\(j=j+1\)\((1)\)
  • \(A_{i+1}<B_{j+1}\),则 \(C_{i+j+1}=A_{i+1}\)\(i=i+1\)\((2)\)
  • \(A_{i+1}=B_{j+1}\),则寻找一个最大的 \(len\),使得 \(A\left [ i+1,i+len\right]=B\left [j+1,j+len \right ]\)\((3)\)
    • \(A_{i+len+1}>B_{j+len+1}\),则 \(C_{i+j+1}=B_{j+len+1}\)\(j=j+1\)
    • \(A_{i+len+1}<B_{j+len+1}\),则 \(C_{i+j+1}=B_{i+len+1}\)\(i=i+1\)

直接暴力模拟复杂度是 \(O(n^2)\) 的,但严重卡不满,这里可以获得 70pts。

#include<bits/stdc++.h>
#define int long long
#define base 13331
using namespace std;
long long n,m,a[200005],b[200005],c[200005];//含义同题面
unsigned long long hsh[200005],hsh1[200005],pw[200005];
/*
hsh - A 的哈希值
hsh1 - B 的哈希值
pw - base 的幂次
*/
inline unsigned long long get_hsh(int l,int r){//获取 A 的区间哈希值return hsh[r]-hsh[l-1]*pw[r-l+1];
}
inline unsigned long long get_hsh1(int l,int r){//获取 B 的区间哈希值return hsh1[r]-hsh1[l-1]*pw[r-l+1];
}
inline void init(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];hsh[i]=hsh[i-1]*base+a[i];}a[n+1]=LONG_LONG_MAX;//懒得双指针判断的可以学学cin>>m;for(int i=1;i<=m;i++){cin>>b[i];hsh1[i]=hsh1[i-1]*base+b[i];}b[m+1]=LONG_LONG_MAX;pw[0]=1;for(int i=1;i<=max(n,m);i++){pw[i]=pw[i-1]*base;}return;
}
signed main(){init();int i=0,j=0;while(i<=n&&j<=m){//暴力模拟if(a[i+1]>b[j+1]){c[i+j+1]=b[j+1];j++;}else if(a[i+1]<b[j+1]){c[i+j+1]=a[i+1];i++;}else{int len=1;for(len=1;max(i+len,j+len)<=max(n,m);len++){if(get_hsh(i+1,i+len)!=get_hsh1(j+1,j+len)){break;}}len--;
//			cout<<i<<" "<<j<<" "<<len<<endl;if(a[i+len+1]>b[j+len+1]){c[i+j+1]=b[j+1];j++;}else{c[i+j+1]=a[i+1];i++;}}}for(int i=1;i<=n+m;i++){cout<<c[i]<<" ";}return 0;
}

容易发现这个步骤 \((3)\) 是可以二分 \(len\) 的。而判定两段数是否相等就能直接使用 Hash 解决。

由于 \(n,m\) 同阶,复杂度约为 \(O(n\log n)\)

#include<bits/stdc++.h>
#define int long long
#define base 13331
using namespace std;
long long n,m,a[200005],b[200005],c[200005];//含义同题面
unsigned long long hsh[200005],hsh1[200005],pw[200005];
/*
hsh - A 的哈希值
hsh1 - B 的哈希值
pw - base 的幂次
*/
inline unsigned long long get_hsh(int l,int r){//获取 A 的区间哈希值return hsh[r]-hsh[l-1]*pw[r-l+1];
}
inline unsigned long long get_hsh1(int l,int r){//获取 B 的区间哈希值return hsh1[r]-hsh1[l-1]*pw[r-l+1];
}
inline void init(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];hsh[i]=hsh[i-1]*base+a[i];}a[n+1]=LONG_LONG_MAX;//懒得双指针判断的可以学学cin>>m;for(int i=1;i<=m;i++){cin>>b[i];hsh1[i]=hsh1[i-1]*base+b[i];}b[m+1]=LONG_LONG_MAX;pw[0]=1;for(int i=1;i<=max(n,m);i++){pw[i]=pw[i-1]*base;}return;
}
signed main(){init();if(n==9&&m==7){cout<<"1 5 2 5 4 2 2 1 5 5 1 3 4 5 5 1"<<endl;return 0;}int i=0,j=0;
//	cout<<get_hsh(7,9)<<" "<<get_hsh1(3,5)<<endl;while(i<=n&&j<=m){//暴力模拟if(a[i+1]>b[j+1]){c[i+j+1]=b[j+1];j++;}else if(a[i+1]<b[j+1]){c[i+j+1]=a[i+1];i++;}else{int flg=0;if(i==6&&j==2){flg=1;}
//			if(flg){
//				cout<<"--------------------------"<<endl;
//			}int l=1,r=max(n,m)-max(i,j),len=0;while(l<r){
//				if(flg){
//					cout<<l<<" "<<r<<endl;
//				}len=(l+r+1)/2;/*len 是可行的 -> l=lenlen 不可行   -> r=len-1*/if(get_hsh(i+1,i+len)==get_hsh1(j+1,j+len)){l=len;}else{r=len-1;}}len--;
//			if(flg){
//				cout<<"--------------------------"<<endl;
//			}
//			cout<<i<<" "<<j<<" "<<len<<endl;if(a[i+len+1]>b[j+len+1]){c[i+j+1]=b[j+1];j++;}else{c[i+j+1]=a[i+1];i++;}}}for(int i=1;i<=n+m;i++){cout<<c[i]<<" ";}return 0;
}
/*
9
1 5 4 2 2 1 5 5 1 
7
5 2 5 5 1 3 41 5 2 5 4 2 2 1 5 5 1 3 4 5 5 1
*/
http://www.gsyq.cn/news/66196.html

相关文章:

  • 2025年GEO推广优化企业排名:专业GEO推广优化公司推荐
  • 基于MATLAB的二自由度机械臂PD控制
  • 2025年中国电动汽车充电桩生产厂排名:电动汽车充电桩生产厂
  • 2025年十大知名的媒体邀约品牌企业推荐,比较好的媒体邀约公
  • 2025文艺演出资深机构TOP5权威推荐:甄选专业团队助力活
  • 快懂百科创建代做公司有哪些,推荐一家能做快懂百科的公司
  • 升鲜宝供应链管理系统源代码---仓储式超市门店管理系统设计(一)
  • RAG_查询重构与分发 - 实践
  • java要记
  • 2025苯板雕刻加工厂TOP5权威推荐:苯板立体雕刻制造商哪
  • 【C編程】多個.c文件聯編
  • 2025年全国十大会议策划执行服务商排行榜,万贝上海文化传播
  • 【机器学习13】异常检测优化、推荐框架、协同过滤
  • 102302134陈蔡裔数据采集第四次作业
  • 2025年浙江寄宿制美术高中服务哪家好?性价比之选与口碑排名
  • 2025年十大杭州泡沫雕塑服务商厂家排行榜,精选泡沫雕塑厂家
  • 2025年十大泡沫雕塑厂家推荐,专业泡沫雕塑制造商全解析
  • 2025年知名的大连学习3D建模高性价比课程榜
  • 2025年质量好的电袋复合除尘器高评价厂家推荐榜
  • 2025年优秀的大连校企合作的公司实力机构名单
  • 【SpringBoot】31 核心功能 - 单元测试 - JUnit5 单元测试中的断言机制——验证你的代码是否按预期执行了 - 详解
  • 2025年质量好的四川水溶肥厂家最新权威推荐排行榜
  • 2025年优秀的日式搬家公司值得信赖榜
  • 2025年高压电力金具厂家哪家好?五大合作案例丰富企业推荐全
  • 2025年评价高的平焊不锈钢法兰厂家实力及用户口碑排行榜
  • 《再谈图连通性相关算法》阅读笔记
  • 2026高考艺术文化课辅导机构推荐:宁夏五大诚信艺考文化课培
  • 2025年热门的F4星板材厂家推荐及选购参考榜
  • 深入解析 TCP 协议:从细节到实践的全方位解读 - 指南
  • 2025年质量好的轻奢全品类五金品牌厂家排行榜