| ||||||||||
| 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 | |||||||||
把我的TLE代码贴出来吧。。。In Reply To:报告里面 whether membership is inverted in this interval 这句话该怎么理解呢?TLE无数次,请指教 Posted by:shiroi at 2007-05-15 23:13:21 #include<stdio.h>
#define maxn 65600
struct seg{
int ll,rr,cov;
seg(int l=0,int r=0,int ccov=-1) { ll=l,rr=r,cov=ccov;}
}segt[8*maxn];
seg ans[maxn];
int size=0;
void build(int l,int r,int ind)
{
segt[ind].ll=l; segt[ind].rr=r; segt[ind].cov=-1;
if(r-l>1) {
int mid=(l+r)/2;
build(l,mid,ind+ind);
build(mid,r,ind+ind+1);
}
}
void segunion(int l,int r,int ind)
{
if(segt[ind].cov!=1) {
if(l<=segt[ind].ll&&r>=segt[ind].rr) {
segt[ind].cov=1; return ;
}
if(segt[ind].rr-segt[ind].ll>1) {
if(segt[ind].cov==-1)
segt[ind].cov=0;
if(l<(segt[ind].ll+segt[ind].rr )/2) segunion(l,r,ind+ind);
if(r>(segt[ind].ll+segt[ind].rr )/2) segunion(l,r,ind+ind+1);
}
}
}
void segsub(int l,int r,int ind)
{
if(segt[ind].cov!=-1) {
if(l<=segt[ind].ll&&r>=segt[ind].rr) {
segt[ind].cov=-1; return ;
}
if(segt[ind].rr-segt[ind].ll>1) {
if(segt[ind].cov==1)
segt[ind+ind].cov=segt[ind+ind+1].cov=1;
if(l<(segt[ind].ll+segt[ind].rr)/2) segsub(l,r,ind+ind);
if(r>(segt[ind].ll+segt[ind].rr)/2) segsub(l,r,ind+ind+1);
if(segt[ind+ind].cov*segt[ind+ind+1].cov==1)
segt[ind].cov=segt[ind+ind].cov;
else segt[ind].cov=0;
}
}
}
void segxor(int l,int r,int ind)
{
if(segt[ind].cov!=0) {
if(l<=segt[ind].ll&&r>=segt[ind].rr) {
segt[ind].cov=-segt[ind].cov; return ;
}
if(segt[ind].rr-segt[ind].ll>1) {
segt[ind+ind].cov=segt[ind+ind+1].cov=segt[ind].cov; segt[ind].cov=0;
if(l<(segt[ind].ll+segt[ind].rr)/2) segxor(l,r,ind+ind);
if(r>(segt[ind].ll+segt[ind].rr)/2) segxor(l,r,ind+ind+1);
}
}
else {
if(l<=segt[ind].ll&&r>=segt[ind].rr&&segt[ind].rr-segt[ind].ll>1) {
if(l<(segt[ind].ll+segt[ind].rr)/2) segxor(l,r,ind+ind);
if(r>(segt[ind].ll+segt[ind].rr)/2) segxor(l,r,ind+ind+1);
return ;
}
else if(segt[ind].rr-segt[ind].ll>1) {
if(l<(segt[ind].ll+segt[ind].rr)/2) segxor(l,r,ind+ind);
if(r>(segt[ind].ll+segt[ind].rr)/2) segxor(l,r,ind+ind+1);
if(segt[ind+ind].cov*segt[ind+ind+1].cov==1)
segt[ind].cov=segt[ind+ind].cov;
else segt[ind].cov=0;
}
}
}
void stat(int ind)
{
if(segt[ind].cov==1) {
if(size==0) ans[size++]=seg(segt[ind].ll,segt[ind].rr);
else {
if(segt[ind].ll<=ans[size-1].rr)
ans[size-1].rr=segt[ind].rr;
else ans[size++]=seg(segt[ind].ll,segt[ind].rr);
}
return ;
}
else if(segt[ind].cov==-1) return ;
if(segt[ind].rr-segt[ind].ll>1) {
stat(ind+ind); stat(ind+ind+1);
}
}
int main()
{
char cmd,bra1,bra2,dot;
int a,b;
build(0,2*65535+1,1);
while(scanf("%c %c%d,%d%c\n",&cmd,&bra1,&a,&b,&bra2)==5) {
if(bra1=='[') a=a+a; else a=a+a+1;
if(bra2==']') b=b+b+1; else b=b+b;
if(cmd=='U'&&b>a)
segunion(a,b,1);
else if(cmd=='I'&&b>a) {
if(a>0)
segsub(0,a,1);
if(b<2*65535+1)
segsub(b,2*65535+1,1);
}
else if(cmd=='D'&&b>a)
segsub(a,b,1);
else if(cmd=='C'&&b>a) {
if(a>0)
segsub(0,a,1);
if(b<2*65535+1)
segsub(b,2*65535+1,1);
if(b>a)
segxor(a,b,1);
}
else if(cmd=='S'&&b>a)
segxor(a,b,1);
}
stat(1);
if(size==0) {
printf("empty set\n"); return 0;
}
for(a=0;a<size-1;a++) {
if(ans[a].ll%2==0) printf("[%d,",ans[a].ll/2);
else printf("(%d,",ans[a].ll/2);
if(ans[a].rr%2==0) printf("%d) ",ans[a].rr/2);
else printf("%d] ",ans[a].rr/2);
}
if(ans[a].ll%2==0) printf("[%d,",ans[a].ll/2);
else printf("(%d,",ans[a].ll/2);
if(ans[a].rr%2==0) printf("%d)\n",ans[a].rr/2);
else printf("%d]\n",ans[a].rr/2);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator