CF1494C
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; }