40分,TLE+WA不知道为啥错了
查看原帖
40分,TLE+WA不知道为啥错了
379926
xyz123楼主2023/8/25 22:49
#include<bits/stdc++.h>
using namespace std;
multiset<__int128>sword;
const int N=1e5+10;
long long a[N],p[N],h[N],b[N];
__int128 exgcd(__int128 a,__int128 b,__int128 &x,__int128 &y){
	if(!b){
		x=1,y=0;
		return a;
	}
	__int128 x1,y1,d;
	d=exgcd(b,a%b,x1,y1);
	x=y1;
	y=x1-a/b*y1;
	return d;
}
int main(){
	//freopen("P4774_1.in","r",stdin);
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	int T;
	cin>>T;
	while(T--){
		int n1,m1;
		cin>>n1>>m1;
		for(int i=1;i<=n1;i++)	cin>>a[i];
		for(int i=1;i<=n1;i++)	cin>>p[i];
		for(int i=1;i<=n1;i++)	cin>>h[i];
		sword.clear();
		for(int i=1;i<=m1;i++){
			int x;
			cin>>x;
			sword.insert(x);
		}
		__int128 smallest=0;
		for(int i=1;i<=n1;i++){
			auto v=upper_bound(sword.begin(),sword.end(),a[i]);
			if(v!=sword.begin())	v--;
			b[i]=*v;
			sword.erase(v);
			sword.insert(h[i]);
			smallest=max(smallest,(__int128)ceil(a[i]/b[i]));
		}
		__int128 m,n,ddd;
		ddd=exgcd(b[1],p[1],m,n);
		__int128 ansa,ansb;
		if(a[1]%ddd){
			puts("-1");
			continue;
		}
		ansb=p[1]/ddd;
		ansa=m*(a[1]/ddd);
		ansa=(ansa%ansb+ansb)%ansb;
		bool ok=true;
		for(int i=2;i<=n1;i++){
			ddd=exgcd(ansb*b[i],p[i],m,n);
			if((a[i]-ansa*b[i])%ddd){
				puts("-1");
				ok=false;
				break;
			}
			m=m*((a[i]-ansa*b[i])/ddd);
			__int128 dx=p[i]/ddd;
			m=(m%dx+dx)%dx;
			ansa=m*ansb+ansa;
			ansb=ansb/__gcd(ansb,(__int128)p[i])*p[i];
		}
		if(!ok)	continue;
		//while(ansa<smallest)	ansa+=ansb;
		__int128 sss=(__int128)ceil((smallest-ansa)*1.0/ansb);
		ansa+=sss*ansb;
		cout<<(long long)ansa<<endl;
	}
	return 0;
}

为什么这一题14~20个点超时,3~7个点WA 是不是multiset太慢了

2023/8/25 22:49
加载中...