奇了怪了为啥40pts
查看原帖
奇了怪了为啥40pts
767861
Melo_BBB楼主2023/10/6 17:08

想法是无论如何都是原序列和他倒过来相加,所以直接枚举的

#include<bits/stdc++.h>
#define int long long 
using namespace std;
int T,n,t[2001],b[2001],a[2001],k[2001],kkk=0x3f3f3f3f3f3f3f3fll,kkksc03;
int check(int);
signed main(){
	for(cin>>T;T;--T){kkk=0x3f3f3f3f3f3f3f3fll;
		cin>>n;
		for(int i=1;i<=n;i++)
			cin>>t[i];
		for(int i=1;i<=n;i++){
			cin>>b[i];
			kkk=min(kkk,b[i]/t[i]);
		}
		for(int i=0;i<=kkk+1;i++){
		    kkksc03=0x3f3f3f3f3f3f3f3fll;
			for(int j=1;j<=n;j++)
				k[j]=t[j]*i,kkksc03=min(kkksc03,(b[j]-k[j])/t[n-j+1]);
			int l=0,r=kkksc03+1;
			while(l<r){
			    int mid=l+r>>1,a=check(mid);
			    if(a==1)
			        l=mid+1;
			     if(a==-1)
			        r=mid-1;
			     if(!a){
			         cout<<"yes\n";
			         goto g;
			     }
			}
		}
		cout<<"no\n";
		g:continue;
	}
    return 0;
}
int check(int j){
	for(int i=1,jj=n;i<jj;i++,jj--){
		a[i]=k[i]+j*t[jj];
		a[jj]=k[jj]+j*t[i];
		if(a[i]==b[i]&&a[jj]==b[jj])
			continue;
		if(a[i]<b[i])
		    return 1;
		 else return -1;
	}
	if(n&1){
	    int kk=n/2+1;
	    int kkkk=k[kk]+j*t[kk];
	    if(kkkk==b[kk])
	        return 0;
	       if(kkkk<b[kk])
	        return 1;
	       return -1;
	}
	return 0;
}
2023/10/6 17:08
加载中...