记录编号 587635 评测结果 AAAAAAAAAA
题目名称 磁力块 最终得分 100
用户昵称 Gravatar┭┮﹏┭┮ 是否通过 通过
代码语言 C++ 运行时间 1.451 s
提交时间 2024-04-10 22:15:37 内存使用 13.83 MiB
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. const int N = 3e5+10;
  5. const ll inf = 1e17;
  6. int p,r,n;
  7. ll x,y;
  8. struct made{
  9. ll m,p,r,le;
  10. }a[N];
  11. bool cmp1(made x,made y){return x.m < y.m;}
  12. bool cmp2(made x,made y){return x.le < y.le;}
  13.  
  14. int L[N],R[N],B,t,bl[N];
  15. int mx[N];
  16. void prework(){
  17. B = sqrt(n),t = (n-1)/B+1;
  18. for(int i = 1;i <= t;i++)L[i] = (i-1)*B+1,R[i] = min(i*B,n);
  19. for(int i = 1;i <= n;i++)bl[i] = (i-1)/B+1;
  20. sort(a+1,a+1+n,cmp1);
  21. for(int i = 1;i <= t;i++)mx[i] = a[R[i]].m,sort(a+L[i],a+R[i]+1,cmp2);
  22. }
  23.  
  24. queue<made>q;
  25. int ans = 0;
  26. bool v[N];
  27. int main(){
  28. freopen("magnet.in","r",stdin);
  29. freopen("magnet.out","w",stdout);
  30. scanf("%lld%lld%d%d%d",&x,&y,&p,&r,&n);
  31. for(int i = 1;i <= n;i++){
  32. ll xx,yy;
  33. scanf("%lld%lld%lld%lld%lld",&xx,&yy,&a[i].m,&a[i].p,&a[i].r);
  34. a[i].le = (xx-x)*(xx-x) + (yy-y)*(yy-y);
  35. }
  36. prework();
  37. q.push((made){0,p,r,0});
  38. while(!q.empty()){
  39. made x = q.front();q.pop();
  40. for(int i = 1;i <= t;i++){
  41. if(mx[i] <= x.p){
  42. for(int j = L[i];j <= R[i];j++){
  43. if(v[j]){L[i] = j+1;continue;}
  44. if(a[j].le <= x.r*x.r)q.push(a[j]),ans++,v[j] = 1,L[i] = j+1;
  45. else break;
  46. }
  47. }
  48. else{
  49. for(int j = L[i];j <= R[i];j++)
  50. if(!v[j] && a[j].m <= x.p && a[j].le <= x.r*x.r)q.push(a[j]),ans++,v[j] = 1;
  51. break;
  52. }
  53. }
  54. }
  55. printf("%d\n",ans);
  56.  
  57. return 0;
  58.  
  59. }
  60.