| ||||||||||
| 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 | |||||||||
能给点测试数据吗?俺一直wa#include <cstdio>
// poj 1823
enum {ARRIVE = 1, LEAVE = 2, REPORT = 3};
struct node_t {
int max_empty, left_empty, right_empty;
};
const int N = 16001;
node_t tr[N * 16];
#define LSON(k) (k * 2)
#define RSON(k) (k * 2 + 1)
#define MAX(x, y) (x > y ? x : y)
void build(int nd, int l, int r)
{
tr[nd].max_empty = tr[nd].left_empty =
tr[nd].right_empty = r - l + 1;
if (l == r)
return;
int m = (l + r) / 2;
build(LSON(nd), l, m);
build(RSON(nd), m + 1, r);
}
void collect(int nd, int l, int r)
{
int lson = LSON(nd);
int rson = RSON(nd);
int m = (l + r) / 2;
int union_max_empty = tr[lson].right_empty +
tr[rson].left_empty;
tr[nd].max_empty = MAX(union_max_empty,
MAX(tr[lson].max_empty,
tr[rson].max_empty));
tr[nd].left_empty = tr[lson].left_empty;
tr[nd].right_empty = tr[rson].right_empty;
if (tr[lson].left_empty == m - l + 1)
tr[nd].left_empty += tr[rson].left_empty;
if (tr[rson].right_empty == r - m)
tr[nd].right_empty += tr[lson].right_empty;
}
void insert(int nd, int l, int r, int lo, int ro)
{
if (lo <= l && ro >= r) {
tr[nd].max_empty = tr[nd].left_empty =
tr[nd].right_empty = 0;
return;
}
if (l == r)
return;
int m = (l + r) / 2;
if (lo <= m)
insert(LSON(nd), l, m, lo, ro);
if (ro > m)
insert(RSON(nd), m + 1, r, lo, ro);
collect(nd, l, r);
}
void remove(int nd, int l, int r, int lo, int ro)
{
if (lo <= l && ro >= r) {
tr[nd].max_empty = tr[nd].left_empty =
tr[nd].right_empty = r - l + 1;
return;
}
if (l == r)
return;
if (tr[nd].max_empty == 0) {
tr[LSON(nd)].max_empty = tr[LSON(nd)].left_empty =
tr[LSON(nd)].right_empty = 0;
tr[RSON(nd)].max_empty = tr[RSON(nd)].left_empty =
tr[RSON(nd)].right_empty = 0;
}
int m = (r + l) / 2;
if (lo <= m)
remove(LSON(nd), l, m, lo, ro);
if (ro > m)
remove(RSON(nd), m + 1, r, lo, ro);
collect(nd, l, r);
}
int main()
{
int n, p;
scanf("%d%d", &n, &p);
build(1, 1, n);
for (int i = 1; i <= p; ++i) {
int type, x, y;
scanf("%d", &type);
switch (type) {
case ARRIVE:
scanf("%d%d", &x, &y);
insert(1, 1, n, x, x + y - 1);
break;
case LEAVE:
scanf("%d%d", &x, &y);
remove(1, 1, n, x, x + y - 1);
break;
case REPORT:
printf("%d\n", tr[1].max_empty);
break;
}
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator