这是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