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. DFS+BFS(广度优先搜索弥补深度优先搜索遍历漏洞求合格条件总数)--09--DFS+BFS--蓝桥杯剪邮票

    题目描述 如下图, 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)  比如,下面两张图中,粉红色所示部分就是合格的剪取.  请你计算,一共有多少 ...

  2. App开发(连接外部服务器)

    第一步:导入httpClient第二步: 容许网络接口权限<uses-permission android:name="android.permission.INTERNET" ...

  3. POJ - 2718 Smallest Difference(全排列)

    题意:将n个数字分成两组,两组分别组成一个数字,问两个数字的最小差值.要求,当组内数字个数多于1个时,组成的数字不允许有前导0.(2<=n<=10,每个数字范围是0~9) 分析: 1.枚举 ...

  4. choice接口、同花顺使用

    一 choice接口使用 1.choice软件-->量化-->下载中心,下载python接口文件 EMQuantAPI_Python 2.要先绑定手机号,绑定后账户权限不够,暂时放弃. 二 ...

  5. vnpy交易接口学习

    1.按照github中环境准备要求,配置好环境要求. https://github.com/vnpy/vnpy mongdb安装在D:\Program Files\MongoDB\Server\3.4 ...

  6. mysql字符类型总结及常用字符函数

    常用字符串函数: concat(s1,s2,s3..)       连接s1,s2,...sn为一个字符串 INSERT(str,x,y,instr)将字符串str从x位置开始,y个字符串替换为字符串 ...

  7. python + selenium +win32gui + winspy 实现图片上传

    过程:模拟点击上传按钮,打开Windows对话框,编辑栏输入文件路径(或网址)点击确定.网上随便找了一个进行测试. 点击后出现Windows上传对话框 用 winspy 来检测窗口的句柄 python ...

  8. 操作实践:maven工程查找工程中多余的jar包

    声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 版本迭代过程中对jar的依赖可能会产生变化,一些本不必再依赖的jar包可以因为没有清除而依然留在版本的发布 ...

  9. 吴裕雄--天生自然 JAVASCRIPT开发学习: DOM

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. SQL基础教程(第2版)第3章 聚合与排序:3-3 为聚合结果指定条件

    第3章 聚合与排序:3-3 为聚合结果指定条件 ● 使用COUNT函数等聚合函数对表中数据进行汇总操作时,为其指定条件的不是WHERE子句,而是HAVING子句.● 聚合函数可以在SELECT子句. ...