63求条
查看原帖
63求条
1345652
Luliuyan114514楼主2024/12/1 21:11

O(n log2n)O(n\ log_2 n) but 1e6也过不去

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+5;
ll gcd(ll x,ll y)
{
	return y==0?x:gcd(y,x%y);
}
struct fraction{
	int a=0,b=1;
	void simplify(){
		if(a==0)
		{
			b=1;
			return;
		}
		int t=gcd(a,b);
		a/=t,b/=t;
	}
	fraction(int x,int y)
	{
		a=x,b=y;
		if(b==0)b=1;
//		simplify();
	}
	fraction(int x)
	{
		a=x;
	}
	fraction(){a=0,b=1;}
};
bool operator<(fraction x,fraction y)
{
	long long tb=1ll*x.b/gcd(x.b,y.b)*y.b;
	long long xa=1ll*x.a*tb/x.b , ya=1ll*y.a*tb/y.b;
	return xa<ya;
}
bool operator>(fraction x,fraction y)
{
	long long tb=1ll*x.b/gcd(x.b,y.b)*y.b;
	long long xa=1ll*x.a*tb/x.b , ya=1ll*y.a*tb/y.b;
	return xa>ya;
}
bool operator==(fraction x,fraction y)
{
	x.simplify(),y.simplify();
	return x.a==y.a&&x.b==y.b;
}
int a[N],b[N],c[N];
fraction ans[N];//fst:ai,sec:bi
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	priority_queue<fraction,vector<fraction>,greater<fraction> > q;
	int n,Q;
	cin>>n>>Q;
	map<pair<int,int>,bool> vis;
	for(int i=1;i<=n;++i)
	{
		cin>>a[i];
	}
	for(int i=1;i<=n;++i)
	{
		cin>>b[i];
	}
	int maxc=-1;
	for(int i=1;i<=Q;++i)
	{
		cin>>c[i];
		maxc=max(maxc,c[i]);
	}
	sort(a+1,a+n+1);
	sort(b+1,b+n+1,greater<int>());
	int x=1,y=1;
	for(int i=1;i<=n;++i){
		q.push(fraction(a[1],b[i]));
		vis[make_pair(1,i)]=1;
	}
	for(int i=2;i<=n;++i){
		q.push(fraction(a[i],b[1]));
		vis[make_pair(i,1)]=1;
	}
	for(int i=1;i<=maxc;++i)
	{
		fraction t=q.top();
		q.pop();
		x=lower_bound(a+1,a+n+1,t.a)-a,y=lower_bound(b+1,b+n+1,t.b,greater<int>())-b;
		if(x+1<=n&&!vis[make_pair(x+1,y)])q.push(fraction(a[x+1],b[y])),vis[make_pair(x+1,y)]=1;
		if(y+1<=n&&!vis[make_pair(x,y+1)])q.push(fraction(a[x],b[y+1])),vis[make_pair(x,y+1)]=1;
		t.simplify();
		ans[i]=t;
	}
	for(int i=1;i<=Q;++i)
	{
		cout<<ans[c[i]].a<<' '<<ans[c[i]].b<<endl;
	}
	return 0;
}
2024/12/1 21:11
加载中...