| ||||||||||
| 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 <cstdio>
#include <iostream>
#include <algorithm>
#define lson i<<1
#define rson i<<1|1
#define M 50000+33
#define max(a,b,c) (a>b?a:b)>c?(a>b?a:b):c
using namespace std;
struct no {
int left;
int right;
int flag;
int ls;
int rs;
int maxs;
}tree[M<<2];
inline int num(int i){
return (tree[i].right-tree[i].left+1);
}
void build (int l,int r,int i){
tree[i].left=l;
tree[i].right=r;
tree[i].flag=0;
tree[i].rs=tree[i].ls=tree[i].maxs=num(i);
if(l==r) return ;
int mid=(l+r)>>1;
build (l,mid,lson);
build (mid+1,r,rson);
}
inline void pushup(int i){
if(tree[lson].ls==num(lson)&&tree[rson].ls==num(rson)){
tree[i].rs=tree[i].maxs=tree[i].ls=num(i);
}
else if(tree[lson].ls==num(lson)&&tree[rson].ls!=num(rson)){
tree[i].ls=tree[lson].ls+tree[rson].ls;
tree[i].maxs=max(tree[i].ls,tree[rson].maxs,-1);
tree[i].rs=tree[rson].rs;
}
else if(tree[lson].ls!=num(lson)&&tree[rson].ls==num(rson)){
tree[i].rs=tree[lson].rs+tree[rson].rs;
tree[i].maxs=max(tree[i].rs,tree[lson].maxs,-1);
tree[i].ls=tree[lson].ls;
}
else {
tree[i].rs=tree[rson].rs;
tree[i].ls=tree[lson].ls;
tree[i].maxs=max(tree[lson].maxs,tree[rson].maxs,tree[lson].rs+tree[rson].ls);
}
}
inline void pushdown(int i){
if(tree[i].maxs==0){
tree[lson].rs=tree[lson].maxs=tree[lson].ls=0;
tree[rson].rs=tree[rson].maxs=tree[rson].ls=0;
}
if(tree[i].maxs==num(i)){
tree[lson].rs=tree[lson].maxs=tree[lson].ls=num(lson);
tree[rson].rs=tree[rson].maxs=tree[rson].ls=num(rson);
}
}
void insert (int l,int r,int i,int val){
if(tree[i].left>=l&&tree[i].right<=r){
if(val==1){
tree[i].ls=tree[i].rs=tree[i].maxs=0;
}else {
tree[i].rs=tree[i].maxs=tree[i].ls=num(i);
}
return ;
}
pushdown(i);
int mid=(tree[i].left+tree[i].right)>>1;
if(r<=mid) insert(l,r,lson,val);
else if(l>mid)insert(l,r,rson,val);
else insert(l,mid,lson,val),
insert(mid+1,r,rson,val);
pushup(i);
}
int query(int root,int lenth)
{
if(tree[root].left == tree[root].right)
{
if(tree[root].ls == 1 && lenth == 1)
return tree[root].left;
return 0;
}
pushdown(root);
if(tree[root<<1].maxs >= lenth)
return query(root<<1,lenth);
if(tree[root<<1].rs + tree[root<<1|1].ls >= lenth)
return tree[root<<1].right - tree[root<<1].rs + 1;
if(tree[root<<1|1].maxs >= lenth)
return query(root<<1|1,lenth);
return 0;
}
int main(){
int n,m,c,a,b;;
while(~scanf("%d%d",&n,&m)){
build(1,n,1);
while(m--){
scanf("%d",&c);
if(c==1){
scanf("%d",&a);int g=query(1,a);
printf("%d\n",g);
if(g){
insert(g,g+a-1,1,1);
}
}else {
scanf("%d%d",&a,&b);
insert(a,b+a-1,1,0);
}
}
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator