讨论
ABC294 CDE 题解 -fangyanli
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 }}