D. Minimax Problem Codeforces 1288D binary_search+二进制
题目大意: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+二进制的更多相关文章
- codeforces 1288D. Minimax Problem(二分)
链接:https://codeforces.com/contest/1288/problem/D D. Minimax Problem 题意:给定n个数组,长度为m,从n中数组挑选两个数组,两个数组中 ...
- D. Minimax Problem(二分+二进制)
D. Minimax Problem time limit per test 5 seconds memory limit per test 512 megabytes input standard ...
- Military Problem CodeForces 1006E (dfs序)
J - Military Problem CodeForces - 1006E 就是一道dfs序的问题 给定一个树, 然后有q次询问. 每次给出u,k, 求以u为根的子树经过深搜的第k个儿子,如果一个 ...
- B - Save the problem! CodeForces - 867B 构造题
B - Save the problem! CodeForces - 867B 这个题目还是很简单的,很明显是一个构造题,但是早训的时候脑子有点糊涂,想到了用1 2 来构造, 但是去算这个数的时候算错 ...
- Codeforces 1288D - Minimax Problem
题目大意: 给定n个序列,每个序列元素个数严格相等于m 你需要找到两个序列a[i]和a[j],使其每个对应位置的元素取大后得到b序列 b[k]=max(a[i][k],a[j][k]) 且让b序列中 ...
- 【codeforces】Educational Codeforces Round 80 D. Minimax Problem——二分+二进制处理
题目链接 题目大意 有n个维度为m的向量,取其中两个进行合并,合并时每个维度取两者之间的较大者,得到的新的向量中,维度值最小者最大为多少 分析 首先最需要注意的是m的取值,m最大只有8 那么我们可以二 ...
- Codeforces 484A - Bits 二进制找1
这题可以根据l, r 在二进制下的长度进行分类. l 的长度小于 r 的时候,有两种可能,一种是r 在二进制下是 1* 这种样子,故答案取 r : 一种是取答案为 (1LL << (r ...
- Problem 2062 Suneast & Yayamao 二进制(多重背包的理解基础)
Problem 2062 Suneast & Yayamao Accept: 143 Submit: 313T ...
- HDU 5445 Food Problem(多重背包+二进制优化)
http://acm.hdu.edu.cn/showproblem.php?pid=5445 题意:现在你要为运动会提供食物,总共需要提供P能量的食物,现在有n种食物,每种食物能提供 t 能量,体积为 ...
随机推荐
- POJ1270 toposort+DFS+回溯
题目链接:http://poj.org/problem?id=1270 这道题其实就是求所有满足条件的topo序,我们考虑到给定的字符是确定的,也就是他们的长度都是一样的,所以为了得到所有的情况,我们 ...
- Java基础语法(8)-数组中的常见排序算法
title: Java基础语法(8)-数组中的常见排序算法 blog: CSDN data: Java学习路线及视频 1.基本概念 排序: 是计算机程序设计中的一项重要操作,其功能是指一个数据元素集合 ...
- mongodb_2
一.游标 在mongodb中,底层使用js引擎进行各种操作,所以我们在命令行窗口,可直接执行js代码. #使用for循环,插入1000条数据. > for (var i=0;i<1000; ...
- 结合生活,剖析《生产者消费者模型》-java多线程(一)
博客园的园友们好,看博客园上各位大佬的文章,已陪伴了我程序员职业的三年, 如今自己同样希望能把自己从小白到菜鸟的成长过程分享给大家.不定期更新!!! 首先我本人智商不高,理解问题十分吃力,完全不属于天 ...
- 学习GAN必须阅读的10篇论文
本文转载自:魔图互联.欢迎访问网站查看详细教程:Tensorflow(pytorch)系列教程 生成对抗网络是深度学习中最有趣和最受欢迎的应用之一.本文将列出 10 篇关于 GAN 的论文,这些论文详 ...
- Jmeter接口测试实战之HTTP Cookie管理器(十二 )
在使用测试工具Jmeter做接口测试中,怎么记录下它登录成功后的信息,在接口测试的应用场景中,一般对业务的操作都是基于用户登录情况下的操作.它的测试步骤相对来说很简单的,其实在Jmeter的测试工具中 ...
- NSObject常用方法
类 @interface NSObject <NSObject> { Class isa OBJC_ISA_AVAILABILITY; } // 初始化加载 + (void)load; / ...
- ICPC训练周赛 Benelux Algorithm Programming Contest 2019
D. Wildest Dreams 这道题的意思是Ayna和Arup两人会同时在车上一段时间,在Ayna在的时候,必须单曲循环Ayna喜欢的歌,偶数段Ayna下车,若此时已经放了她喜欢的那首歌,就要将 ...
- MATLAB GUI设计(1)
一.新建GUI 1.命令行窗口输入 guide会出来如下界面,可以新建空白GUI,也可以打开已有GUI 2.通过工具栏新建 二.数据传递例子 1.添加输入框按钮,设置尺寸大小,内容,格式,标签 2.复 ...
- Java系列之数组
原文首发于微信公众号:jzman-blog,欢迎关注交流! 本来打算温习一下注解方面的内容作为今天的推送,但是来不及写了,那就一起来看一下数组,数组是用来存放一组具有相同类型数据的数据结构,通过下标来 ...