找不同

P3178 [HAOI2015] 树上操作

这是50pts代码: ```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 filein(filein_a) freopen(filein_a".in","r",stdin) #define fileout(fileout_a) freopen(fileout_a".out","w",stdout) #define file(file_a) filein(file_a);fileout(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=10004; nms Line_Segment_Tree { stt N { ll x,td; nit l,r,mid,len; }t[maxa<<2]; inl ll cx(tni d,tni l,tni r); inl void ad(tni d,tni l,tni r,tni x); inl void pushduty(tni d); inl void js(tni d); inl void init(tni d,tni l,tni r); } #define L Line_Segment_Tree:: nms Tree_Line_Pou_Divided { stt E { tin t,n; }e[maxa<<1]; stt N { tni d,h,fa,siz,bigson,top; }tre[maxa]; tni ne=0,rot=1,nn=0; inl ll cxpath(tni d); inl void adtree(tni d,tni x); inl void adnode(tni d,tni x); inl void dfs2(tni d,tni ltop); inl void dfs1(tni d,tni fa); inl void Init(); inl void ae(tni f,nit t); } #define T Tree_Line_Pou_Divided:: ll x[maxa]={0},hash[maxa]={0}; tni n,m,o,k,lsx,lsy; tni main() { scanf("%d%d",&n,&o); m=n-1; fora(i,1,n) { scanf("%lld",&x[i]); } fora(i,1,m) { scanf("%d%d",&lsx,&lsy); T ae(lsx,lsy); T ae(lsy,lsx); } // T Init(); // fora(i,1,o) { scanf("%d",&k); if(k==1) { scanf("%d%d",&lsx,&lsy); T adnode(lsx,lsy); } else if(k==2) { scanf("%d%d",&lsx,&lsy); T adtree(lsx,lsy); } else if(k==3) { scanf("%d",&lsx); pritnf("%lld\n",T cxpath(lsx)); } } // rt 0; } nms Line_Segment_Tree { inl ll cx(tni d,tni l,tni r) { if((l<=t[d].l)&&(t[d].r<=r)) { rt t[d].x; } // pushduty(d); ll ret=0; tni md=t[d].mid; if(md>=l) { ret+=cx(d<<1,l,r); } if(md<r) { ret+=cx((d<<1)|1,l,r); } // rt ret; } inl void ad(tni d,tni l,tni r,tni x) { if((l<=t[d].l)&&(t[d].r<=r)) { t[d].x+=x*t[d].len; t[d].td+=x; rt; } // pushduty(d); tni md=t[d].mid; if(md>=l) { ad(d<<1,l,r,x); } if(md<r) { ad((d<<1)|1,l,r,x); } js(d); } inl void pushduty(tni d) { if(!t[d].td) { rt; } // itn ls=d<<1,rs=(d<<1)|1; t[ls].x+=t[ls].len*t[d].td; t[ls].td+=t[d].td; t[rs].x+=t[rs].len*t[d].td; t[rs].td+=t[d].td; t[d].td=0; } inl void js(tni d) { t[d].x=t[d<<1].x+t[(d<<1)|1].x; } inl void init(tni d,tni l,tni r) { t[d].l=l; t[d].r=r; t[d].mid=(t[d].l+t[d].r)>>1; t[d].len=r-l+1; if(l==r) { t[d].x=::x[::hash[l]]; rt; } // itn mid=(l+r)>>1,ls=d<<1,rs=(d<<1)|1; init(ls,l,mid); init(rs,mid+1,r); js(d); } } nms Tree_Line_Pou_Divided { inl ll cxpath(tni d) { ll ret=0; // while(tre[d].top!=rot) { ret+=L cx(1,tre[tre[d].top].d,tre[d].d); d=tre[tre[d].top].fa; } // rt ret+L cx(1,tre[rot].d,tre[d].d); } inl void adtree(tni d,tni x) { L ad(1,tre[d].d,tre[d].d+tre[d].siz-1,x); } inl void adnode(tni d,tni x) { L ad(1,tre[d].d,tre[d].d,x); } inl void dfs2(tni d,tni ltop) { tni ls; tre[d].top=ltop; tre[d].d=++nn; ::hash[nn]=d; if(tre[d].bigson) { dfs2(tre[d].bigson,ltop); } // for(re tni i=tre[d].h;i;i=e[i].n) { ls=e[i].t; if(tre[ls].top) { con; } // dfs2(ls,ls); } } inl void dfs1(tni d,tni fa) { tni ls,maxson=-infa;; tre[d].fa=fa; tre[d].siz=1; // for(re tni i=tre[d].h;i;i=e[i].n) { ls=e[i].t; if(ls==fa) { con; } // dfs1(ls,d); tre[d].siz+=tre[ls].siz; if(tre[ls].siz>maxson) { maxson=tre[ls].siz; tre[d].bigson=ls; } } } inl void Init() { dfs1(rot,0); dfs2(rot,rot); L init(1,1,n); } inl void ae(tni f,nit t) { e[++ne].n=tre[f].h; e[ne].t=t; tre[f].h=ne; } } ``` 发现不同了吗?没错,区别只有这一处: 48th行 inl void ad(int d,int l,int r,**ll/int** x) 然而题目有这么一句: >所有输入数据的绝对值都不会超过 10^6 so……why?这只是线段树区间加函数而已……
by ArachnidaQueen @ 2019-03-17 09:15:40


你这个函数中作了乘法运算爆了int
by 大吉大利 @ 2019-03-17 09:18:37


补充:只有“void adtree()”和“void adnode()”调用了该函数,而这两个函数传值都是用int……???
by ArachnidaQueen @ 2019-03-17 09:26:52


@[大吉大利](/space/show?uid=50014) 噗……吐血 非常感谢您啊!!
by ArachnidaQueen @ 2019-03-17 09:28:01


此帖已结……是我蠢了……
by ArachnidaQueen @ 2019-03-17 09:28:15


|