Educational Codeforces Round 80 D E
A了三题,rk1000左右应该可以上分啦,开。
后面的D,E比赛时就感觉可做,但又想不到方法。
然后我补了下,确实如此。
题意:很简单,给一个矩阵,找两行序列i,j,使得通过每个元素取当列最大合成出来的序列,最小值最大。
hit 1:比赛里我是真的有想二分,最小值最大,这不是经典二分答案套路嘛。
hit 2:比赛里我也是真的有注意到这个m <=8 给的很小,想以此为突破点干点啥?
然后要么太晚了,要么我做了三题自满了,总之没想到最终解法就睡觉了。
其实把二者结合起来,就可以A了这题了。一定注意 如果给的某个数字很小的话,可以二进制转化 。
也就是bitmask,英文好帅。
然后就二分答案,check的时候,对每个序列按是否大于等于你目标值转化成一个二进制串,再找有没有另一个二进制串满足两者通过 按位或 | 起来 得到一个完整的全部满足的全为1的串。
就没了。
贴个代码
- 1 #include <bits/stdc++.h>
- 2 #ifndef ONLINE_JUDGE
- 3 #define debug(x) cout << #x << ": " << x << endl
- 4 #else
- 5 #define debug(x)
- 6 #endif
- 7 using namespace std;
- 8 typedef long long ll;
- 9 const int MAXN=3e5+7;
- 10 const int INF=0x3f3f3f3f;
- 11 const int MOD=1e9+7;
- 12
- 13 int a[MAXN][10],vis[300];
- 14 int ans1,ans2,n,m;
- 15
- 16 bool check(int x)
- 17 {
- 18 for(int i=0;i<(1<<m);++i) vis[i]=0;
- 19 for(int i=1;i<=n;++i)
- 20 {
- 21 int k=0;
- 22 for(int j=0;j<m;++j)
- 23 {
- 24 k+=(a[i][j]>=x)*(1<<j);
- 25 }
- 26 vis[k]=i;
- 27 }
- 28 for(int i=0;i<(1<<m);++i)
- 29 {
- 30 if(!vis[i]) continue;
- 31 for(int j=0;j<(1<<m);++j)
- 32 {
- 33 if(!vis[j]) continue;
- 34 if((i|j)==(1<<m)-1)
- 35 {
- 36 ans1=vis[i],ans2=vis[j];
- 37 return true;
- 38 }
- 39 }
- 40 }
- 41 return false;
- 42 }
- 43
- 44 int main()
- 45 {
- 46 ios::sync_with_stdio(false);
- 47 cin.tie(0);
- 48 cin>>n>>m;
- 49 for(int i=1;i<=n;++i)
- 50 for(int j=0;j<m;++j)
- 51 cin>>a[i][j];
- 52 int l=0,r=INF;
- 53 while(l<=r)
- 54 {
- 55 int mid=l+r>>1;
- 56 if(check(mid)) l=mid+1;
- 57 else r=mid-1;
- 58 }
- 59 cout<<ans1<<' '<<ans2<<endl;
- 60 return 0;
- 61 }
题意:也非常的清晰明了,感觉以前在CF上也见过类似的,不过比这题简单的。就打电话,谁打了就把这个数提到前面。求每个数出现的最小和最大位置。
比赛时,我D想不出,看了眼E,真的有想树状数组维护,但主要我不知道咋移,啥时候哪个位置+1,-1。
然后发现看别人的程序基本就是正解。所以自己算法的思想大致还是到位的,但细部想不出呀。
这题思维的闪光点,主要就是开始时每个元素目前所在pos的设置,设置为i+m,就是预留了m个位置,给询问序列中的m个元素来移动,给开始n个元素的位置设置成虚点!
反正我第一次做是想不到。
别的都很好想,就是对每个询问,也就是给出的序列中给的值,动态的更新位置,并更新最大值,注意新位置应该是从m开始往前,也就是m~1。
树状数组的ask就是询问前缀和,也就是该元素当前处于第几个,也就是他的位置。
贴个代码
- 1 #include <bits/stdc++.h>
- 2 #ifndef ONLINE_JUDGE
- 3 #define debug(x) cout << #x << ": " << x << endl
- 4 #else
- 5 #define debug(x)
- 6 #endif
- 7 using namespace std;
- 8 typedef long long ll;
- 9 const int MAXN=6e5+7;
- 10 const int INF=0x3f3f3f3f;
- 11 const int MOD=1e9+7;
- 12
- 13 int ans1[MAXN],ans2[MAXN],a[MAXN],pos[MAXN],sum[MAXN];
- 14 int n,m;
- 15
- 16 int lowbit(int x) {return x&(-x);}
- 17
- 18 void add(int x,int val)
- 19 {
- 20 while(x<MAXN)
- 21 {
- 22 sum[x]+=val;
- 23 x+=lowbit(x);
- 24 }
- 25 }
- 26
- 27 int ask(int x)
- 28 {
- 29 int res=0;
- 30 while(x)
- 31 {
- 32 res+=sum[x];
- 33 x-=lowbit(x);
- 34 }
- 35 return res;
- 36 }
- 37
- 38 int main()
- 39 {
- 40 ios::sync_with_stdio(false);
- 41 cin.tie(0);
- 42 cin>>n>>m;
- 43 for(int i=1;i<=n;++i)
- 44 {
- 45 ans1[i]=ans2[i]=i;
- 46 pos[i]=i+m;
- 47 }
- 48 for(int i=0;i<m;++i)
- 49 {
- 50 cin>>a[i];
- 51 ans1[a[i]]=1;
- 52 }
- 53 for(int i=1;i<=n;++i)
- 54 add(pos[i],1);
- 55 for(int i=0;i<m;++i)
- 56 {
- 57 int p=a[i];
- 58 ans2[p]=max(ans2[p],ask(pos[p]));
- 59 add(pos[p],-1);
- 60 pos[p]=m-i;
- 61 add(pos[p],1);
- 62 }
- 63 for(int i=1;i<=n;++i)
- 64 ans2[i]=max(ans2[i],ask(pos[i]));
- 65 for(int i=1;i<=n;++i)
- 66 cout<<ans1[i]<<' '<<ans2[i]<<'\n';
- 67 return 0;
- 68 }
Educational Codeforces Round 80 D E的更多相关文章
- Educational Codeforces Round 80 (Rated for Div. 2)
A. Deadline 题目链接:https://codeforces.com/contest/1288/problem/A 题意: 给你一个 N 和 D,问是否存在一个 X , 使得 $x+\lce ...
- Educational Codeforces Round 80 A-E简要题解
contest链接:https://codeforces.com/contest/1288 A. Deadline 题意:略 思路:根据题意 x + [d/(x+1)] 需要找到一个x使得上式小于等于 ...
- Educational Codeforces Round 80 (Rated for Div. 2)D E
D枚举子集 题:https://codeforces.com/contest/1288/problem/D题意:给定n个序列,每个序列m个数,求第i个和第j个序列组成b序列,b序列=max(a[i][ ...
- Educational Codeforces Round 80 (Rated for Div. 2) E. Messenger Simulator
可以推出 min[i]要么是i要么是1,当a序列中存在这个数是1 max[i]的话就比较麻烦了 首先对于i来说,如果还没有被提到第一位的话,他的max可由他后面的这部分序列中 j>=i 的不同数 ...
- Educational Codeforces Round 80 (Rated for Div. 2)部分题解
A. Deadline 题目链接 题目大意 给你\(n,d\)两个数,问是否存在\(x\)使得\(x+\frac{d}{x+1}\leq n\),其中\(\frac{d}{x+1}\)向上取整. 解题 ...
- Educational Codeforces Round 80 (Rated for Div. 2)(A-E)
C D E 这三道题感觉挺好 决定程序是否能通过优化在要求的时间内完成,程序运行时间为t,你可以选择花X天来优化,优化后程序的运行时间为t/(x+1)取上整,花费的时间为程序运行时间加上优 ...
- Educational Codeforces Round 80 (Rated for Div. 2)E(树状数组,模拟,思维)
#define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; ],mx[],a[],pos[],sum ...
- Educational Codeforces Round 80 (Rated for Div. 2)D(二分答案,状压检验)
这题1<<M为255,可以logN二分答案后,N*M扫一遍表把N行数据转化为一个小于等于255的数字,再255^2检验答案(比扫一遍表复杂度低),复杂度约为N*M*logN #define ...
- Educational Codeforces Round 80 (Rated for Div. 2)C(DP)
#define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; ; ][],temp[][]; int ...
随机推荐
- 百度小程序富文本bdParse遇到的坑
百度开发工具能正常显示文章图文详情, web浏览也可以, app浏览就不行, 审核说兼容性问题, 都不是, 后来发现是后台传输的数据问题, 不能用json_encode()返回数据
- uni-app 快速认识
uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS.Android.H5.以及各种小程序(微信/阿里/百度/头条/QQ)等多个平台. 即使不跨端,un ...
- Spring Data Jpa一对多单向映射
/** @author StormMaybin @date 2017-01-17 */ 生命不息,奋斗不止! 一对多映射关系 在JPA中,用@OneToMany来标识一对多的关系.实现一对多的单向关联 ...
- css3图片展示方式
<view class='img_block' id='mjltest'> <view class='text_view'> <view class='{{cell_cl ...
- word 筛选过的网页,网页,单个文件网页
1)筛选过的网页:保存后会生成 xxx.htm和xxx.files文件夹,删除了还原成Word文档所需的格式标记和功能,也就是说存为纯网页了,文件尺寸小:2)网页:保存后会生成 xxx.htm和xxx ...
- 12563 - Jin Ge Jin Qu hao——[DP递推]
(If you smiled when you see the title, this problem is for you ^_^) For those who don’t know KTV, se ...
- linux 编译模块
第一步, 我们需要看一下模块如何必须被建立. 模块的建立过程与用户空间的应用程序的 建立过程有显著不同; 内核是一个大的, 独立的程序, 对于它的各个部分如何组合在一起 有详细的明确的要求. 建立过程 ...
- msbuild 项目文件常用判断条件
在写项目文件的时候,需要根据不同的条件定义或执行不同的代码,有一些比较常使用的判断,本文收藏起来,方便大家找 在 msbuild 的项目文件 cspoj 或 xx.target 等文件里面,可以使用 ...
- 洛谷——P1305 新二叉树(新建二叉树以及遍历)
题目描述输入一串二叉树,用遍历前序打出. 输入输出格式输入格式: 第一行为二叉树的节点数n.(n \leq 26n≤26) 后面n行,每一个字母为节点,后两个字母分别为其左右儿子. 空节点用*表示 输 ...
- 【47.63%】【hdu 1532】Drainage Ditches
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s) ...