POJ 2104 K-th Number 不高效的线段树写法
2014-04-07 22:42
211 查看
区间k大数问题
const int Max_N = 100008 ; int A[Max_N] ; vector<int> data[Max_N<<2] ; void make_tree(int L , int R , int root){ if(L == R){ data[root].clear() ; data[root].push_back(A[L]) ; return ; } int mid = (L + R) >> 1 ; make_tree(L , mid , root<<1) ; make_tree(mid+1 , R ,root<<1|1) ; data[root].resize(R-L+1) ; merge(data[root<<1].begin() , data[root<<1].end() , data[root<<1|1].begin() , data[root<<1|1].end() , data[root].begin()) ; } int query(int l , int r , int x , int L , int R , int root){ if(r < L || l > R) return 0 ; if(l <= L && R <= r) return upper_bound(data[root].begin() , data[root].end() , x) - data[root].begin() ; int mid = (L + R) >> 1 ; return query(l , r , x , L , mid , root<<1) + query(l , r , x , mid+1 , R , root<<1|1) ; } int main(){ int T , N , i , M , l , r , k , L , R , mid , ans ; cin>>N>>M; for(i = 1 ; i <= N ; i++) scanf("%d" ,&A[i]) ; make_tree(1 , N , 1) ; sort(A+1 , A+1+N) ; while(M--){ scanf("%d%d%d" ,&l ,&r ,&k) ; L = 1 ; R = N ; while(L <= R){ mid = (L + R) >> 1 ; if(query(l , r , A[mid] , 1 , N , 1) >= k){ R = mid - 1 ; ans = A[mid] ; } else L = mid + 1 ; } printf("%d\n" ,ans) ; } return 0 ; }
相关文章推荐
- POJ 2104 K-th Number 主席树
- POJ 2104 K-th Number (可持久化线段树)
- poj 2104 K-th Number
- [POJ 2104]K-th Number
- (平方分割)POJ 2104 K-th Number
- POJ 2104 K-th Number(区间第k大数)(平方切割,归并树,划分树)
- POJ2104 K-th Number (主席树)
- POJ-2104-K-th Number
- 【POJ 2104】K-th Number 【主席树入门题】
- poj2104 K-th Number
- POJ 2104 K-th Number
- 【POJ 2104】 K-th Number 主席树模板题
- poj 2104 K-th Number (主席树)
- poj 2104 K-th Number
- POJ 2104 K-th Number 线段树
- poj 2104 K-th number (模板级划分树)
- 【poj 2104】K-th Number(整体二分+树状数组)
- POJ 2104:K-th Number (划分树)
- poj 2104 K-th Number(线段树)
- poj 2104 K-th Number