http://codeforces.com/contest/1288/problem/D
题意:
给出一张n*m的表a[n][m],m<=8,从中任选两行i,j
令b[k]=max(a[i][k],a[j]k])
最大化 min(b[k])
二分答案x
若a[i][j]>=x,令c[i][j]=1,否则c[i][j]=0
若最终答案>=x,则存在i,j,满足c中第i行和第j行 按位或 的结果都是1
枚举行肯定超时
m<=8,每一行的01状态不超过256种,所以可以枚举行的01状态
可以用bitset做
#include<cmath>
#include<cstdio>
#include<bitset>
#include<cstring>
#include<iostream>
using namespace std;
#define N 300001
int n,m,a[N][8];
bitset<8>b[N];
int vis[256];
int use[256][256],siz[256];
int all;
int turn[N];
bool check(int x)
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;++i)
{
b[i].reset();
for(int j=0;j<m;++j)
if(a[i][j]>=x) b[i].set(j);
vis[b[i].to_ulong()]++;
}
for(int i=0;i<=all;++i)
if(vis[i])
for(int j=1;j<=siz[i];++j)
if(vis[use[i][j]]) return true;
return false;
}
void solve(int x)
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;++i)
{
b[i].reset();
for(int j=0;j<m;++j)
if(a[i][j]>=x) b[i].set(j);
vis[b[i].to_ulong()]++;
turn[i]=b[i].to_ulong();
}
int p=-1,q;
for(int i=0;i<=all && p==-1;++i)
if(vis[i])
for(int j=1;j<=siz[i];++j)
if(vis[use[i][j]])
{
p=i;
q=use[i][j];
break;
}
int pp,qq;
for(int i=1;i<=n;++i)
{
if(turn[i]==p) pp=i;
if(turn[i]==q) qq=i;
}
printf("%d %d",pp,qq);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=0;j<m;++j)
scanf("%d",&a[i][j]);
int l=0,r=1e9,mid,mx;
all=pow(2,m)-1;
for(int i=0;i<=all;++i)
for(int j=i;j<=all;++j)
if((i|j)==all) use[i][++siz[i]]=j;
while(l<=r)
{
mid=l+r>>1;
if(check(mid)) mx=mid,l=mid+1;
else r=mid-1;
}
solve(mx);
return 0;
}
You are given nn arrays a1a1 , a2a2 , ..., anan ; each array consists of exactly mm integers. We denote the yy -th element of the xx -th array as ax,yax,y .
You have to choose two arrays aiai and ajaj (1≤i,j≤n1≤i,j≤n , it is possible that i=ji=j ). After that, you will obtain a new array bb consisting of mm integers, such that for every k∈[1,m]k∈[1,m] bk=max(ai,k,aj,k)bk=max(ai,k,aj,k) .
Your goal is to choose ii and jj so that the value of mink=1mbkmink=1mbk is maximum possible.
The first line contains two integers nn and mm (1≤n≤3⋅1051≤n≤3⋅105 , 1≤m≤81≤m≤8 ) — the number of arrays and the number of elements in each array, respectively.
Then nn lines follow, the xx -th line contains the array axax represented by mm integers ax,1ax,1 , ax,2ax,2 , ..., ax,max,m (0≤ax,y≤1090≤ax,y≤109 ).
Print two integers ii and jj (1≤i,j≤n1≤i,j≤n , it is possible that i=ji=j ) — the indices of the two arrays you have to choose so that the value of mink=1mbkmink=1mbk is maximum possible. If there are multiple answers, print any of them.
6 5 5 0 3 1 2 1 8 9 1 3 1 2 3 4 5 9 1 0 3 7 2 3 0 6 3 6 4 1 7 0
1 5
来源:https://www.cnblogs.com/TheRoadToTheGold/p/12219323.html