UOJ52【UR #4】元旦鐳射炮【互動】
阿新 • • 發佈:2021-06-12
這是一道互動題
互動庫有三個長為 \(n_a,n_b,n_c\) 的不降正整數序列 \(a,b,c\),不超過 \(100\) 次單點查詢求 \(k\)-th。
\(n_a,n_b,n_c\le 10^5\),\(a_i,b_i,c_i\le 10^9\)。
完全不會,牛逼壞了。
考慮歸併排序的過程,必定有至少一個序列扔掉了前 \(\lfloor\frac k3\rfloor\) 個元素,並且詢問 \(a,b,c\) 的第 \(\lfloor\frac k3\rfloor\) 個元素,求出最小值就可以找到對應序列,使得 \(k:=k-\lfloor\frac k3\rfloor\)。當 \(k\le 2\)
這個跟之前一道 300iq 題很像:\(a+b\ge k\) 可以拆成 \(\log k\) 次 \(a\ge\frac k2\lor b\ge\frac k2\),轉化為單點打標記。
#include"kth.h" #include<bits/stdc++.h> #define PB emplace_back using namespace std; namespace { int n[3], p[3]; int ask(int o, int x){ x += p[o]-1; if(x >= n[o]) return INT_MAX; switch(o){ case 0: return get_a(x); case 1: return get_b(x); } return get_c(x); }} int query_kth(int na, int nb, int nc, int k){ n[0] = na; n[1] = nb; n[2] = nc; while(k > 2){ int l = k/3, a[3] = {ask(0, l), ask(1, l), ask(2, l)}; if(a[0] < a[1] && a[0] < a[2]) p[0] += l; else if(a[1] < a[2]) p[1] += l; else p[2] += l; k -= l; } vector<int> tmp; for(int i = 0;i < 3;++ i) for(int j = 1;j < 3;++ j) tmp.PB(ask(i, j)); nth_element(tmp.begin(), tmp.begin()+k-1, tmp.end()); return tmp[k-1]; }