我这个代码连样例都过不去,但是她AC了!!!
然而在另外一个 OJ 上爆炸了
求大佬看看问题在哪
拜谢!
/*
Author:Lucky_Yukikaze
*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<functional>
#include<utility>
#define ll long long
#define ull unsigned long long
#define ui unsigned int
#define re register
#define pb push_back
#define mp make_pair
#define pf pop_front
#define pob pop_back
#define fr front
#define bk back
using namespace std;
typedef pair<int,int> pii;
typedef long double ld;
typedef pair<ll,ll> pll;
namespace Morgen{
inline int fr(){
int res=0;bool sig=false;char tp=getchar();
while(!isdigit(tp)){
if(tp=='-')sig=!sig;
tp=getchar();
}
while(isdigit(tp)){
res=(res<<1)+(res<<3)+tp-'0';
tp=getchar();
}
if(sig)res=-res;
return res;
}
const int maxn=100010;
struct K_Sized_Heap{
struct node{
ld len;int id;
inline bool operator > (const node &tp)const{
if(fabs(len-tp.len)<1e-7){
return id<tp.id;
}
else return len>tp.len;
}
};
int k;
priority_queue<node,vector<node>,greater<node>>q;
void init(int kv){
k=kv;
while(!q.empty())q.pop();
for(int i=1;i<=k;i++)q.push((node){0.00,114514});
}
void join(ld len,int id){
node ne=(node){len,id};
if(q.empty()||ne>q.top()){
q.pop();
q.push(ne);
}
}
ld getmin(){
return q.top().len;
}
ld getans(){
return q.top().id;
}
}kh;
struct point{
ll x,y;
int id;
inline bool operator != (const point &tp)const{
return x!=tp.x||y!=tp.y;
}
inline bool operator <= (const point &tp)const{
return x<=tp.x&&y<=tp.y;
}
}ori[maxn];
inline bool mmpx(point tp1,point tp2){
return tp1.x<tp2.x;
}
inline bool mmpy(point tp1,point tp2){
return tp1.y<tp2.y;
}
inline ld pw(ld v){
return v*v;
}
inline ld dist(point tp1,point tp2){
return sqrt(pw((ld)tp1.x-tp2.x)+pw((ld)tp1.y-tp2.y));
}
struct K_Demension_Tree{
struct element{
int ls,rs;
point nowa,maxx,minn;
}dat[maxn];
int tot;
void init(){
tot=0;
}
inline int New(point tp){
dat[++tot]=(element){0,0,tp,tp,tp};
return tot;
}
inline void pushson(int nowa,int son){
if(!son)return;
dat[nowa].maxx.x=max(dat[nowa].maxx.x,dat[son].maxx.x);
dat[nowa].maxx.y=max(dat[nowa].maxx.y,dat[son].maxx.y);
dat[nowa].minn.x=min(dat[nowa].minn.x,dat[son].minn.x);
dat[nowa].minn.y=min(dat[nowa].minn.y,dat[son].minn.y);
}
inline void pushup(int nowa){
pushson(nowa,dat[nowa].ls);
pushson(nowa,dat[nowa].rs);
}
int build(int l,int r,int dem){
if(l>r)return 0;
int mid=(l+r)>>1;
nth_element(ori+l,ori+mid,ori+r+1,dem?mmpy:mmpx);
int nowa=New(ori[mid]);
dat[nowa].ls=build(l,mid-1,dem^1);
dat[nowa].rs=build(mid+1,r,dem^1);
pushup(nowa);
return nowa;
}
inline ld possible_max_dist(int nowa,point tp){
ld x_2m=max(pw(dat[nowa].maxx.x-tp.x),pw(dat[nowa].minn.x-tp.x));
ld y_2m=max(pw(dat[nowa].maxx.y-tp.y),pw(dat[nowa].minn.y-tp.y));
return sqrt(x_2m+y_2m);
}
void query(int nowa,point tp){
if(!nowa)return;
kh.join(dist(tp,dat[nowa].nowa),dat[nowa].nowa.id);
ld ldis=0.00,rdis=0.00;
if(dat[nowa].ls)ldis=this->possible_max_dist(dat[nowa].ls,tp);
if(dat[nowa].rs)rdis=this->possible_max_dist(dat[nowa].rs,tp);
if(ldis>rdis){
if(ldis>kh.getmin())query(dat[nowa].ls,tp);
if(rdis>kh.getmin())query(dat[nowa].rs,tp);
}
else{
if(rdis>kh.getmin())query(dat[nowa].rs,tp);
if(ldis>kh.getmin())query(dat[nowa].ls,tp);
}
}
}kdt;
void main(){
int n,m;
cin>>n;
for(int i=1;i<=n;i++){
cin>>ori[i].x>>ori[i].y;
ori[i].id=i;
}
kdt.init();
int root=kdt.build(1,n,0);
cin>>m;
int qk;point q;
for(int i=1;i<=m;i++){
cin>>q.x>>q.y>>qk;
kh.init(qk);
kdt.query(root,q);
int ans=kh.getans();
cout<<ans<<endl;
}
}
};
signed main(){
//ios::sync_with_stdio(false);
//cin.tie(nullptr);cout.tie(nullptr);
Morgen::main();
return 0;
}