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

浙公网安备 33010602011771号