ABC294 CDE 题解 - Misty-Hazers

Misty-Hazers 2023-07-21 18:03:51 2023-07-21 18:05:47 7

C题

题目大意:给你两个从小到大的数组,求数组在合并排序后每个数的位置

分析:类似归并排序,模拟一次归并排序中的插入操作即可。

/*
Code by: Misty-Hazers
*/
#include<bits/stdc++.h>
#define int long long
#define rap1 cout<<"yeah!"<<endl;
#define rap2 cout<<"yo!"<<endl;
using namespace std;
const int modn=998244353;
const int inf=2147483647;
const int maxn=1919810;
int t=1;
bool cmp(int a,int b){
	return a>b;
}bool is_aph_1(char x){
	if(x>='A' and x<='Z') return true;
	return false;
}bool is_aph_2(char x){
	if(x>='a' and x<='z') return true;
	return false;
}bool is_aph(char x){
	if(is_aph_1(x) or is_aph_2(x)) return true;
	return false;
}bool is_num(char x){
	if(x>='0' and x<='9') return true;
	return false;
}int change(int x){
	return (x%modn+modn)%modn;
}int n,m;
int a[maxn],b[maxn];
void solve(){
	cin>>n>>m; 
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}for(int i=1;i<=m;i++){
		cin>>b[i];
	}int ip=1,jp=1;
	while(ip<=n and jp<=m){
		if(a[ip]<b[jp]){
			a[ip]=ip+jp-1;
			ip++;
		}else{
			b[jp]=ip+jp-1;
			jp++;
		}
	}
	while(ip<=n) a[ip++]=ip+jp-1;
	while(jp<=m) b[jp++]=ip+jp-1;
	for(int i=1;i<=n;i++){
		cout<<a[i]<<" ";
	}cout<<endl;
	for(int i=1;i<=m;i++){
		cout<<b[i]<<" ";
	}cout<<endl;
	return ;
}signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin.tie(0);
	cout.tie(0);
	//cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

D题

题目大意:模拟一个银行的叫号系统(

分析:模拟即可

/*
Code by: Misty-Hazers
*/
#include<bits/stdc++.h>
#define int long long
#define rap1 cout<<"yeah"<<endl;
#define rap2 cout<<"yo"<<endl;
using namespace std;
const int modn=998244353;
const int inf=2147483647;
const int maxn=1919810;
int t=1;
bool cmp(int a,int b){
	return a>b;
}bool is_aph_1(char x){
	if(x>='A' and x<='Z') return true;
	return false;
}bool is_aph_2(char x){
	if(x>='a' and x<='z') return true;
	return false;
}bool is_aph(char x){
	if(is_aph_1(x) or is_aph_2(x)) return true;
	return false;
}bool is_num(char x){
	if(x>='0' and x<='9') return true;
	return false;
}int change(int x){
	return (x%modn+modn)%modn;
}int n,q;
int front=1,call=1;
bool flag=false;
int called[maxn];
void solve(){
	cin>>n>>q;
	while(q--){
		int opt,x;
		cin>>opt;
		if(opt==1){
			called[call]=1;
			call++;flag=true;
		}else if(opt==2){
			cin>>x;
			if(called[x]==1 and flag){
				called[x]=0;
				while(called[front]==0 and front<call) front++;
			}
		}else{
			if(flag){
				cout<<front<<endl;
			}else{
				cout<<0<<endl;
			}
		}
	}
	return ;
}signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin.tie(0);
	cout.tie(0);
	//cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

E题

其实我有点后悔没参加这场比赛

题目大意:给你两个压缩后的数组,问你 取何值时

同样是模拟题,和归并排序中的插入操作类似,好像出题人很喜欢归并排序?,将两个指针的指向控制成相邻的。

/*
Code by: Misty-Hazers
*/
#include<bits/stdc++.h>
#define int long long
#define rap1 cout<<"yeah"<<endl;
#define rap2 cout<<"yo"<<endl;
using namespace std;
const int modn=998244353;
const int inf=2147483647;
const int maxn=1919810;
int t=1;
bool cmp(int a,int b){
	return a>b;
}bool is_aph_1(char x){
	if(x>='A' and x<='Z') return true;
	return false;
}bool is_aph_2(char x){
	if(x>='a' and x<='z') return true;
	return false;
}bool is_aph(char x){
	if(is_aph_1(x) or is_aph_2(x)) return true;
	return false;
}bool is_num(char x){
	if(x>='0' and x<='9') return true;
	return false;
}int change(int x){
	return (x%modn+modn)%modn;
}int l,n1,n2;
int p1[maxn],p2[maxn];
int k1[maxn],k2[maxn];
int ans;
void solve(){
	cin>>l>>n1>>n2;
	for(int i=1;i<=n1;i++){
		cin>>p1[i]>>k1[i];
	}for(int i=1;i<=n2;i++){
		cin>>p2[i]>>k2[i];
	}int lft=0,rit=0,i=1,j=1,lftnum=-114514,ritnum=-114514;
	while(lft<l and rit<l and i<=n1 and j<=n2){
		if(lft<=rit){
			lftnum=p1[i];
			if(lftnum==ritnum){
				if(lft+k1[i]>rit){
					ans+=abs(rit-lft);
				}else{
					ans+=k1[i];
				}
			}lft+=k1[i];
			i++;
		}else{
			ritnum=p2[j];
			if(lftnum==ritnum){
				if(rit+k2[j]>lft){
					ans+=abs(rit-lft);
				}else{
					ans+=k2[j];
				}
			}
			rit+=k2[j];
			j++;
		}//cout<<i<<" "<<lft<<" "<<lftnum<<endl;
		//cout<<j<<" "<<rit<<" "<<ritnum<<endl;
	}while(lft<l and i<=n1){
		lftnum=p1[i];
		if(lftnum==ritnum){
			if(lft+k1[i]>rit){
				ans+=abs(rit-lft);
			}else{
				ans+=k1[i];
			}
		}lft+=k1[i];
		i++;
	}while(rit<l and j<=n2){
		ritnum=p2[j];
		if(lftnum==ritnum){
			if(rit+k2[j]>lft){
				ans+=abs(rit-lft);
			}else{
				ans+=k2[j];
			}
		}rit+=k2[j];
		j++;
	}
	cout<<ans<<endl;
	return ;
}signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin.tie(0);
	cout.tie(0);
	//cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

总的来说,这场比赛是我挑选的几场中最简单的一场(((

{{ vote && vote.total.up }}