这题1<<M为255,可以logN二分答案后,N*M扫一遍表把N行数据转化为一个小于等于255的数字,再255^2检验答案(比扫一遍表复杂度低),复杂度约为N*M*logN
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int a[300007][10]; 5 int b[300007][10]; 6 int n,m; 7 int ans,ans2; 8 int tempp[300007],pre[300007]; 9 int zhuangya(int x,int y){ 10 for(int i=1;i<=m;++i){ 11 if(x%2==0&&y%2==0) 12 return 0; 13 x/=2; 14 y/=2; 15 } 16 return 1; 17 } 18 int check(int x){ 19 int mx=1<<m; 20 for(int i=1;i<=n;++i){ 21 int temp=0; 22 for(int j=1;j<=m;++j){ 23 if(a[i][j]>=x)//大于等于x的二进制下这一位记为1 24 temp+=pre[j];//加上2^(j-1) 25 tempp[temp]=i;//记下第i行是可以表示temp这个数字的(在temp二进制下都为1的位全为1) 26 } 27 } 28 for(int i=0;i<mx;++i){ 29 if(tempp[i]==-1)//有一行数字满足把i转化为二进制后为1的位上全为1 30 continue; 31 for(int j=0;j<mx;++j){ 32 if(tempp[j]==-1)//有一行数字满足把j转化为二进制后为1的位上全为1 33 continue; 34 int temppp=zhuangya(i,j);//i和j没有在二进制下同一位全为0的,即这两个数字或起来每一位都为1 35 if(temppp){ 36 ans=tempp[i]; 37 ans2=tempp[j]; 38 return 1; 39 } 40 } 41 } 42 return 0; 43 } 44 int main(){ 45 ios::sync_with_stdio(false); 46 cin.tie(NULL); 47 cout.tie(NULL); 48 pre[1]=1; 49 for(int i=2;i<=8;++i) 50 pre[i]=2*pre[i-1]; 51 cin>>n>>m; 52 for(int i=1;i<=n;++i) 53 for(int j=1;j<=m;++j) 54 cin>>a[i][j]; 55 int l=0,r=1e9; 56 int ansl=0,ansr=0; 57 while(l<=r){ 58 memset(tempp,-1,sizeof(tempp));//把桶初始化 59 int mid=(l+r)>>1;//二分答案 60 int temp=check(mid); 61 if(temp==1){ 62 ansl=ans; 63 ansr=ans2; 64 l=mid+1; 65 } 66 else{ 67 r=mid-1; 68 } 69 } 70 cout<<ansl<<" "<<ansr; 71 return 0; 72 }
原文地址:https://www.cnblogs.com/ldudxy/p/12200651.html
时间: 2024-11-06 09:49:03