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;
}
总的来说,这场比赛是我挑选的几场中最简单的一场(((