題意:定義乙個區間的值為其眾數出現的次數。現給出n個數,求將所有區間的值排序後,第k大的值為多少。
思路:答案具有單調性,所以可以二分,關鍵是check的時候怎麼統計有多少區間滿足》=mid, 我們可以知道假如區間[l, r]滿足,那麼左右擴大這個區間都是滿足的,所以可以尺取,列舉右端點,找到最大的符合條件的l即可,對答案貢獻為l,而且l也只會向右動。右端點向右移動一步,有兩種情況,一種情況是l不變,另一種是a[r]能與l右邊的乙個點滿足區間出現mid次a[r],這樣l就可以跳到這個點。 所以預處理出b[i],表示每個點往前出現第mid個a[i]的位置。
**:
#includeusing namespace std;
typedef long long ll;
const int maxn = 1e5+5;
int a[maxn], hash[maxn];
int num[maxn], pos[maxn], pre[maxn], nxt[maxn], b[maxn];
ll n, k;
ll judge(int x)
memset(pos, 0, sizeof(pos));
for(int i = n; i >= 1; i--)
memset(pos, 0, sizeof(pos));
memset(num, 0, sizeof(num));
memset(b, 0, sizeof(b));
for(int i = 1; i <= n; i++)
for(int l = 0, r = 1; r <= n; r++)
l = max(l, b[r]), cnt += l;
return cnt;
}int main(void)
printf("%d\n", ans);
}return 0;
}
51Nod 1686 第K大區間
題意 中文題,定義乙個區間的值為其眾數出現的次數。現給出n個數,求將所有區間的值排序後,第k大的值為多少。離散化二分答案加尺取判斷 include include includeusing namespace std const int maxn 100006 typedef long long l...
51nod 1686 第K大區間
1686 第k大區間 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 定義乙個區間的值為其眾數出現的次數。現給出n個數,求將所有區間的值排序後,第k大的值為多少。input 第一行兩個數n和k 1 n 100000,k n n 1 2 第二行n個數,0 每個數 2...
51 nod1686 第K大區間
定義乙個區間的值為其眾數出現的次數。現給出n個數,求將所有區間的值排序後,第k大的值為多少。很簡單的乙個題啊。然後我想了很久,是不是藥丸了啊。才四級題就差點想不出來了 明顯地二分乙個答案mid啊 主要是一開始思路死在乙個地方了,在考慮判斷是否合法 但其實我們並不需要在意我們找到這個數是不是眾數 因為...