zoukankan      html  css  js  c++  java
  • [loj3179]视觉程序

    暴力做法:1.对每一行/列求$or$;2.枚举行的差值$i$,并对任意相差为$i$的行和相差为$k-i$的列求$and$,对行/列的$and$结果求$or$,对行和列的$or$求$and$,对所有$i$的$and$求$or$即为答案
    很明显,这样的指令数达到了$o(n^{2})$,需要优化
    上述做法的瓶颈在于枚举距离,没有将行和列分开处理,那么容易想到将坐标系旋转,即$(x,y)=>(x-y,x+y)$
    此时,对于两点的坐标$(x_{1},y_{1})$和$(x_{2},y_{2})$,两点间的距离为$max(|x_{1}-y_{1}|,|x_{2}-y_{2}|)$,那么相当于要求一维恰好为$k$且另一维不超过$k$,简单判定即可
    具体做法:1.对每一行/列(新图中的)求$or$;2.判定是否恰好为$k$,对任意差为$k$的行/列求$and$,对行/列的结果求$or$;3.判定是否不超过$k$(以行为例),对每一行将之后的$k$行$or$再与自己$and$一下(特殊情况:在同一行,将所有位置$xor$一下以起$or$即可);4.最终将4个结果合并起来即为答案
    大概的复杂度分别是$o(n)$和$o(n^{2})$,常数十分宽松
     1 #include "vision.h"
     2 #include<bits/stdc++.h>
     3 using namespace std;
     4 #define N 405
     5 vector<int>vx[N],vy[N];
     6 int n,m,k,sx1,sx2,sy1,sy2,vis[N];
     7 vector<int> vec(int x,int y){
     8     vector<int>v;
     9     v.push_back(x);
    10     v.push_back(y);
    11     return v;
    12 }
    13 int calc1(){
    14     vector<int>v;
    15     for(int i=0;i<n+m-k;i++)
    16         if ((vis[i])&&(vis[i+k]))v.push_back(add_and(vec(vis[i],vis[i+k])));
    17     return add_or(v);
    18 }
    19 int calc2(){
    20     vector<int>v,vv;
    21     for(int i=0;i<n+m;i++)
    22         if (vis[i])vv.push_back(vis[i]);
    23     v.push_back(add_xor(vv));
    24     for(int i=0;i<n+m;i++){
    25         vv.clear();
    26         for(int j=1;j<=k;j++)
    27             if ((i+j<n+m)&&(vis[i+j]))vv.push_back(vis[i+j]);
    28         if ((vis[i])&&(vv.size()))v.push_back(add_and(vec(vis[i],add_or(vv))));
    29     }
    30     return add_or(v);
    31 }
    32 void construct_network(int nn,int mm,int kk){
    33     n=nn,m=mm,k=kk;
    34     for(int i=0;i<n;i++)
    35         for(int j=0;j<m;j++){
    36             vx[i-j+m].push_back(i*m+j);
    37             vy[i+j].push_back(i*m+j);
    38         }
    39     for(int i=0;i<n+m;i++)
    40         if (vx[i].size())vis[i]=add_or(vx[i]);
    41     int s1=calc1(),s2=calc2();
    42     memset(vis,0,sizeof(vis));
    43     for(int i=0;i<n+m;i++)
    44         if (vy[i].size())vis[i]=add_or(vy[i]);
    45     add_or(vec(add_and(vec(s1,calc2())),add_and(vec(s2,calc1()))));
    46 }
    View Code
  • 相关阅读:
    spring(三):ApplicationContext
    android Xutils dbutils 注解
    android 录音的断点续传
    android 原生dialog对话框
    android asyncTask 详解
    自定义的dialog
    fragment 添加menu
    android baseApplication 基类
    看项目得到info_freeCsdn-01闪屏页面
    开源项目 github
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/13452349.html
Copyright © 2011-2022 走看看