Acwing第 55 场周赛【未完结】

4479. 最长子序列【签到】

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,t;
int a[N],b[N];
map<int,int>mp;
int main(void)
{
    
     

    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=m;i++) cin>>b[i],mp[b[i]]++;
    for(int i=1;i<=n;i++) if(mp[a[i]]) cout<<a[i]<<" ";
	return 0;
}

4480. 倒垃圾【前缀和】

在这里插入图片描述
挺常规的一道题,首先二分是可做的。这里我用的是前缀的思想。左右前缀取最近的。

#include<bits/stdc++.h> 
using namespace std;
const int N=1e5*2+10;
int a[N],st[N],cnt[N],n,m;
int l[N],r[N];
struct node{
    
    int x,id;}Node[N];
bool cmp(node a,node b){
    
    return a.x<b.x;}
int main(void)
{
    
    
	cin>>n>>m;
	for(int i=1;i<=n+m;i++) cin>>a[i];
	for(int i=1;i<=n+m;i++) cin>>st[i];
	for(int i=1;i<=n+m;i++) Node[i]={
    
    a[i],st[i]};
	sort(Node+1,Node+n+m+1,cmp);
	memset(l,0x3f,sizeof l);
	memset(r,0x3f,sizeof r);
	for(int i=1;i<=n+m;i++) 
	{
    
    
	    if(l[i-1]!=0x3f3f3f3f) l[i]=l[i-1];
	    if(Node[i].id) l[i]=i;
	}
	for(int i=n+m;i>=1;i--)
	{
    
    
	    if(r[i+1]!=0x3f3f3f3f) r[i]=r[i+1];
	    if(Node[i].id) r[i]=i;
	}
	for(int i=1;i<=n+m;i++)
	{
    
    
	    if(Node[i].id==0)
	    {
    
    
	        if(l[i]==0x3f3f3f3f) cnt[r[i]]++;
	        else if(r[i]==0x3f3f3f3f) cnt[l[i]]++;
	        else if(l[i]!=0x3f3f3f3f&&r[i]!=0x3f3f3f3f)
	        {
    
    
	            if(abs(Node[l[i]].x-Node[i].x)<=abs(Node[r[i]].x-Node[i].x)) cnt[l[i]]++;
	            else cnt[r[i]]++;
	        }
	    }
	}
	for(int i=1;i<=n+m;i++) if(Node[i].id) cout<<cnt[i]<<" ";
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_46527915/article/details/125252286