把[CQOI2016]K 远点对的代码改了一下,样例能过,交上去全WA
求捉虫:
#include<bits/stdc++.h>
using namespace std;
int n,k,now_,rt,Q;
struct node{
long long x[2];
inline bool operator <(const node &b)const{
return x[now_]<b.x[now_];
}
}tr[200005];
int le[100005],ri[100005];
long long mx[2][100005],mn[2][100005];
inline long long pwr(long long x){
return x*x;
}
inline long long dis(int i,int j){
return pwr(tr[i].x[0]-tr[j].x[0])+pwr(tr[i].x[1]-tr[j].x[1]);
}
inline long long max_dis(int i,int j){
if(!j)return 0;
return max(pwr(tr[i].x[0]-mx[0][j]),pwr(tr[i].x[0]-mn[0][j]))+max(pwr(tr[i].x[1]-mx[1][j]),pwr(tr[i].x[1]-mn[1][j]));
}
inline void pushup(int i){
if(le[i]){
mx[0][i]=max(mx[0][i],mx[0][le[i]]);
mx[1][i]=max(mx[1][i],mx[1][le[i]]);
mn[0][i]=min(mn[0][i],mn[0][le[i]]);
mn[1][i]=min(mn[1][i],mn[1][le[i]]);
}
if(ri[i]){
mx[0][i]=max(mx[0][i],mx[0][ri[i]]);
mx[1][i]=max(mx[1][i],mx[1][ri[i]]);
mn[0][i]=min(mn[0][i],mn[0][ri[i]]);
mn[1][i]=min(mn[1][i],mn[1][ri[i]]);
}
}
int build(int l=1,int r=n,int _=1){
if(l>r)return 0;now_=_;
int mid=(l+r)>>1;
nth_element(tr+l,tr+mid+1,tr+r+1);
le[mid]=build(l,mid-1,_^1);
ri[mid]=build(mid+1,r,_^1);
mx[0][mid]=mn[0][mid]=tr[mid].x[0];
mx[1][mid]=mn[1][mid]=tr[mid].x[1];
pushup(mid);
return mid;
}
struct pir{
long long first;
int second;
inline bool operator <(const pir &b)const{
if(first!=b.first)return first>b.first;
return second<b.second;
}
inline pir(long long fir,int sec){
first=fir;second=sec;
}
};
priority_queue<pir>q;
void query(int i){
if(!i)return ;
long long tmp=dis(0,i);
if(tmp>q.top().first||(tmp==q.top().first&&i<q.top().second)){
q.pop();q.push(pir(tmp,i));
}
long long xl=max_dis(0,le[i]);
long long xr=max_dis(0,ri[i]);
if(xl<xr)swap(xl,xr),swap(le[i],ri[i]);
if(xl>=q.top().first)query(le[i]);
if(xr>=q.top().first)query(ri[i]);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%lld%lld",&tr[i].x[0],&tr[i].x[1]);
rt=build();
scanf("%d",&Q);
for(int i=0;i<Q;i++){
while(!q.empty())q.pop();
scanf("%lld%lld%d",&tr[0].x[0],&tr[0].x[1],&k);
while(k--)q.push(pir(0,-1));
query(rt);
printf("%d\n",q.top().second);
}
return 0;
}