輸入格式
若這行為a a,b,則表示a,b這條邊被改造成公路;
若這行為w,a, 則表示bluemary曾經從位元堡送信到村莊a.
輸出格式
有m行,每行包含乙個整數,表示對應的某次送信時經過的土路數目。
樣例樣例輸入
5
1 21 3
1 44 5
4w 5
a 1 4
w 5a 4 5
w 5w 2
a 1 2
a 1 3
樣例輸出
210
1思路類似樹剖,但稍微簡單
1 #include2 #include3 #include4view codeusing
namespace
std;
5const
int maxn=250000+10;6
int lazy[maxn<<2],tree[maxn<<2];7
struct
edgee[maxn<<1
];10
int head[maxn],tot=0;11
void insert(int a,int
b)16
int top=0;17
intdeep[maxn],size[maxn],num[maxn];
18void dfs(int u,int
fa)27}28
void pushup(int
rt)31
void modify(int rt,int l,int r,int x,int
w)36
int mid=(l+r)>>1;37
if(x<=mid) modify(rt<<1
,l,mid,x,w);
38else modify(rt<<1|1,mid+1
,r,x,w);
39pushup(rt);40}
41void update(int rt,int l,int r,int
w)45
void pushdown(int rt,int l,int
r)51
int query(int rt,int l,int r,int
x)55
pushdown(rt,l,r);
56int mid=(l+r)>>1;57
if(x<=mid) return query(rt<<1
,l,mid,x);
58else
return query(rt<<1|1,mid+1
,r,x);59}
60void modify1(int rt,int l,int r,int s,int t,int
w)65
int mid=(l+r)>>1;66
if(s<=mid) modify1(rt<<1
,l,mid,s,t,w);
67if(t>mid) modify1(rt<<1|1,mid+1
,r,s,t,w);
68pushup(rt);69}
70int
main()
79for(int i=1;i<=n;i++) size[i]=1
;80 dfs(1,0
);81
for(int i=1;i<=n;i++) modify(1,1,n,num[i],deep[i]-1
);82
intm;
83 scanf("
%d",&m);
84for(int i=1;i<=n+m-1;i++)
93else99}
100return0;
101 }
1 #include2 #include3 #include4view codeusing
namespace
std;
5const
int maxn=250000+10;6
int lazy[maxn<<2],tree[maxn<<2];7
struct
edgee[maxn<<1
];10
int head[maxn],tot=0;11
void insert(int a,int
b)16
int top=0;17
intdeep[maxn],size[maxn],num[maxn];
18void dfs(int u,int
fa)27}28
void pushup(int
rt)31
void modify(int rt,int l,int r,int x,int
w)36
int mid=(l+r)>>1;37
if(x<=mid) modify(rt<<1
,l,mid,x,w);
38else modify(rt<<1|1,mid+1
,r,x,w);
39pushup(rt);40}
41void update(int rt,int l,int r,int
w)45
void pushdown(int rt,int l,int
r)51
int query(int rt,int l,int r,int
x)55
pushdown(rt,l,r);
56int mid=(l+r)>>1;57
if(x<=mid) return query(rt<<1
,l,mid,x);
58else
return query(rt<<1|1,mid+1
,r,x);59}
60void modify1(int rt,int l,int r,int s,int t,int
w)65
int mid=(l+r)>>1;66
if(s<=mid) modify1(rt<<1
,l,mid,s,t,w);
67if(t>mid) modify1(rt<<1|1,mid+1
,r,s,t,w);
68pushup(rt);69}
70int
main()
79for(int i=1;i<=n;i++) size[i]=1
;80 dfs(1,0
);81
for(int i=1;i<=n;i++) modify(1,1,n,num[i],deep[i]-1
);82
intm;
83 scanf("
%d",&m);
84for(int i=1;i<=n+m-1;i++)
93else99}
100return0;
101 }