BZOJ2626: JZPFAR

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2626

题解:裸K-Dtree,最大值?自己yy一下估价函数就好了。

两题居然是同一个错误,真是too naive。。。

代码:

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cmath>
  4 #include<cstring>
  5 #include<algorithm>
  6 #include<iostream>
  7 #include<vector>
  8 #include<map>
  9 #include<set>
 10 #include<queue>
 11 #include<string>
 12 #define inf 1ll<<62
 13 #define maxn 200000+5
 14 #define maxm 100000+5
 15 #define eps 1e-10
 16 #define ll double
 17 #define pa pair<ll,int>
 18 #define for0(i,n) for(int i=0;i<=(n);i++)
 19 #define for1(i,n) for(int i=1;i<=(n);i++)
 20 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
 21 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
 22 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
 23 #define mod 1000000007
 24 #define sqr(x) (x)*(x)
 25 using namespace std;
 26 inline int read()
 27 {
 28     int x=0,f=1;char ch=getchar();
 29     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
 30     while(ch>=‘0‘&&ch<=‘9‘){x=10*x+ch-‘0‘;ch=getchar();}
 31     return x*f;
 32 }
 33 int n,m,cur;
 34 priority_queue<pa,vector<pa>,greater<pa> >q;
 35 struct rec
 36 {
 37     int mi[2],mx[2],d[2],l,r,id;
 38     int& operator [](int i){return d[i];}
 39 }p[maxn],t[maxn],now;
 40 bool operator <(rec a,rec b){return a[cur]<b[cur];}
 41 inline void pushup(int k)
 42 {
 43     int l=t[k].l,r=t[k].r;
 44     for0(i,1)
 45     {
 46         t[k].mi[i]=min(t[k][i],min(t[l].mi[i],t[r].mi[i]));
 47         t[k].mx[i]=max(t[k][i],max(t[l].mx[i],t[r].mx[i]));
 48     }
 49 }
 50 inline int build(int l,int r,int dir)
 51 {
 52     int mid=(l+r)>>1;
 53     cur=dir;
 54     nth_element(p+l,p+mid,p+r+1);
 55     t[mid]=p[mid];
 56     for0(i,1)t[mid].mi[i]=t[mid].mx[i]=t[mid][i];
 57     t[mid].l=l>mid-1?0:build(l,mid-1,dir^1);
 58     t[mid].r=mid+1>r?0:build(mid+1,r,dir^1);
 59     pushup(mid);
 60     return mid;
 61 }
 62 inline ll calc(int k)
 63 {
 64     if(!k)return -inf-1;
 65     ll ret=0;
 66     for0(i,1)ret+=max((ll)sqr(now[i]-t[k].mi[i]),(ll)sqr(t[k].mx[i]-now[i]));
 67     return ret;
 68 }
 69 inline ll dist(rec a,rec b){return (ll)sqr(a[0]-b[0])+(ll)sqr(a[1]-b[1]);}
 70 inline void query(int k)
 71 {
 72     if(!k)return;
 73     ll dl=calc(t[k].l),dr=calc(t[k].r),d=dist(t[k],now);
 74     if(d>q.top().first||(d==q.top().first&&t[k].id<-q.top().second))q.pop(),q.push(pa(d,-t[k].id));
 75     if(dl>dr)
 76     {
 77         if(dl>=q.top().first)query(t[k].l);
 78         if(dr>=q.top().first)query(t[k].r);
 79     }else
 80     {
 81         if(dr>=q.top().first)query(t[k].r);
 82         if(dl>=q.top().first)query(t[k].l);
 83     }
 84 }
 85
 86 int main()
 87 {
 88     freopen("input.txt","r",stdin);
 89     freopen("output.txt","w",stdout);
 90     n=read();
 91     for1(i,n)p[i][0]=read(),p[i][1]=read(),p[i].id=i;
 92     for0(i,1)t[0].mi[i]=1000000000,t[0].mx[i]=-1000000000;
 93     int rt=build(1,n,0);
 94     m=read();
 95     while(m--)
 96     {
 97         now[0]=read();now[1]=read();int k=read();
 98         while(!q.empty())q.pop();
 99         for1(i,k)q.push(pa(-inf,0));
100         query(rt);
101         printf("%d\n",-q.top().second);
102     }
103     return 0;
104 }

