1 条题解
-
6
bitset最伟大!二分答案 记序列中比mid大的为1,否则记0
冒泡排序后 如果第p位是1,则答案比mid大,否则答案比mid小
尝试模拟一下冒泡排序
0010001100101000100 ->
0000011001010001001
容易发现 冒泡排序时每轮排序会将每个1移到下一个1的前面
等价于将所有1向左平移一位,并将第一个1移到最右边
这个过程可以用bitset简单的维护
复杂度O(n*logn)
#include<bits/stdc++.h> using namespace std; #define int long long int n,m,p,a[101000]; const int inf=1e9; bitset<101000>bt,nw; int ok(int mid){ bt.reset(); int cnt=0; for(int i=1;i<=n;i++){ if(a[i]>mid){ cnt++; if(cnt>m) bt[i]=1; } } nw=(bt>>m); if(nw[p]==1) return 1; if(cnt>=n-p+1&&m>=n-p+1) return 1; return 0; } signed main(){ ios::sync_with_stdio(0); cin.tie(0); cin>>n>>m>>p; for(int i=1;i<=n;i++){ cin>>a[i]; } int l=1,r=inf; while(l<r){ int mid=(l+r)/2; if(ok(mid)==0) r=mid; else l=mid+1; }cout<<l; return 0; }
- 1
信息
- ID
- 613
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 11
- 已通过
- 1
- 上传者