| ||||||||||
| 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 | |||||||||
为何我会RE?????#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int n;
int read()
{
int ans=0; char ch=getchar();
while(ch>'9'||ch<'0') ch=getchar();
while(ch<='9'&&ch>='0')
{
ans=ans*10+ch-'0';
ch=getchar();
}
return ans;
}
struct tree
{
int l,r;
int s[2];
int sum;
int lazy;
tree* ch[2];
tree(){ch[0]=ch[1]=NULL; }
void push_up()
{
if(ch[0]!=NULL&&ch[1]!=NULL)
{
sum=max(ch[0]->sum,ch[1]->sum);
sum=max(sum,ch[0]->s[1]+ch[1]->s[0] );
for(int i=0;i<2;i++)
{
s[i]=ch[i]->s[i];
if(ch[i]->s[i^1]==ch[i]->s[i] ) s[i]+=ch[i^1]->s[i];
}
}
}
void push_down()
{
if(ch[0]!=NULL&&ch[1]!=NULL) ch[0]->lazy=ch[1]->lazy=lazy;
if(lazy==1)
{
sum=s[1]=s[0]=0;
if(ch[0]!=NULL&&ch[1]!=NULL)
for(int i=0;i<2;i++)
{
ch[i]->sum=ch[i]->s[0]=ch[i]->s[1]=0;
}
}
if(lazy==0)
{
int k=r-l+1;
sum=s[1]=s[0]=k;
if(ch[0]!=NULL&&ch[1]!=NULL)
for(int i=0;i<2;i++)
{
ch[i]->s[0]=ch[i]->sum=ch[i]->s[1]=ch[i]->r-ch[i]->l+1;
}
}
lazy=-1;
}
}*root;
typedef tree* node;
void build(node &o,int l,int r)
{
if(o==NULL) o=new tree();
o->l=l; o->r=r;
o->lazy=-1;
if(o->l==o->r)
{
o->sum=o->s[0]=o->s[1]=1;
return ;
}
int mid=(l+r)>>1;
build(o->ch[0],l,mid);
build(o->ch[1],mid+1,r);
o->push_up();
}
void update(node &o,int l,int r,int num)
{
if(o->lazy!=-1) o->push_down();
if(o->l==l&&o->r==r)
{
o->lazy=num;
o->push_down();
return;
}
int mid=(o->l+o->r)>>1;
if(mid>=r) update(o->ch[0],l,r,num);
else if(mid<l) update(o->ch[1],l,r,num);
else
{
update(o->ch[0],l,mid,num);
update(o->ch[1],mid+1,r,num);
}
o->push_up();
}
int query(node o,int k)
{
if(o->lazy!=-1) o->push_down();
int ans=0;
if(o->sum<k) return ans;
int mid=(o->l+o->r)>>1;
if(o->ch[0]->sum>=k)
{
ans=query(o->ch[0],k);
}
else if(o->ch[0]->s[1]!=0&&o->ch[0]->s[1]+o->ch[1]->s[0]>=k)
{
int id=mid-o->ch[0]->s[1]+1;
update(root,id,id+k-1,1);
ans=id;
}
else
{
ans=query(o->ch[1],k);
}
o->push_up();
return ans;
}
int main()
{
n=read();
root=NULL;
build(root,1,n);
int m=read();
for(int i=0;i<m;i++)
{
int ord=read();
if(ord==1)
{
int t=read();
cout<<query(root,t)<<endl;
}
else if(ord==2)
{
int t1=read(), t2=read();
update(root,t1,t1+t2-1,0);
}
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator