zoukankan      html  css  js  c++  java
  • Contest Hunter #46 T1 磁力块 [分块]

    描述

    在一片广袤无垠的原野上,散落着N块磁石。每个磁石的性质可以用一个五元组(x,y,m,p,r)描述,其中x,y表示其坐标,m是磁石的质量,p是磁力,r是吸引半径。若磁石A与磁石B的距离不大于磁石A的吸引半径,并且磁石B的质量不大于磁石A的磁力,那么A可以吸引B。
    小取酒带着一块自己的磁石L来到了这篇原野的(x0,y0)处,我们可以视为磁石L的坐标为(x0,y0)。小取酒手持磁石L并保持原地不动,所有可以被L吸引的磁石将会被吸引过来。在每个时刻,他可以选择更换任意一块自己已经获得的磁石(当然也可以是自己最初携带的L磁石)在(x0,y0)处吸引更多的磁石。小取酒想知道,他最多能获得多少块磁石呢?

    输入格式

    第一行五个整数x0,y0,pL,rL,N,表示小取酒所在的位置,磁石L磁力、吸引半径和原野上散落磁石的个数。
    接下来N行每行五个整数x,y,m,p,r,描述一块磁石的性质。

    输出格式

    输出一个整数,表示最多可以获得的散落磁石个数(不包含最初携带的磁石L)。

    样例输入

    0 0 5 10 5
    5 4 7 11 5
    -7 1 4 7 8
    0 2 13 5 6
    2 -3 9 3 4
    13 5 1 9 9
    

    样例输出

    3

    数据范围与约定

    • 对于30%的数据,1<=N<=1000。
    • 对于100%的数据,1<=N<=250000,-10^9<=x,y<=10^9,1<=m,p,r<=10^9。

    将石块按距离分块,每块内按质量排序。挨个尝试用已有的石头吸引剩下的石头即可。

    一直觉得分块就是稍有些技巧的暴力……

    事实上这题的标解分块还真不如我的花式暴力跑得快23333

    花式暴力:http://www.cnblogs.com/SilverNebula/p/5929674.html

     1 /*by SilverN*/
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<cmath>
     7 using namespace std;
     8 const int w=700;
     9 const int mxn=270000;
    10 int read(){
    11     int x=0,f=1;char ch=getchar();
    12     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    13     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    14     return x*f;
    15 }
    16 struct node{
    17     double dis;
    18     int m,p,r;
    19     bool got;
    20 }p[mxn];
    21 int hd[mxn];
    22 int cmpd(const node a,const node b){
    23     return a.dis<b.dis;
    24 }
    25 int cmpm(const node a,const node b){
    26     return a.m<b.m;
    27 }
    28 //
    29 int L[mxn],R[mxn],tot=0;
    30 double D[mxn];
    31 //
    32 struct tool{
    33     int p,r;
    34 }t[mxn];int cnt=1;
    35 int head=1;
    36 int n;
    37 int x0,yy0;
    38 double dist(int x1,int y1,int x2,int y2){
    39     return sqrt( (double)(x1-x2)*(x1-x2)+(double)(y1-y2)*(y1-y2) );
    40 }
    41 int main(){
    42     x0=read();yy0=read();
    43     int i,j;
    44     t[1].p=read();t[1].r=read();
    45     n=read();
    46     int x,y;
    47     for(i=1;i<=n;i++){
    48         x=read();y=read();
    49         p[i].dis=dist(x,y,x0,yy0);
    50         p[i].m=read();    p[i].p=read();    p[i].r=read();
    51         p[i].got=0;
    52     }
    53     sort(p+1,p+n+1,cmpd);
    54     for(i=1;i<=n;i+=w){
    55         L[++tot]=i;R[tot]=min(n,i+w-1);D[tot]=p[R[tot]].dis;
    56         sort(p+L[tot],p+R[tot]+1,cmpm);
    57     }
    58     while(head<=cnt){
    59         tool now=t[head];
    60         for(i=1;i<=tot;i++){
    61             if(D[i]>now.r){
    62                 for(j=L[i];j<=R[i];j++)
    63                     if(!p[j].got && p[j].dis<=now.r && p[j].m<=now.p){
    64                         t[++cnt].p=p[j].p;
    65                         t[cnt].r=p[j].r;
    66                         p[j].got=1;
    67                     }
    68                 break;
    69             }
    70             while(L[i]<=R[i] && p[L[i]].m<=now.p){
    71                 if(!p[L[i]].got){
    72                     p[L[i]].got=1;
    73                     t[++cnt].p=p[L[i]].p;
    74                     t[cnt].r=p[L[i]].r;
    75                 }
    76                 L[i]++;
    77             }
    78         }
    79         head++;
    80     }
    81     printf("%d
    ",cnt-1);
    82     return 0;
    83 }
  • 相关阅读:
    Leetcode 16.25 LRU缓存 哈希表与双向链表的组合
    Leetcode437 路径总和 III 双递归与前缀和
    leetcode 0404 二叉树检查平衡性 DFS
    Leetcode 1219 黄金矿工 暴力回溯
    Leetcode1218 最长定差子序列 哈希表优化DP
    Leetcode 91 解码方法
    Leetcode 129 求根到叶子节点数字之和 DFS优化
    Leetcode 125 验证回文串 双指针
    Docker安装Mysql记录
    vmware虚拟机---Liunx配置静态IP
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5929668.html
Copyright © 2011-2022 走看看