1 条题解

  • 6
    @ 2026-1-19 8:57:15

    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;
    }
    
    • @ 2026-2-26 11:14:19

      低客的黑调有多可怕

  • 1

信息

ID
613
时间
1000ms
内存
256MiB
难度
10
标签
(无)
递交数
11
已通过
1
上传者