全部评论 1

  • 你这个已经十分接近正解了。

    注意到答案满足单调性(越大的数排名越高),考虑二分答案。

    对于一个数 kk,我们只需要求出 AA 中在区间 [x,k][x,k] 内的数的数量 mm,则它的排名为 kxm+1k-x-m+1

    namespace cjdst{
        void solve(){
    		ll n, m;
    		std::cin >> n >> m;
    		std::vector <ll> a(n + 5);
    		for(int i = 1; i <= n; i++){
    			std::cin >> a[i];
    		}
    		std::sort(a.begin() + 1, a.begin() + n + 1);
    		while(m--){
    			int x, y;
    			std::cin >> x >> y;
    			ll l = x, r = 3e9;
    			while(l <= r){
    				ll mid = (l + r) >> 1;
    				ll idx = (upper_bound(a.begin() + 1, a.begin() + n + 1, mid) - a.begin()) - (lower_bound(a.begin() + 1, a.begin() + n + 1, x) - a.begin());
    				if(mid - idx - x + 1 < y) l = mid + 1;
    				else r = mid - 1;
    			}
    			std::cout << l << '\n';
    		}
    	}
    }
    

    时间复杂度 O(qlognlogV)O(q\log n\log V)

    2026-01-10 来自 广东

    0

热门讨论