CF1494C

题目

Tutorial

 

 

 

1.双指针

2.vector声明位置及大小

 

vector<int> d(lena + 1);

3. vector和string一样,访问下标从0开始(一定注意)

 

 

 

  

代码:

#include<bits/stdc++.h>
typedef long long ll;
#define pos(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;

int n,m,t,x,y;

int f(const vector<int> &a,const vector<int> &b)
{
    int lena=a.size();
    int lenb=b.size();
    vector<int> d(lena + 1);
    int j=lenb-1;
    for(int i=lena-1;i>=0;--i) 
    {
        d[i]=d[i+1];
        while(j>=0&&b[j]>a[i]) --j;
        if(j>=0&&b[j]==a[i]) ++d[i];
    }
    int ans=0;

    int i=0;
    j=0;
    for(int k=0;k<lenb;k++)
    {
        while(i<lena && a[i]<=b[k]+i) i++;
        while(j<lenb && b[j]-b[k]<i) j++;
        ans=max(ans,j-k+d[i]);
    }

    return ans;
}

int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        
        vector<int> ar,al,br,bl;
        for(int i=0;i<n;i++)
        {
            cin>>x;
            if(x>=0) ar.push_back(x);
            else al.push_back(-x);
        }
        for(int i=0;i<m;i++)
        {
            cin>>y;
            if(y>=0) br.push_back(y);
            else bl.push_back(-y);
        }
        reverse(al.begin(),al.end());
        reverse(bl.begin(),bl.end());
        printf("%d\n",f(al,bl)+f(ar,br));
        
    }
    return 0;
}                                                               

 

posted @ 2021-03-03 23:53  juuich  阅读(8)  评论(0编辑  收藏  举报