题目大意:n*m的矩阵中,找到两行数,可以形成两个一维数组,数组1的位置i和数组2的位置i去最大构成新数组b的元素b[i],最终目的要使数组b中最小的数尽可能的大

题解:

  m的范围是(1,8),比较小,我们用二分答案加按位与或来做,维护一个二维数组,当arr[i][j]>=x时,记为1,否则记为0。所以每一行最多有8个数,也就是最多会有pow(2,8)=256种答案。然后对这些数保留与或就行了,时间复杂度logx(max)*(n*m)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF=1e9+;
const ll N=3E5+;
ll arr[N][];
ll mark[N][];
ll goal=;
ll cnt[N];
ll mp[N];
ll n,m;
ll ans1=,ans2=;
bool check(ll x){
memset(mark,,sizeof(mark));
memset(mp,,sizeof mp);
for(ll i=;i<=n;i++){
for(ll j=;j<=m;j++){
if(arr[i][j]>=x) mark[i][j]=;
else mark[i][j]=;
}
}
ll pos=;
for(ll i=;i<=n;i++){
ll c=;
for(ll j=;j<=m;j++){
if(mark[i][j]){
c+=<<(j-);
}
}
if(!mp[c]){
mp[c]=i;
cnt[pos++]=c;
}
}
if(pos==){
if(cnt[]==goal){
ans1=mp[goal];
ans2=mp[goal];
return ;
}
else return ;
}
for(ll i=;i<pos;i++)
for(ll j=i+;j<pos;j++){
if((cnt[i]|cnt[j])==goal) {
ans1=mp[cnt[i]];
ans2=mp[cnt[j]];
return ;
}
}
return ; }
int main(){
ios::sync_with_stdio(false );
cin>>n>>m;
ll left=INF,right=;
for(ll i=;i<=n;i++){
for(ll j=;j<=m;j++){
cin>>arr[i][j];
left=min(left,arr[i][j]);
right=max(right,arr[i][j]);
}
}
for(ll i=;i<m;i++) goal+=<<i;
int ansa=-,ansb=-;
while(left<=right){
ll mid=(left+right)/;
if(check(mid)){
left=mid+;
ansa=ans1;
ansb=ans2;
}
else right=mid-;
}
cout<<ansa<<" "<<ansb<<endl;
return ;
}

D. Minimax Problem Codeforces 1288D binary_search+二进制的更多相关文章

  1. codeforces 1288D. Minimax Problem(二分)

    链接:https://codeforces.com/contest/1288/problem/D D. Minimax Problem 题意:给定n个数组,长度为m,从n中数组挑选两个数组,两个数组中 ...

  2. D. Minimax Problem(二分+二进制)

    D. Minimax Problem time limit per test 5 seconds memory limit per test 512 megabytes input standard ...

  3. Military Problem CodeForces 1006E (dfs序)

    J - Military Problem CodeForces - 1006E 就是一道dfs序的问题 给定一个树, 然后有q次询问. 每次给出u,k, 求以u为根的子树经过深搜的第k个儿子,如果一个 ...

  4. B - Save the problem! CodeForces - 867B 构造题

    B - Save the problem! CodeForces - 867B 这个题目还是很简单的,很明显是一个构造题,但是早训的时候脑子有点糊涂,想到了用1 2 来构造, 但是去算这个数的时候算错 ...

  5. Codeforces 1288D - Minimax Problem

    题目大意: 给定n个序列,每个序列元素个数严格相等于m 你需要找到两个序列a[i]和a[j],使其每个对应位置的元素取大后得到b序列  b[k]=max(a[i][k],a[j][k]) 且让b序列中 ...

  6. 【codeforces】Educational Codeforces Round 80 D. Minimax Problem——二分+二进制处理

    题目链接 题目大意 有n个维度为m的向量,取其中两个进行合并,合并时每个维度取两者之间的较大者,得到的新的向量中,维度值最小者最大为多少 分析 首先最需要注意的是m的取值,m最大只有8 那么我们可以二 ...

  7. Codeforces 484A - Bits 二进制找1

    这题可以根据l, r 在二进制下的长度进行分类. l  的长度小于 r 的时候,有两种可能,一种是r 在二进制下是 1* 这种样子,故答案取 r : 一种是取答案为  (1LL << (r ...

  8. Problem 2062 Suneast & Yayamao 二进制(多重背包的理解基础)

                                          Problem 2062 Suneast & Yayamao Accept: 143    Submit: 313T ...

  9. HDU 5445 Food Problem(多重背包+二进制优化)

    http://acm.hdu.edu.cn/showproblem.php?pid=5445 题意:现在你要为运动会提供食物,总共需要提供P能量的食物,现在有n种食物,每种食物能提供 t 能量,体积为 ...

随机推荐

  1. vnpy源码阅读学习(7):串在一起

    串在一起 我们已经分析了UI.MainEngine.EventEngine.然后他们几个是如何发挥作用的呢?我总结了一张图: 我们来具体的看看UI部分是如何跟EventEngine穿插起来的 \exa ...

  2. 【i春秋综合渗透测试】《我很简单,请不要欺负我》

      第2题:获取目标网站管理员的密码 扫到了后台(/admin),本来想用sqlmap跑一下,但是随便试了个弱口令(admin888)就进去了...   第3题: getshell 配置插马:登录后台 ...

  3. IDEA编写 Scala时没有语法检查和错误提示

    #问题描述 在IDEA中写scala程序时,一些明显的语法错误不进行检查,没有像写Java时的红线什么的,当编译运行时,编译失败. https://blog.csdn.net/weizheng1000 ...

  4. 北邮OJ-257- 最近公共祖先-软件14 java

    思路分析:思路应该比较简单也很容易想的来,就是比较两个节点的最近的祖先节点,要对每个节点依次记录下他的所有祖先节点,包括其自己,因为自己也算自己的祖先节点,这一点题目中没有明确指出 所以比较坑. 我们 ...

  5. Spring Framework之IoC容器

    Spring IoC 概述 问题 1.什么是依赖倒置? 2.什么是控制反转? 3.什么是依赖注入? 4.它们之间的关系是怎样的? 5.优点有哪些? 依赖倒置原则 (Dependency Inversi ...

  6. python中的可变和不可变对象 有序和无序对象

    可变对象和不可变对象的定义:对象存放在地址的值是否可以被改变 不可变对象包括:整形int.浮点型float .字符串str .元祖tuple.布尔型boole 可变对象包括 :列表list.集合set ...

  7. 如何测试Linux命令运行时间?

    良许在工作中,写过一个 Shell 脚本,这个脚本可以从 4 个 NTP 服务器轮流获取时间,然后将最可靠的时间设置为系统时间. 因为我们对于时间的要求比较高,需要在短时间内就获取到正确的时间.所以我 ...

  8. gold 30min

  9. 在linux虚拟机上安装docker并安装mysql

    步骤 1.检查内核版本,必须是3.10及以上 uname -r 2.安装docker yum install docker 3.输入y确认安装 4.启动docker systemctl start d ...

  10. [noip模拟赛]虫洞holes<SPFA>

    虫洞(holes.cpp/c/pas) [题目描述] N个虫洞,M条单向跃迁路径.从一个虫洞沿跃迁路径到另一个虫洞需要消耗一定量的燃料和1单位时间.虫洞有白洞和黑洞之分.设一条跃迁路径两端的虫洞质量差 ...