• 10.16T3 乱搞+最优性剪枝


    这题实际上可以乱搞23333,然后就就AC了

    我们先对x进行排序,然后用vector记录一下相同xy下点的个数

    然后我们可以对这些同一行列点的个数排一个序,从大往小搜索

    对于当前点的坐标我们可以用lower_bound二分确定左右的个数

    在上下左右四个值里面取一个最小值

    如果当前的行或列的点个数小于找到的最大值,直接剪掉就好了,然后。。。。就过了

    复杂度O(n2logn)?神仙复杂度

    code:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<map>
     5 #include<vector>
     6 #define N 100006
     7 using namespace std;
     8 struct node{
     9     long long x,y;
    10 }e[N];
    11 bool cmp(const node &a,const node &b){
    12     if(a.x==b.x)return a.y<b.y;
    13     return a.x<b.x;
    14 }
    15 struct T{
    16     long long id,num;
    17 }X[N],Y[N];
    18 long long read(){
    19     long long x=0,f=1;
    20     char c=getchar();
    21     while(!isdigit(c)){
    22         if(c=='-')f=-1;
    23         c=getchar();
    24     }
    25     while(isdigit(c)){
    26         x=(x<<3)+(x<<1)+c-'0';
    27         c=getchar();
    28     }
    29     return x*f;
    30 }
    31 bool bmp(const T&a,const T&b){
    32     if(a.num==b.num)return a.id<b.id;
    33     return a.num>b.num;
    34 }
    35 vector<long long>x[100001],y[100001];
    36 map<long long,int>check;
    37 int main(){
    38 //    freopen("sern.in","r",stdin);
    39 //    freopen("sern.out","w",stdout);
    40     long long n;
    41     cin>>n;
    42     for(long long i=1;i<=n;i++){
    43         e[i].x=read(),e[i].y=read();
    44         check[e[i].x*1000000+e[i].y]=1;
    45     }
    46     sort(e+1,e+n+1,cmp);
    47     for(long long i=1;i<=n;i++){
    48         x[e[i].x].push_back(e[i].y),y[e[i].y].push_back(e[i].x);
    49         check[e[i].x*1000000+e[i].y]=1;
    50     }
    51     for(long long i=1;i<=n;i++)X[i].num=x[i].size(),X[i].id=i;
    52     for(long long i=1;i<=n;i++)Y[i].num=y[i].size(),Y[i].id=i;
    53     sort(X+1,X+n+1,bmp);
    54     sort(Y+1,Y+n+1,bmp);
    55     long long max0=0;
    56     long long num=0;
    57     for(long long i=1;i<=n;i++){
    58     //    cout<<i<<'
    ';
    59         if((X[i].num)/2<max0)break;
    60         long long min0=25000001;
    61         for(long long j=1;j<=n;j++){
    62             if((Y[j].num)/2<max0)break;
    63             if(check[X[i].id*1000000+Y[j].id])continue;
    64             long long x1=lower_bound(y[Y[j].id].begin(),y[Y[j].id].end(),X[i].id)-y[Y[j].id].begin();
    65             long long y1=lower_bound(x[X[i].id].begin(),x[X[i].id].end(),Y[j].id)-x[X[i].id].begin();
    66             long long sizx=x[X[i].id].size(),sizy=y[Y[j].id].size();
    67             min0=min(x1,min(sizy-x1,min(y1,sizx-y1)));
    68             if(min0>max0){
    69                 max0=min0;
    70                 num=1;
    71             }    
    72             else if(min0==max0){
    73                 num++;
    74             }        
    75         }
    76     }
    77     cout<<max0<<'
    '<<num;
    78     return 0;
    79 }

    over

  • 相关阅读:
    Weblogic学习笔记
    Shiro权限使用
    Shiro权限框架使用总结
    支付宝接口文档说明
    代码模拟实现十六进制转二进制
    代码模拟实现十六进制转换十进制
    四种内部类详细解释和代码示例
    Struts2_struts.xml写法和用法例子
    spring一些方法和用法例子
    Hibernate一些_方法_@注解_代码示例
  • 原文地址:https://www.cnblogs.com/saionjisekai/p/9798410.html
Copyright © 2020-2023  润新知