您的位置:首页 > 理论基础 > 计算机网络

http://acm.hdu.edu.cn/showproblem.php?pid=1540 更新节点,询问节点所在的位置有多少连续的区间

2010-08-18 18:37 477 查看
]/*
*	这个题目跟hotel差不多的,可以说是一样的。好就没有用vector了,陌生了
*	更新节点,询问节点所在的位置有多少连续的区间
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <stack>
#define LL(x) ((x) << 1)
#define RR(x) ((x) << 1 | 1)
using namespace std;
const int N = 50005;
struct Seg_tree {
int l, r;
int r_size, size, l_size;
int mid() {
return (l + r) >> 1;
}
int dis() {
return (r - l + 1);
}
void doit(int st) {
if (st == 0) // 0表示修复
r_size = size = l_size = dis();
else
r_size = size = l_size = 0;
}
} tree[N * 4]; //现在觉得开4倍比较保险
vector<int> df;
inline void Build(int l, int r, int node) {
tree[node].l = l;
tree[node].r = r;
tree[node].l_size = tree[node].size = tree[node].r_size = tree[node].dis();
if (l == r) {
return;
}
int mid = (l + r) >> 1;
Build(l, mid, LL(node));
Build(mid + 1, r, RR(node));
}
inline void Update(int node, int dx, int st) {
if (tree[node].l == tree[node].r) {
tree[node].doit(st);
return;
}
int mid = tree[node].mid();
if (dx <= mid)
Update(LL(node), dx, st);
else
Update(RR(node), dx, st);
tree[node].size = max(tree[LL(node)].r_size + tree[RR(node)].l_size, max(
tree[LL(node)].size, tree[RR(node)].size));
tree[node].l_size = tree[LL(node)].l_size ;//+ tree[RR(node)].l_size; // 因为@那里的原因自己修改了这个错误,但是一直不对
tree[node].r_size = tree[RR(node)].r_size ;//+ tree[LL(node)].r_size; // 手调的时候才会才发现,没有进入R的那句语句,太菜了
if (tree[LL(node)].size == tree[LL(node)].dis()) {
tree[node].l_size += tree[RR(node)].l_size;
}
if (tree[RR(node)].size == tree[RR(node)].dis()) {
tree[node].r_size += tree[LL(node)].r_size;
}if (dx <= mid) {
if (dx > tree[LL(node)].r - tree[LL(node)].r_size) {
return Query(LL(node), dx) + Query(RR(node), tree[RR(node)].l);
} else {
return Query(LL(node), dx);
}
} else {
if (dx < tree[RR(node)].l + tree[RR(node)].l_size) {
return Query(RR(node), dx) + Query(LL(node), tree[LL(node)].r);
} else {
return Query(RR(node), dx);
}
}
}
inline int Query(int node, int dx) {
if (tree[node].l == tree[node].r || tree[node].size == 0 || tree[node].size
== tree[node].dis()) {
return tree[node].size;
}
int mid = tree[node].mid();
if (dx <= mid) {
if (dx > tree[LL(node)].r - tree[LL(node)].r_size) {
return Query(LL(node), dx) + Query(RR(node), tree[RR(node)].l);
} else {
return Query(LL(node), dx);
}
} else {if (dx <= mid) {
if (dx > tree[LL(node)].r - tree[LL(node)].r_size) {
return Query(LL(node), dx) + Query(RR(node), tree[RR(node)].l);
} else {
return Query(LL(node), dx);
}
} else {
if (dx < tree[RR(node)].l + tree[RR(node)].l_size) {
return Query(RR(node), dx) + Query(LL(node), tree[LL(node)].r);
} else {
return Query(RR(node), dx);
}
}
if (dx < tree[RR(node)].l + tree[RR(node)].l_size) {
return Query(RR(node), dx) + Query(LL(node), tree[LL(node)].r);
} else {
return Query(RR(node), dx);
}
}
}
int main() {
int n, m;
while (scanf("%d %d", &n, &m) != EOF) {
Build(1, n, 1);
char str[2];
int a;
df.clear();
while (m--) {
scanf("%s", str);
if (str[0] == 'D') {
scanf("%d", &a);
df.push_back(a);
Update(1, a, 1);
} else if (str[0] == 'R') {
//if (df.empty()) // @这句话不加也是AC的, 搞了半天原来就是这里弄错了,vector为空的时候返回的真的
//continue;
int b = df.back();
df.pop_back();
Update(1, b, 0);
} else {
scanf("%d", &a);
int ans = Query(1, a);
printf("%d/n", ans);
}
}
}
return 0;
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tree query build vector struct