| ||||||||||
| 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 | |||||||||
用了懒操作的,但是我算了一下,计算次数不会上千万的!In Reply To:LZ大概是没用懒标记吧,或者是懒标记写退化了,这题时限很松的…… Posted by:xuhaoran510 at 2011-04-12 17:16:11
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<memory.h>
#include<math.h>
using namespace std;
const int N=65535;
struct A{int l,r,f;}t[10*N];
void build_tree(int ll,int rr,int num)
{
t[num].l=ll,t[num].r=rr,t[num].f=0;
if(ll==rr) return;
int mid=(ll+rr)/2;
build_tree(ll,mid,2*num);
build_tree(mid+1,rr,2*num+1);
}
void inset(int ll,int rr,int num,int tf)
{
if(t[num].f!=-1&&t[num].l<t[num].r)
t[2*num].f=t[2*num+1].f=t[num].f;
if(t[num].l==ll&&t[num].r==rr&&tf!=2)
{
t[num].f=tf;
return;
}
if(t[num].l==ll&&t[num].r==rr&&t[num].f!=-1&&tf==2)
{
t[num].f=(t[num].f==0)?1:0;
return;
}
int mid=(t[num].l+t[num].r)/2;
if(rr<=mid) inset(ll,rr,2*num,tf);
else if(ll>mid) inset(ll,rr,2*num+1,tf);
else
{
inset(ll,mid,2*num,tf);
inset(mid+1,rr,2*num+1,tf);
}
if(t[2*num].f==t[2*num+1].f)
t[num].f=t[2*num].f;
else t[num].f=-1;
}
int a[2*N+1];
void query(int num)
{
if(t[num].f!=-1)
{
int i;
for(i=t[num].l;i<=t[num].r;i++)
a[i]=t[num].f;
return;
}
query(2*num);
query(2*num+1);
}
int main()
{
// freopen("1.txt","r",stdin);
char x,tl,tr;
int sl,sr,i,j,k,cnt;
build_tree(0,2*N,1);
while(scanf("%c %c%d,%d%c%*c",&x,&tl,&sl,&sr,&tr)!=EOF)
{
if(tl=='[') sl=2*sl;
else sl=2*sl+1;
if(tr==']') sr=2*sr;
else sr=2*sr-1;
switch(x)
{
case 'U':if(sl<=sr) inset(sl,sr,1,1);break;
case 'I':if(sl>0) inset(0,sl-1,1,0); if(sr<2*N) inset(sr+1,2*N,1,0);break;
case 'D':if(sl<=sr) inset(sl,sr,1,0); break;
case 'C':if(sl>0) inset(0,sl-1,1,0); if(sr<2*N) inset(sr+1,2*N,1,0);if(sl<=sr) inset(sl,sr,1,2);break;
case 'S':if(sl<=sr) inset(sl,sr,1,2); break;
default:return 0;
}
}
memset(a,false,sizeof(a));
query(1);
cnt=0;
for(i=0;i<=2*N;i++)
{
while(a[i]==0&&i<=2*N)
{
i++;
}
j=i;
while(a[i]==1&&i<=2*N)
{
i++;
}
k=i-1;
if(i>2*N) break;
if(cnt) printf(" ");
cnt++;
if(j%2==0) printf("[%d",j/2);
else printf("(%d",j/2);
printf(",");
if(k%2==0) printf("%d]",k/2);
else printf("%d)",(k+1)/2);
}
if(cnt==0) printf("empty set");
printf("\n");
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator