D枚举子集

题:https://codeforces.com/contest/1288/problem/D
题意:给定n个序列,每个序列m个数,求第i个和第j个序列组成b序列,b序列=max(a[i][k],a[j][k]),使得b序列最小值最大化,求达成条件的 i 和 j (i可等于j)

分析1:因为m<=8,所以我们考虑对每个序列的m个数进行状压。

   这题的状压是,“1”状态,表示取max取到了这个位置,“0”就表示max没取到这个位置。

   因为题目要求很明确,要b序列最小值最大化,所以我们不用考虑取max后哪个数覆盖哪个数,只需考虑最小值应该是第几个序列即可

   然后就对应俩个序列进行最大化匹配即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
const int inf=0x3f3f3f3f;
const ll INF=1e18;
const int M=1e3+;
int a[];
int maxx[M],maxid[M];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
for(int j=;j<=m;j++)
scanf("%d",&a[j]);
for(int j=;j<(<<m);j++){
int minn=inf;
for(int k=;k<m;k++){
if(j&(<<k))
minn=min(minn,a[k+]);
}
if(minn>=maxx[j]){
maxx[j]=minn;
maxid[j]=i;
}
}
}
int ans=-,x,y;
for(int i=;i<(<<m);i++){
if(ans<min(maxx[i],maxx[(<<m)--i])){
ans=min(maxx[i],maxx[(<<m)--i]);
x=maxid[i];
y=maxid[(<<m)--i];
}
}
printf("%d %d",x,y);
return ;
}

分析2:二分答案,将满足条件的位置用状压记录下来更新即可。

#include<bits/stdc++.h>
using namespace std;
int ansi,ansj,limit;
const int N=1e3+;
const int M=3e5+;
int a[M][],pos[N],p[];
int n,m;
bool check(int x){
for(int i=;i<=limit;i++)
pos[i]=;
for(int i=;i<=n;i++){
int now=;
for(int j=;j<=m;j++)
if(a[i][j]>=x)
now|=p[j];
pos[now]=i;///状态now由第i个序列得来
}
for(int i=;i<=limit;i++)
for(int j=i;j<=limit;j++){
if((i|j)==limit&&pos[i]&&pos[j]){
return ansi=pos[i],ansj=pos[j],true;
}
}
return false;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&a[i][j]);
limit=(<<m)-;
for(int i=;i<=m;i++){
p[i]=<<(i-);
}
int l=,r=1e9;
while(l<=r){
int midd=(l+r)>>;
if(check(midd))
l=midd+;
else
r=midd-;
}
printf("%d %d\n",ansi,ansj);
return ;
}

E BIT

题:https://codeforces.com/contest/1288/problem/E

题意:对于从1~n的一个序列,给定m个操作,每个操作给定一个数x,含义为将x提到序列的第一个位置,问每个数可能的最小最大位置是多少

分析:最小位置俩种可能,有被操作过答案就是1,否则就是本身数值,至于最大值,我们考虑事先考虑将n个数挪后m+1个位置(因为最多m个操作),目的是留出m个位置给要提出来的数;

   然后我每次提出来一个数就统计一下这个数前面有多少个 数,取max之后BIT更新一下,一直重复m步操作。

#include<bits/stdc++.h>
using namespace std;
const int M=1e6+;
int pos[M],minn[M],maxx[M],tr[M];
void add(int x,int c){
while(x<M)
tr[x]+=c,x+=(x&-x);
}
int Sum(int x){
int ans=;
while(x)
ans+=tr[x],x-=(x&-x);
return ans;
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
pos[i]=m++i;
minn[i]=maxx[i]=i;
add(pos[i],);
}
int nowpos=m+;
while(m--){
int x;
scanf("%d",&x);
minn[x]=;
int num=Sum(pos[x]);
maxx[x]=max(maxx[x],num);
add(pos[x],-);///消除这个位置的标记
pos[x]=nowpos--;
add(pos[x],);
}
for(int i=;i<=n;i++){
int num=Sum(pos[i]);
maxx[i]=max(maxx[i],num);
}
for(int i=;i<=n;i++)
printf("%d %d\n",minn[i],maxx[i]);
return ;
}

