深夜灵异AC离谱了家人们
查看原帖
深夜灵异AC离谱了家人们
93701
Morgen_Kornblume楼主2022/6/21 01:12

我这个代码连样例都过不去,但是她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;
}


2022/6/21 01:12
加载中...