Just h-index
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total Submission(s): 69 Accepted Submission(s): 39
Problem Description
The
h-index of an author is the largest
h where he has at least
h papers with citations not less than
h.
Bobo has published n papers with citations a1,a2,…,an respectively.
One day, he raises q questions. The i-th question is described by two integers li and ri, asking the h-index of Bobo if has *only* published papers with citations ali,ali+1,…,ari.
Bobo has published n papers with citations a1,a2,…,an respectively.
One day, he raises q questions. The i-th question is described by two integers li and ri, asking the h-index of Bobo if has *only* published papers with citations ali,ali+1,…,ari.
Input
The input consists of several test cases and is terminated by end-of-file.
The first line of each test case contains two integers n and q.
The second line contains n integers a1,a2,…,an.
The i-th of last q lines contains two integers li and ri.
The first line of each test case contains two integers n and q.
The second line contains n integers a1,a2,…,an.
The i-th of last q lines contains two integers li and ri.
Output
For each question, print an integer which denotes the answer.
## Constraint
* 1≤n,q≤105
* 1≤ai≤n
* 1≤li≤ri≤n
* The sum of n does not exceed 250,000.
* The sum of q does not exceed 250,000.
## Constraint
* 1≤n,q≤105
* 1≤ai≤n
* 1≤li≤ri≤n
* The sum of n does not exceed 250,000.
* The sum of q does not exceed 250,000.
Sample Input
5 3 1 5 3 2 1 1 3 2 4 1 5 5 1 1 2 3 4 5 1 5
Sample Output
2 2 2 3
Source
题意:如果区间内有h个大于等于h的paper,则是h-index,现在问你区间内最大的h是多少
题解:赛场上很自然的想到区间第k大问题,然后发现是主席树模板题十分开心,结果没带板子想死。。。
二分枚举k,如果区间第k大的值大于等于k,则更新答案!
AC代码
#include <iostream> #include <stdio.h> #include <cmath> #include <algorithm> #define lson l, m #define rson m + 1, r using namespace std; const int maxn = 1e5 + 10; int L[maxn << 5], R[maxn << 5], sum[maxn << 5]; int tot, a[maxn], T[maxn], ha[maxn]; int bulid(int l, int r){ int rt = (++tot); if(l < r){ int m = (l + r) >> 1; L[rt] = bulid(lson); R[rt] = bulid(rson); } return rt; } int update(int pre, int l, int r, int x){ int rt = (++tot); L[rt] = L[pre], R[rt] = R[pre], sum[rt] = sum[pre] + 1; if(l < r){ int m = (l + r) >> 1; if(x <= m) L[rt] = update(L[pre], lson, x); else R[rt] = update(R[pre], rson, x); } return rt; } int query(int u, int v, int l, int r, int k){ if(l >= r) return l; int m = (l + r) >> 1, num = sum[L[v]] - sum[L[u]]; if(num >= k) return query(L[u], L[v], lson, k); else return query(R[u], R[v], rson, k - num); } int main(){ // freopen("in.txt", "r", stdin); int n, m; while(scanf("%d %d", &n, &m) != EOF){ tot = 0; for(int i = 1; i <= n; i++){ scanf("%d", &a[i]); ha[i] = a[i]; } sort(ha + 1, ha + 1 + n); int d = unique(ha + 1, ha + 1 + n) - ha - 1; T[0] = bulid(1, d); for(int i = 1; i <= n; i++){ int x = lower_bound(ha + 1, ha + 1 + d, a[i]) - ha; T[i] = update(T[i - 1], 1, d, x); } while(m--){ int x1, y1, l, r, ans = 1; scanf("%d %d", &x1, &y1); l = 1, r = y1 - x1 + 1; while(l <= r){ int m = (l + r) >> 1; // if(x1 == 1 && y1 == 5) // printf("%d %d\n", ha[query(T[x1 - 1], T[y1], 1, d, y1 - x1 + 2 - m)], m); if(ha[query(T[x1 - 1], T[y1], 1, d, y1 - x1 + 2 - m)] >= m){ l = m + 1; ans = max(ans, m); } else r = m - 1; } printf("%d\n", ans); } } return 0; }