ABC294 CDE 题解 -fangyanli

fangyanli 2023-07-23 16:23:41 4

C题

题意:把A,B两个递增数组混合为C数组后,每个元素在C的哪个位置

思路:直接混合然后二分输出

代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000010],b[1000001],c[2000001],sum;
multiset<int> s;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		c[++sum]=a[i];
	}
	for(int i=1;i<=m;i++){
		cin>>b[i];
		c[++sum]=b[i];
	}
	sort(c+1,c+sum+1);
	for(int i=1;i<=n;i++){
		int pos=lower_bound(c+1,c+sum+1,a[i])-c;
		cout<<pos<<" ";
	}
	cout<<"\n";
	for(int i=1;i<=m;i++){
		int pos=lower_bound(c+1,c+sum+1,b[i])-c;
		cout<<pos<<" ";
	}
}

D题

题意:N个人排队,一共有Q次操作:

1:通知编号最小的人

2 x:编号x的人办业务

3:再通知被通知过的没办业务的人

输出操作3的编号

思路:用两个队列模拟

代码:

#include<bits/stdc++.h>
using namespace std;
queue<int> q1,q2;
int n,q,x[1000001];
int main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		q1.push(i);
	}
	while(q--){
		int opt;cin>>opt;
		if(opt==1){
			q2.push(q1.front());q1.pop();//q2为待选
		}
		if(opt==2){
			int y;cin>>y;
			x[y]=1;//这个编号不行了
		}
		if(opt==3){
			while(x[q2.front()]) q2.pop();//排除不行编号
			cout<<q2.front()<<"\n";
		}
	}
}

E题

题意:一个2行L列的表格被压缩,连续的数字变为v,l形式(v是数字,l是个数)。第一行压缩后长度为N1,第二行为N2,上下有几个相同数字在同一列

思路:比较上下的v,l时,取较小l,如果上面的v等于下面的v,记录下来。然后上下长度各减去l,如果小于等于0就换下一个

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int ans,L,n1,n2,v[1000001],v2[1000001],l[1000001],l2[1000001],Lop=1,op1=1,op2=1;
signed main(){
	cin>>L>>n1>>n2;
	for(int i=1;i<=n1;i++){
		cin>>v[i]>>l[i];
	}
	for(int i=1;i<=n2;i++){
		cin>>v2[i]>>l2[i];
	}
	while(Lop<=L){
		int pub=min(l[op1],l2[op2]);//公共部分
		if(v[op1]==v2[op2]){
			ans+=pub;//相等就记录
		}
		l[op1]-=pub;l2[op2]-=pub;//两个一起减
		if(l[op1]<=0) op1++;//没了就换
		if(l2[op2]<=0) op2++;
		Lop+=pub;
	}
	cout<<ans;
}
{{ vote && vote.total.up }}