时间: 2024-10-17 14:05:41

BZOJ2626: JZPFAR的相关文章

【堆】【kd-tree】bzoj2626 JZPFAR

用堆记录答案.看看当前点是否比堆顶更优. #include<cstdio> #include<queue> #include<cstring> #include<cmath> #include<algorithm> using namespace std; typedef double db; #define N 100001 #define EPS 0.0000001 #define INF 999999999999999999.0 #defi

【BZOJ2626】JZPFAR kd-tree+堆

[BZOJ2626]JZPFAR Description 平面上有n个点.现在有m次询问,每次给定一个点(px, py)和一个整数k,输出n个点中离(px, py)的距离第k大的点的标号.如果有两个(或多个)点距离(px, py)相同,那么认为标号较小的点距离较大. Input 第一行,一个整数n,表示点的个数. 下面n行,每行两个整数x_i, y_i,表示n个点的坐标.点的标号按照输入顺序,分别为1..n. 下面一行,一个整数m,表示询问个数. 下面m行,每行三个整数px_i, py_i, k

【BZOJ2626】JZPFAR KDtree

题解:KDT,暴力维护前K大,,或许可以用个pq. 呃,我的代码WA了,但是pai了好久都没pai出来,,,,,而且我的代码是当前交的AC代码的效率的正好3倍!!! 纠结啊~~~ WA代码: #include <cmath> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 1

【BZOJ】【2626】JZPFAR

KD-Tree 0.0找第k大…… 裸KD-Tree……跟之前那道找最近的k个点大同小异 一开始理解错:第K大是第K远……不是第K近……(Tunix你个sb 感觉容易出错的是0号点= =边界情况需要仔细处理……根据题意而定的,比如这题就必须将0号点的距离设置成最近……比如-2……(因为我一开始向堆里加的占位点的距离是-1 1 /************************************************************** 2 Problem: 2626 3 User

[国家集训队2012]JZPFAR

[国家集训队2012]JZPFAR 题目 平面上有n个点.现在有m次询问,每次给定一个点(px, py)和一个整数k,输出n个点中离(px, py)的距离第k大的点的标号.如果有两个(或多个)点距离(px, py)相同,那么认为标号较小的点距离较大. INPUT 第一行,一个整数n,表示点的个数.下面n行,每行两个整数x_i, y_i,表示n个点的坐标.点的标号按照输入顺序,分别为1..n.下面一行,一个整数m,表示询问个数.下面m行,每行三个整数px_i, py_i, k_i,表示一个询问.

BZOJ 2626: JZPFAR

Description 求平面第\(k\)远的点,\(n\leqslant 10^5\) Solution KD-Tree. 用一个堆统计答案即可... Code /************************************************************** Problem: 2626 User: BeiYu Language: C++ Result: Accepted Time:16080 ms Memory:4824 kb ******************

BZOJ 2626 JZPFAR K-D树

题目大意:给出平面上的一些点,求到一个点的最远的第k个点的标号. 思路:朴素的K-D树建树,然后在搜索的时候维护一个小跟堆,保留着最大的k个点,然后吧第k大的点作为基准点来判断是否更新其他的点. CODE: #include <cmath> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #de

BZOJ 2626 JZPFAR(KD-tree)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2626 题意:平面上有n个点.现在有m次询问,每次给定一个点(px, py)和一个整数k,输出n个点中离(px, py)的距离第k大的点的标号.如果有两个(或多个)点距离(px, py)相同,那么认为标号较小的点距离较大. 思路:对n个点做KDtree. 1 #include<algorithm> 2 #include<cstdio> 3 #include<cmath

部分系列题

当然是不齐的. JZP系列 JZPKIL       数论,反演,积性函数,伯努利数,(常数优化) JZPFAR     k-d树 JZPTAB    分块 hash sam[太可怕了 不会写] JZPLCM    三维偏序,可持久化线段树维护 JZPEXT     数位统计(常数优化) JZPGYZ     suffix array水过 JZPCIR      找规律(OEIS水过) JZPFOR  三维哈密尔顿回路统计[太可怕了 不会] JZPLIT   构造 JZPLIT2  优化异或方程