Educational Codeforces Round 80 (Rated for Div. 2)D E的更多相关文章

  1. Educational Codeforces Round 80 (Rated for Div. 2)

    A. Deadline 题目链接:https://codeforces.com/contest/1288/problem/A 题意: 给你一个 N 和 D,问是否存在一个 X , 使得 $x+\lce ...

  2. Educational Codeforces Round 80 (Rated for Div. 2) E. Messenger Simulator

    可以推出 min[i]要么是i要么是1,当a序列中存在这个数是1 max[i]的话就比较麻烦了 首先对于i来说,如果还没有被提到第一位的话,他的max可由他后面的这部分序列中 j>=i 的不同数 ...

  3. Educational Codeforces Round 80 (Rated for Div. 2)部分题解

    A. Deadline 题目链接 题目大意 给你\(n,d\)两个数,问是否存在\(x\)使得\(x+\frac{d}{x+1}\leq n\),其中\(\frac{d}{x+1}\)向上取整. 解题 ...

  4. Educational Codeforces Round 80 (Rated for Div. 2)(A-E)

    C D E 这三道题感觉挺好       决定程序是否能通过优化在要求的时间内完成,程序运行时间为t,你可以选择花X天来优化,优化后程序的运行时间为t/(x+1)取上整,花费的时间为程序运行时间加上优 ...

  5. Educational Codeforces Round 80 (Rated for Div. 2)E(树状数组,模拟,思维)

    #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; ],mx[],a[],pos[],sum ...

  6. Educational Codeforces Round 80 (Rated for Div. 2)D(二分答案,状压检验)

    这题1<<M为255,可以logN二分答案后,N*M扫一遍表把N行数据转化为一个小于等于255的数字,再255^2检验答案(比扫一遍表复杂度低),复杂度约为N*M*logN #define ...

  7. Educational Codeforces Round 80 (Rated for Div. 2)C(DP)

    #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; ; ][],temp[][]; int ...

  8. Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...

  9. Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...

随机推荐

  1. 2. react 简书 头部 (header) 样式编写

    1. 在 src 下 创建 common 文件下 创建 header 文件夹下 创建 index.js #src/common/header/index.js import React, {Compo ...

  2. python基础【2】——python数据类型之字符串

    python数据类型-字符串 一. 字符串的表示方法(str) 作用: 记录文本信息 表示方法:' ' 单引号 " "双引号 ''' '''三单引号 ""&qu ...

  3. 201812-2 小明放学 Java

    思路: 红绿灯每种灯亮划分区间,在[0,r]区间内红灯亮,在(r,g+r]区间内绿灯亮,在(r+g,r+g+y]区间内黄灯亮,在划分好区间后只需要判断当小明到达红绿灯时是哪个灯在亮,就可以判断出通过红 ...

  4. UML-设计模式-对一组相关的对象使用抽象工厂模式

    1.场景 问题: javapos驱动,有2套,一套是IBM的,另一套是NCR的.如: 使用IBM硬件时要用IBM的驱动,使用NCR的硬件时要用NCR的驱动.那该如何设计呢? 注意,此处需要创建一组类( ...

  5. ArchLinux安装(BIOS)

    ArchLinux安装(BIOS) 说在前头:在经历过无数次的失败尝试过后总结出的可用的安装过程(比官方的简单一点) 官方安装指导 一.连接网络 1.连接 # wifi-menu 2.检查是否联通 ( ...

  6. BUUCTF-[HCTF 2018]WarmUp

    php中可以使用strpos函数与mb_strpos函数获取指定的字符串在别一个字符串中首次出现的位置,也可以使用它们判断一串字符串中是否包含别一个字符串. PHP strpos() 函数 查找 &q ...

  7. (day 1)创建项目--1

    1.利用cmd(命令行)创建项目myblog 确定好项目要放在哪个directory. dir一下创建好的项目看下有什么 django自带有一个小型的服务器可通过  runserver 启动它 可取浏 ...

  8. 2019.9.30极限测试 04.JAVA语言课堂测试试卷-极限测试

    题目存储在上传的文件当中. 代码实现 Subway 类: package ClassroomTest; public class Subway { private String railway; pr ...

  9. 牛逼了,用Python破解wifi密码

    Python真的是无所不能,原因就是因为Python有数目庞大的库,无数的现成的轮子,让你做很多很多应用都非常方便.wifi跟我们的生活息息相关,无处不在.今天从WiFi连接的原理,再结合代码为大家详 ...

  10. [转]java 的HashMap底层数据结构

    java 的HashMap底层数据结构   HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-v ...