| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
注意二分的时候的边界就好我用归并树写的, 代码:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
const int maxn = 100000 + 50;
const int depth = 25;
int merge_tree[depth][maxn];
int num[maxn];
int N, M;
void build_tree(int deep, int lp, int rp) {
if (lp == rp) {
merge_tree[deep][lp] = num[lp];
return;
}
int mid = (lp + rp) >> 1;
build_tree(deep + 1, lp, mid);
build_tree(deep + 1, mid + 1, rp);
int i = lp, j = mid + 1, ind = lp;
while (i <= mid || j <= rp) {
if (i > mid || (j <= rp && merge_tree[deep + 1][i] > merge_tree[deep + 1][j]))
merge_tree[deep][ind++] = merge_tree[deep + 1][j++];
else
merge_tree[deep][ind++] = merge_tree[deep + 1][i++];
}
}
int query(int layer, int lp, int rp, int q_lp, int q_rp, int val) {
if (lp > q_rp || rp < q_lp)
return 0;
if (q_lp <= lp && rp <= q_rp)
return lower_bound(merge_tree[layer] + lp, merge_tree[layer] + rp + 1, val) - (merge_tree[layer] + lp);
int mid = (lp + rp) >> 1;
return query(layer + 1, lp, mid, q_lp, q_rp, val) + query(layer + 1, mid + 1, rp, q_lp, q_rp, val);
}
int main()
{
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
scanf("%d%d", &N, &M);
for (int i = 0; i < N; i++)
scanf("%d", &num[i]);
build_tree(0, 0, N - 1);
for (int i = 0; i < M; i++) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
a--; b--; c--;
int lp = 0, rp = N;
while (lp < rp) {
int mid = (lp + rp) >> 1;
int val = merge_tree[0][mid];
int cnt = query(0, 0, N - 1, a, b, val);
if (cnt <= c)
lp = mid + 1;
else
rp = mid;
}
printf("%d\n", merge_tree[0][rp - 1]);
}//for int i
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator