Vector

gen:

#include<bits/stdc++.h>

using namespace std;

ifstream fin(".arg");
ofstream fout(".in");

double L,R;
int D,N,M;

random_device rd;
mt19937 rng(rd());
inline double Rfloat(){return double(rng())/powl(2,32)*(R-L)+L;}

signed main(){
	fin>>D>>N>>M>>L>>R;

	fout<<D<<'\n';
	fout<<N<<'\n';
	for(int i=0;i<N;i++){
		for(int j=0;j<D;j++) fout<<fixed<<setprecision(8)<<Rfloat()<<' ';fout<<'\n';
	}
	fout<<M<<'\n';
	for(int i=0;i<M;i++){
		for(int j=0;j<D;j++) fout<<fixed<<setprecision(8)<<Rfloat()<<' ';fout<<'\n';
	}

	return 0;
}

work:

#include<bits/stdc++.h>

using namespace std;

ifstream fin(".in");
ofstream fout(".out");

vector<vector<double>> a;
int D,N,M;

inline double Dist(vector<double> &p,vector<double> &q){
	double ans=0;
	int L=p.size();
	for(int i=0;i<L;i++) ans+=(p[i]-q[i])*(p[i]-q[i]);
	return ans;
}
inline int BruteFind(vector<double> &p){
	double cur=DBL_MAX;int ans=-1;
	for(int i=0;i<N;i++){
		double tmp=Dist(a[i],p);
		if(tmp<cur) cur=tmp,ans=i;
	}
	return ans;
}

namespace PQ{
	int T=16,HCount=8,K=16,W;

	double L,R;
	random_device rd;
	mt19937 rng(rd());
	inline double Rfloat(){return double(rng())/powl(2,32)*(R-L)+L;}

	vector<vector<int>> b,buc,id;
	vector<vector<vector<double>>> cen;
	inline void Init(){
		L=R=0;
		for(auto &v:a){
			for(auto &x:v) L=min(L,x),R=max(R,x);
		}

		W=D/T;
		// fout<<W<<endl;
		cen.resize(T);
		for(int i=0;i<T;i++){
			cen[i].resize(HCount);
			for(auto &v:cen[i]){
				v.resize(W);
				for(auto &x:v) x=Rfloat();
			}
			// for(int j=0;j<HCount;j++){
			// 	fout<<i<<' '<<j<<" : ";
			// 	for(int k=0;k<W;k++) fout<<cen[i][j][k]<<' ';fout<<endl;
			// }
		}
		
		b.resize(N);
		for(int i=0;i<N;i++){
			b[i].resize(T);
			for(int j=0;j<T;j++){
				vector<double> v(a[i].begin()+j*W,a[i].begin()+(j+1)*W);
				double dff=DBL_MAX;int ans=-1;
				for(int k=0;k<HCount;k++){
					double tmp=Dist(v,cen[j][k]);
					if(tmp<dff) dff=tmp,ans=k;
				}
				b[i][j]=ans;
				// fout<<b[i][j]<<' ';
			}
			// fout<<endl;
		}

		buc=b;
		sort(buc.begin(),buc.end());
		buc.erase(unique(buc.begin(),buc.end()),buc.end());
		id.resize(buc.size());
		for(int i=0;i<N;i++){
			int p=lower_bound(buc.begin(),buc.end(),b[i])-buc.begin();
			id[p].push_back(i);
		}
	}
	inline int Find(vector<double> &p){
		// cerr<<"333"<<endl;
		priority_queue<pair<double,int>> q;
		for(int i=0;i<buc.size();i++){
			double dff=0;
			// cerr<<"###"<<endl;
			for(int j=0;j<T;j++){
				// cerr<<i<<" : "<<j<<" | "<<buc[i][j]<<endl;
				vector<double> tmp(p.begin()+j*W,p.begin()+(j+1)*W);
				dff+=Dist(cen[j][buc[i][j]],tmp);
			}
			// cerr<<"%%%"<<endl;
			q.push({dff,i});
			if(q.size()>K) q.pop();
			// cerr<<"$$$"<<endl;
		}
		// cerr<<"444"<<endl;
		double dff=DBL_MAX;int ans=-1;
		while(q.size()){
			int i=q.top().second;
			q.pop();
			for(int j:id[i]){
				double tmp=Dist(a[j],p);
				if(tmp<dff) dff=tmp,ans=j;
			}
		}
		// cerr<<"555"<<endl;
		return ans;
	}
}

signed main(){
	fin>>D;
	fin>>N;
	a.resize(N);
	for(auto &v:a){
		v.resize(D);
		for(auto &x:v) fin>>x;
	}

	PQ::Init();

	fin>>M;
	while(M--){
		vector<double> q(D);
		for(auto &x:q) fin>>x;
		fout<<PQ::Find(q)<<'\n';
	}

	return 0;
}

grader:

#include<bits/stdc++.h>

using namespace std;

ifstream inf(".in");
ifstream ouf(".out");

vector<vector<double>> a;
int D,N,M;

inline double Dist(vector<double> &p,vector<double> &q){
	double ans=0;
	int L=p.size();
	for(int i=0;i<L;i++) ans+=(p[i]-q[i])*(p[i]-q[i]);
	return ans;
}
inline int BruteFind(vector<double> &p){
	double cur=DBL_MAX;int ans=-1;
	for(int i=0;i<N;i++){
		double tmp=Dist(a[i],p);
		if(tmp<cur) cur=tmp,ans=i;
	}
	return ans;
}

signed main(){
	inf>>D;
	inf>>N;
	a.resize(N);
	for(auto &v:a){
		v.resize(D);
		for(auto &x:v) inf>>x;
	}

	inf>>M;
	int cnt=0;
	for(int o=0;o<M;o++){
		vector<double> q(D);
		for(auto &x:q) inf>>x;
		int ans=BruteFind(q),res;
		ouf>>res;
		cnt+=(res==ans);
	}

	cerr<<"Accuracy : "<<fixed<<setprecision(2)<<100*double(cnt)/M<<'%'<<endl;

	return 0;
}

runall:

#include<bits/stdc++.h>

using namespace std;

signed main(){
	system("gen");
	system("work");
	system("grader");

	return 0;
}
posted @ 2026-01-31 23:16  JoeyJiang  阅读(4)  评论(0)    收藏  举报