zoukankan      html  css  js  c++  java
  • K-th Number

    K-th Number

    Problem:

    Alice are given an array A[1..N] with N numbers.
    Now Alice want to build an array B by a parameter K as following rules:
    Initially, the array B is empty. Consider each interval in array A. If the length of this interval is less than K, then ignore this interval. Otherwise, find the K-th largest number in this interval and add this number into array B.
    In fact Alice doesn't care each element in the array B. She only wants to know the M-th largest element in the array B. Please help her to fi nd this number.

    Input:

    The first line is the number of test cases. For each test case, the first line contains three positive numbers N(1≤N≤105);K(1≤K≤N);M.

    The second line contains N numbers (Ai(1≤Ai≤10^9)).

    It's guaranteed that M is not greater than the length of the array B.

    Output:

    For each test case, output a single line containing the M-th largest element in the array B.

    Example:

    Input

    2
    5 3 2
    2 3 1 5 4
    3 3 1
    5 8 2
    

    Output

    3
    2
    

    Solution:

    二分+尺取

    Code:

    #include <bits/stdc++.h>
    #define lowbit(x) (x&(-x))
    #define CSE(x,y) memset(x,y,sizeof(x))
    #define INF 0x3f3f3f3f
    #define Abs(x) (x>=0?x:(-x))
    #define FAST ios::sync_with_stdio(false);cin.tie(0);
    using namespace std;
    
    typedef long long ll;
    typedef pair<int, int> pii;
    typedef pair<ll, ll> pll;
    
    const int maxn = 111111;
    int a[maxn], n, k;
    ll m;
    
    ll chack(int x)
    {
    	ll ans = 0;
    	int l = 0, r = 0, ct = 0;
    	//尺取法
    	while (r < n) {
    		if (a[r] >= x) {
    			ct++;
    		}
    		if (ct >= k) {
    			ans += n - r;
    			while (a[l] < x) {
    				l++;
    				ans += n - r;
    			}
    			ct--; l++;
    		}
    		r++;
    	}
    	return ans;
    }
    
    int main()
    {
    	int t;
    	cin >> t;
    	while (t--) {
    		cin >> n >> k >> m;
    		for (int i = 0; i < n; i++) {
    			cin >> a[i];
    		}
    		int l = 1, r = 1e9+10, ans = -1;
    		while (l < r) {
    			int mid = (l + r) >> 1;
    			if (chack(mid) >= m) {
    				ans = mid;
    				l = mid + 1;
    			}
    			else
    				r = mid;
    		}
    		cout << ans << endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    一 :了解MVC
    使用EasyUI查询与删除
    了解认识asp.net运行机制
    asp.net 页面静态化
    easyUI 布局
    禁止网页另存为 右键,左键等
    使用canvas 代码画小猪佩奇
    使浏览器不可后退 的代码(兼容性特别高),监听用户是否在此页面浏览
    底部版权时间自动变化,网页在线qq咨询
    vue首页加载慢问题解决
  • 原文地址:https://www.cnblogs.com/LeafLove/p/13459143.html
Copyright © 2011-2022 走看看