【BZOJ3524】[Poi2014]Couriers【主席树】
2016-04-07 22:20
435 查看
【题目链接】
比较裸的主席树,注意下标不要手滑写错了。
/* Pigonometry */
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 500005, maxnode = 10000005;
int n, m;
int son[maxnode][2], sum[maxnode], segcnt, root[maxn];
inline int iread() {
int f = 1, x = 0; char ch = getchar();
for(; ch < '0' || ch > '9'; ch = getchar()) f = ch == '-' ? -1 : 1;
for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
return f * x;
}
inline void insert(int x, int &y, int l, int r, int c) {
y = ++segcnt;
sum[y] = sum[x] + 1;
if(l == r) return;
int mid = l + r >> 1;
son[y][0] = son[x][0]; son[y][1] = son[x][1];
if(c <= mid) insert(son[x][0], son[y][0], l, mid, c);
else insert(son[x][1], son[y][1], mid + 1, r, c);
}
inline int query(int x, int y, int k) {
int l = 1, r = n;
while(l < r) {
int mid = l + r >> 1;
if(sum[son[y][0]] - sum[son[x][0]] > k) x = son[x][0], y = son[y][0], r = mid;
else if(sum[son[y][1]] - sum[son[x][1]] > k) x = son[x][1], y = son[y][1], l = mid + 1;
else return 0;
}
return l;
}
int main() {
n = iread(); m = iread();
for(int i = 1; i <= n; i++) {
int x = iread();
insert(root[i - 1], root[i], 1, n, x);
}
while(m--) {
int l = iread(), r = iread();
printf("%d\n", query(root[l - 1], root[r], (r - l + 1) >> 1));
}
return 0;
}
比较裸的主席树,注意下标不要手滑写错了。
/* Pigonometry */
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 500005, maxnode = 10000005;
int n, m;
int son[maxnode][2], sum[maxnode], segcnt, root[maxn];
inline int iread() {
int f = 1, x = 0; char ch = getchar();
for(; ch < '0' || ch > '9'; ch = getchar()) f = ch == '-' ? -1 : 1;
for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
return f * x;
}
inline void insert(int x, int &y, int l, int r, int c) {
y = ++segcnt;
sum[y] = sum[x] + 1;
if(l == r) return;
int mid = l + r >> 1;
son[y][0] = son[x][0]; son[y][1] = son[x][1];
if(c <= mid) insert(son[x][0], son[y][0], l, mid, c);
else insert(son[x][1], son[y][1], mid + 1, r, c);
}
inline int query(int x, int y, int k) {
int l = 1, r = n;
while(l < r) {
int mid = l + r >> 1;
if(sum[son[y][0]] - sum[son[x][0]] > k) x = son[x][0], y = son[y][0], r = mid;
else if(sum[son[y][1]] - sum[son[x][1]] > k) x = son[x][1], y = son[y][1], l = mid + 1;
else return 0;
}
return l;
}
int main() {
n = iread(); m = iread();
for(int i = 1; i <= n; i++) {
int x = iread();
insert(root[i - 1], root[i], 1, n, x);
}
while(m--) {
int l = iread(), r = iread();
printf("%d\n", query(root[l - 1], root[r], (r - l + 1) >> 1));
}
return 0;
}
相关文章推荐
- [BZOJ2006][NOI2010][RMQ/主席树][二叉堆]超级钢琴
- BZOJ 2588 Count On a Tree 【LCA】【主席树】
- bzoj 2588 Spoj 10628. Count on a tree
- 主席树(可持久化线段树)入门专题
- BZOJ3209 花神的嘲讽计划I
- POJ 2104 K-th Number
- SPOJ COT 10628 Count on a tree
- ZOJ 2112 Dynamic Rankings
- HDU 4417 Super Mario
- HDU 4348 To the moon
- Codeforces 587C Duff in the Army
- bzoj-3123 森林
- poj 2104 K-th Number (主席树学习第一弹)
- hdu 4605 Magic Ball Game(主席树学习第二弹)
- hdu 4866 Shooting(主席树学习第三弹)
- hdu 3727 Jewel(主席树学习第四弹)
- 【Poi2014】【BZOJ3524】Couriers
- 【BZOJ4209】西瓜王
- 【ONTAK2010】【BZOJ3551】Peaks加强版
- 【IOI2014】【BZOJ4367】holiday假期