| ||||||||||
| 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 | |||||||||
AC codeSource Code
Problem: 3667 User: caizixian
Memory: 3296K Time: 594MS
Language: C++ Result: Accepted
* Source Code
#include <stdio.h>
#define Max(a, b) ((a)>(b)?(a):(b))
const int N = 50010;
struct ST {int i,j,m,l,r,c,lc,rc;} st[2*N]; //区????´å®½åº¦çš„2å€�
int up, n;
void bd(int d, int x, int y) {
st[d].i = x, st[d].j = y, st[d].m = (x+y)/2;
st[d].c = st[d].lc = st[d].rc = y-x;
if(x < y-1) {
st[d].l = ++up; bd(up, x, st[d].m);
st[d].r = ++up; bd(up, st[d].m, y);
}
}
void spread(int d) {
if(st[d].c == st[d].j-st[d].i) {
int& l = st[d].l, &r = st[d].r;
st[l].c = st[l].lc = st[l].rc = st[l].j-st[l].i;
st[r].c = st[r].lc = st[r].rc = st[r].j-st[r].i;
} else if(st[d].c == 0) {
int& l = st[d].l, &r = st[d].r;
st[l].c = st[l].lc = st[l].rc = 0;
st[r].c = st[r].lc = st[r].rc = 0;
}
}
void update(int d) {
st[d].c = Max(Max(st[st[d].l].c, st[st[d].r].c), st[st[d].l].rc + st[st[d].r].lc);
if(st[st[d].l].c == st[st[d].l].j-st[st[d].l].i) {
st[d].lc = st[st[d].l].c + st[st[d].r].lc;
} else st[d].lc = st[st[d].l].lc;
if(st[st[d].r].rc == st[st[d].r].j-st[st[d].r].i) {
st[d].rc = st[st[d].r].rc + st[st[d].l].rc;
} else st[d].rc = st[st[d].r].rc;
}
void Empty(int d, int x, int y) {
if(x <= st[d].i && y >= st[d].j) {
st[d].c = st[d].lc = st[d].rc = 0;
return;
}
spread(d);
if(x < st[d].m) Empty(st[d].l, x, y);
if(y > st[d].m) Empty(st[d].r, x, y);
update(d);
}
void Fill(int d, int x, int y) {
if(x <= st[d].i && y >= st[d].j) {
st[d].c = st[d].lc = st[d].rc = st[d].j-st[d].i;
return;
}
spread(d);
if(x < st[d].m) Fill(st[d].l, x, y);
if(y > st[d].m) Fill(st[d].r, x, y);
update(d);
}
int Get(int d, int l) {
spread(d);
if(st[d].c < l) return -1;
if(st[st[d].l].c >= l)
return Get(st[d].l, l);
else if(st[st[d].l].rc + st[st[d].r].lc >= l) {
return st[st[d].l].j-st[st[d].l].rc;
}
return Get(st[d].r, l);
}
int main()
{
int i, nq, cmd, x, l, y;
up = 0;
scanf("%d%d", &n, &nq);
bd(0, 0, n);
while(nq--) {
scanf("%d", &cmd);
if(cmd == 1) {
scanf("%d", &l);
x = Get(0, l);
if(x != -1)
Empty(0, x, x+l);
printf("%d\n", x+1);
} else {
scanf("%d%d", &x, &l);
Fill(0, x-1, x+l-1);
}
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator