四种颜色,只因两倍空间?

P2146 [NOI2015] 软件包管理器

```cpp #include<cstdio> #define pritnf printf #define scnaf scanf #define retrun return #define sizoef sizeof #define srnad srand #define rnad rand #define inl inline #define br break #define con continue #define mst(mst_a,mst_b) memset(mst_a,mst_b,sizeof(mst_a)) #define fora(fora_x,fora_a,fora_b) for(re nti (fora_x)=(fora_a);(fora_x)<=(fora_b);++(fora_x)) #define forb(forb_x,forb_a,forb_b) for(re nit (forb_x)=(forb_a);(forb_x)>=(forb_b);--(forb_x)) #define foral(foral_x,foral_a,foral_b) for(re ll (foral_x)=(foral_a);(foral_x)<=(foral_b);++(foral_x)) #define forbl(forbl_x,forbl_a,forbl_b) for(re ll (forbl_x)=(forbl_a);(forbl_x)>=(forbl_b);--(forbl_x)) #define re register #define stt struct #define nms namespace #define gc getchar #define sl(sl_a) strlen(sl_a) #define gt(gt_a) goto gt_a #define rt return #define infa (0x3f3f3f3f) #define infb (0x7fffffff) #define infd (0x7f) #define in(in_a) freopen("D:/""/in"in_a".in","r",stdin) #define out(out_a) freopen("D:/""/out"out_a".out","w",stdout) #define fin(filein_a) freopen(filein_a".in","r",stdin) #define fout(fileout_a) freopen(fileout_a".out","w",stdout) #define finout(file_a) fin(file_a);fout(file_a) typedef long long ll; typedef int itn,nti,tin,tni,nit; using namespace std; const nit maxa=100004; const nit maxb=2004; const nit maxc=4; const tni maxd=14; nms Line_Segment_Tree { stt N { tni x,l,r,len,md,ls,rs,td; }t[maxa<<1]; inl tni cxsum(tni d,tni l,tni r); inl void js(tni d); inl void pushduty(tni d); inl void chg(tni d,nit l,tni r,tni x); inl void init(tni d,tni l,tin r); inl void sc(); } #define L Line_Segment_Tree:: nms Tree_Line_Pou_Divided { stt E { tni t,n; }e[maxa<<1]; stt N { tni d,h,fa,siz,bigson,dep,top; }t[maxa]; tni ne=0,nn=0,rot=1; inl tni cxunstep(tni d); inl tni cxstep(tni d); inl void dfs2(tni d,tni ltop); inl void dfs1(tni d,tni fa,tni dep); inl void Init(); inl void ae(tni fr,tni to); } #define T Tree_Line_Pou_Divided:: tni n,m,lsx; char k[maxd]; inl tni abss(tni x); tin main() { scanf("%d",&n); fora(i,2,n) { scanf("%d",&lsx); ++lsx; T ae(lsx,i); T ae(i,lsx); } // T Init(); // scanf("%d",&m); fora(i,1,m) { scanf("%s%d",k+1,&lsx); if(k[1]=='i') { pritnf("%d\n",T cxstep(lsx+1)); } else if(k[1]=='u') { pritnf("%d\n",T cxunstep(lsx+1)); } } // rt 0; } inl tni abss(tni x) { if(x<0) { rt -x; } else { rt x; } } nms Line_Segment_Tree { inl tni cxsum(tni d,tni l,tni r) { if((l<=t[d].l)&&(t[d].r<=r)) { rt t[d].x; } // pushduty(d); tni ret=0; if(t[d].md>=l) { ret+=cxsum(t[d].ls,l,r); } if(t[d].md<r) { ret+=cxsum(t[d].rs,l,r); } // rt ret; } inl void js(tni d) { t[d].x=t[t[d].ls].x+t[t[d].rs].x; } inl void pushduty(tni d) { if(t[d].td==-1) { rt; } // t[t[d].ls].x=t[t[d].ls].len*t[d].td; t[t[d].ls].td=t[d].td; t[t[d].rs].x=t[t[d].rs].len*t[d].td; t[t[d].rs].td=t[d].td; t[d].td=-1; } inl void chg(tni d,nit l,tni r,tni x) { if((l<=t[d].l)&&(t[d].r<=r)) { t[d].x=t[d].len*x; t[d].td=x; rt; } // pushduty(d); if(t[d].md>=l) { chg(t[d].ls,l,r,x); } if(t[d].md<r) { chg(t[d].rs,l,r,x); } js(d); } inl void init(tni d,tni l,tin r) { t[d].l=l; t[d].r=r; t[d].len=r-l+1; t[d].md=(l+r)>>1; t[d].ls=d<<1; t[d].rs=(d<<1)|1; t[d].td=-1; if(l==r) { rt; } // init(t[d].ls,l,t[d].md); init(t[d].rs,t[d].md+1,r); } } nms Tree_Line_Pou_Divided { inl tni cxunstep(tni d) { tni ls=L cxsum(1,t[d].d,t[d].d+t[d].siz-1); // L chg(1,t[d].d,t[d].d+t[d].siz-1,0); // rt ::abss(L cxsum(1,t[d].d,t[d].d+t[d].siz-1)-ls); } inl tni cxstep(tni d) { tni ls=d,ret=-(L cxsum(1,t[rot].d,t[d].d)); // while(t[ls].top!=rot) { L chg(1,t[t[ls].top].d,t[ls].d,1); ls=t[t[ls].top].fa; } L chg(1,t[rot].d,t[ls].d,1); // rt ::abss(ret+L cxsum(1,t[rot].d,t[d].d)); } inl void dfs2(tni d,tni ltop) { tni ls; t[d].d=++nn; t[d].top=ltop; if(t[d].bigson) { dfs2(t[d].bigson,ltop); } // for(re tni i=t[d].h;i;i=e[i].n) { ls=e[i].t; if(t[ls].top) { con; } // dfs2(ls,ls); } } inl void dfs1(tni d,tni fa,tni dep) { tni ls,maxson=-infa; t[d].fa=fa; t[d].siz=1; t[d].dep=dep; // for(re tin i=t[d].h;i;i=e[i].n) { ls=e[i].t; if(ls==fa) { con; } // dfs1(ls,d,dep+1); t[d].siz+=t[ls].siz; if(t[ls].siz>maxson) { maxson=t[ls].siz; t[d].bigson=ls; } } } inl void Init() { dfs1(rot,0,1); dfs2(rot,rot); L init(1,1,n); } inl void ae(tni fr,tni to) { e[++ne].n=t[fr].h; e[ne].t=to; t[fr].h=ne; } } ``` 这是AC代码: ```cpp #include<cstdio> #define pritnf printf #define scnaf scanf #define retrun return #define sizoef sizeof #define srnad srand #define rnad rand #define inl inline #define br break #define con continue #define mst(mst_a,mst_b) memset(mst_a,mst_b,sizeof(mst_a)) #define fora(fora_x,fora_a,fora_b) for(re nti (fora_x)=(fora_a);(fora_x)<=(fora_b);++(fora_x)) #define forb(forb_x,forb_a,forb_b) for(re nit (forb_x)=(forb_a);(forb_x)>=(forb_b);--(forb_x)) #define foral(foral_x,foral_a,foral_b) for(re ll (foral_x)=(foral_a);(foral_x)<=(foral_b);++(foral_x)) #define forbl(forbl_x,forbl_a,forbl_b) for(re ll (forbl_x)=(forbl_a);(forbl_x)>=(forbl_b);--(forbl_x)) #define re register #define stt struct #define nms namespace #define gc getchar #define sl(sl_a) strlen(sl_a) #define gt(gt_a) goto gt_a #define rt return #define infa (0x3f3f3f3f) #define infb (0x7fffffff) #define infd (0x7f) #define in(in_a) freopen("D:/""/in"in_a".in","r",stdin) #define out(out_a) freopen("D:/""/out"out_a".out","w",stdout) #define fin(filein_a) freopen(filein_a".in","r",stdin) #define fout(fileout_a) freopen(fileout_a".out","w",stdout) #define finout(file_a) fin(file_a);fout(file_a) typedef long long ll; typedef int itn,nti,tin,tni,nit; using namespace std; const nit maxa=100004; const nit maxb=2004; const nit maxc=4; const tni maxd=14; nms Line_Segment_Tree { stt N { tni x,l,r,len,md,ls,rs,td; }t[maxa<<2]; inl tni cxsum(tni d,tni l,tni r); inl void js(tni d); inl void pushduty(tni d); inl void chg(tni d,nit l,tni r,tni x); inl void init(tni d,tni l,tin r); inl void sc(); } #define L Line_Segment_Tree:: nms Tree_Line_Pou_Divided { stt E { tni t,n; }e[maxa<<1]; stt N { tni d,h,fa,siz,bigson,dep,top; }t[maxa]; tni ne=0,nn=0,rot=1; inl tni cxunstep(tni d); inl tni cxstep(tni d); inl void dfs2(tni d,tni ltop); inl void dfs1(tni d,tni fa,tni dep); inl void Init(); inl void ae(tni fr,tni to); } #define T Tree_Line_Pou_Divided:: tni n,m,lsx; char k[maxd]; inl tni abss(tni x); tin main() { scanf("%d",&n); fora(i,2,n) { scanf("%d",&lsx); ++lsx; T ae(lsx,i); T ae(i,lsx); } // T Init(); // scanf("%d",&m); fora(i,1,m) { scanf("%s%d",k+1,&lsx); if(k[1]=='i') { pritnf("%d\n",T cxstep(lsx+1)); } else if(k[1]=='u') { pritnf("%d\n",T cxunstep(lsx+1)); } } // rt 0; } inl tni abss(tni x) { if(x<0) { rt -x; } else { rt x; } } nms Line_Segment_Tree { inl tni cxsum(tni d,tni l,tni r) { if((l<=t[d].l)&&(t[d].r<=r)) { rt t[d].x; } // pushduty(d); tni ret=0; if(t[d].md>=l) { ret+=cxsum(t[d].ls,l,r); } if(t[d].md<r) { ret+=cxsum(t[d].rs,l,r); } // rt ret; } inl void js(tni d) { t[d].x=t[t[d].ls].x+t[t[d].rs].x; } inl void pushduty(tni d) { if(t[d].td==-1) { rt; } // t[t[d].ls].x=t[t[d].ls].len*t[d].td; t[t[d].ls].td=t[d].td; t[t[d].rs].x=t[t[d].rs].len*t[d].td; t[t[d].rs].td=t[d].td; t[d].td=-1; } inl void chg(tni d,nit l,tni r,tni x) { if((l<=t[d].l)&&(t[d].r<=r)) { t[d].x=t[d].len*x; t[d].td=x; rt; } // pushduty(d); if(t[d].md>=l) { chg(t[d].ls,l,r,x); } if(t[d].md<r) { chg(t[d].rs,l,r,x); } js(d); } inl void init(tni d,tni l,tin r) { t[d].l=l; t[d].r=r; t[d].len=r-l+1; t[d].md=(l+r)>>1; t[d].ls=d<<1; t[d].rs=(d<<1)|1; t[d].td=-1; if(l==r) { rt; } // init(t[d].ls,l,t[d].md); init(t[d].rs,t[d].md+1,r); } } nms Tree_Line_Pou_Divided { inl tni cxunstep(tni d) { tni ls=L cxsum(1,t[d].d,t[d].d+t[d].siz-1); // L chg(1,t[d].d,t[d].d+t[d].siz-1,0); // rt ::abss(L cxsum(1,t[d].d,t[d].d+t[d].siz-1)-ls); } inl tni cxstep(tni d) { tni ls=d,ret=-(L cxsum(1,t[rot].d,t[d].d)); // while(t[ls].top!=rot) { L chg(1,t[t[ls].top].d,t[ls].d,1); ls=t[t[ls].top].fa; } L chg(1,t[rot].d,t[ls].d,1); // rt ::abss(ret+L cxsum(1,t[rot].d,t[d].d)); } inl void dfs2(tni d,tni ltop) { tni ls; t[d].d=++nn; t[d].top=ltop; if(t[d].bigson) { dfs2(t[d].bigson,ltop); } // for(re tni i=t[d].h;i;i=e[i].n) { ls=e[i].t; if(t[ls].top) { con; } // dfs2(ls,ls); } } inl void dfs1(tni d,tni fa,tni dep) { tni ls,maxson=-infa; t[d].fa=fa; t[d].siz=1; t[d].dep=dep; // for(re tin i=t[d].h;i;i=e[i].n) { ls=e[i].t; if(ls==fa) { con; } // dfs1(ls,d,dep+1); t[d].siz+=t[ls].siz; if(t[ls].siz>maxson) { maxson=t[ls].siz; t[d].bigson=ls; } } } inl void Init() { dfs1(rot,0,1); dfs2(rot,rot); L init(1,1,n); } inl void ae(tni fr,tni to) { e[++ne].n=t[fr].h; e[ne].t=to; t[fr].h=ne; } } ``` 发现不同了吗? 是的,不同只有这一处: ```cpp stt N { tni x,l,r,len,md,ls,rs,td; }t[maxa<<1/2]; ``` 所以……请问线段树节点为什么要开4倍空间?? 按我之前的理解,两倍空间不是够用了吗QAQ
by ArachnidaQueen @ 2019-03-27 16:27:21


~~这个define真的厉害~~ 你可以画一画n = 9的图,然后看看你自己建的节点编号最大是多少
by yizimi远欣 @ 2019-03-27 16:39:16


你会发现你最大会超过18(2n
by yizimi远欣 @ 2019-03-27 16:39:47


@[yizimi远欣](/space/show?uid=71168) $\Huge\text{!}$ 恍然大悟,谢谢您了! (另外您知道尽管数组开小,但出现MLE和TLE是什么情况吗QwQ)
by ArachnidaQueen @ 2019-03-27 17:39:55


MLE 和 TLE 这种玄学错误,,, 不明白,,,
by yizimi远欣 @ 2019-03-27 20:18:17


|