| 记录编号 |
383215 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
2278.[HZOI 2015] 树黑白 |
最终得分 |
100 |
| 用户昵称 |
L_in |
是否通过 |
通过 |
| 代码语言 |
C++ |
运行时间 |
0.657 s |
| 提交时间 |
2017-03-15 15:56:31 |
内存使用 |
27.22 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 200100
using namespace std;
typedef long long ll;
int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=10*x+ch-'0',ch=getchar();
return x*f;
}
int n,m;
struct Edge{
int to,next,w;
}e[maxn<<1];
int head[maxn],tot;
void add(int from,int to,int w){
e[++tot].w=w;
e[tot].to=to;
e[tot].next=head[from];
head[from]=tot;
}
int deep[maxn],size[maxn],son[maxn],fa[maxn];
int top[maxn],dfn[maxn],pos[maxn],dfn_cnt;
ll sum[maxn],dis[maxn];int val[maxn];
void dfs(int x){
size[x]=1;son[x]=0;
for(int i=head[x];i;i=e[i].next){
int to=e[i].to;
if(size[to])continue;
deep[to]=deep[x]+1;
val[to]=e[i].w;
dis[to]=dis[x]+e[i].w;
fa[to]=x;
dfs(to);
size[x]+=size[to];
if(size[son[x]]<size[to])son[x]=to;
}
}
void dfs2(int x,int t){
top[x]=t;dfn[x]=++dfn_cnt;
pos[dfn_cnt]=x;
if(son[x])dfs2(son[x],t);
for(int i=head[x];i;i=e[i].next){
int to=e[i].to;
if(!top[to])dfs2(to,to);
}
}
ll a[maxn<<2],lazy[maxn<<2];
#define mid ((l+r)>>1)
#define L rt<<1,l,mid
#define R rt<<1|1,mid+1,r
void push_down(int rt,int l,int r){
lazy[rt<<1]+=lazy[rt];
lazy[rt<<1|1]+=lazy[rt];
a[rt<<1]+=lazy[rt]*(sum[mid]-sum[l-1]);
a[rt<<1|1]+=lazy[rt]*(sum[r]-sum[mid]);
lazy[rt]=0LL;
}
void ins(int rt,int l,int r,int s,int t,int w){
if(s<=l&&t>=r){
lazy[rt]+=w;
a[rt]+=(sum[r]-sum[l-1])*w;
return;
}
if(lazy[rt])push_down(rt,l,r);
if(s<=mid)ins(L,s,t,w);
if(t>mid)ins(R,s,t,w);
a[rt]=a[rt<<1]+a[rt<<1|1];
}
ll qsum(int rt,int l,int r,int s,int t){
if(s<=l&&t>=r)return a[rt];
if(lazy[rt])push_down(rt,l,r);
if(t<=mid)return qsum(L,s,t);
if(s>mid)return qsum(R,s,t);
return qsum(L,s,t)+qsum(R,s,t);
}
void ins(int x,int y,int w){
while(top[x]!=top[y]){
if(deep[top[x]]<deep[top[y]])swap(x,y);
ins(1,1,n,dfn[top[x]],dfn[x],w);
x=fa[top[x]];
}
if(deep[x]>deep[y])swap(x,y);
ins(1,1,n,dfn[x],dfn[y],w);
}
ll qsum(int x,int y){
ll ans=0;
while(top[x]!=top[y]){
if(deep[top[x]]<deep[top[y]])swap(x,y);
ans+=qsum(1,1,n,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
if(deep[x]>deep[y])swap(x,y);
ans+=qsum(1,1,n,dfn[x],dfn[y]);
return ans;
}
bool b[maxn];
int main(){
freopen("A_Tree.in","r",stdin);
freopen("A_Tree.out","w",stdout);
n=read();m=read();
int x,y,w;
for(int i=1;i<n;i++){
x=read();y=read();w=read();
add(x,y,w);add(y,x,w);
}
dfs(1);
dfs2(1,1);
for(int i=1;i<=dfn_cnt;i++)
sum[i]=sum[i-1]+val[pos[i]];
char op[5];
int cnt=0;ll pre=0LL;
for(int i=1;i<=m;i++){
scanf("%s",op);x=read();
if(op[0]=='M'){
if(!b[x])ins(1,x,1),cnt++,pre+=dis[x],b[x]=true;
else ins(1,x,-1),cnt--,pre-=dis[x],b[x]=false;
}else printf("%lld\n",cnt*dis[x]+pre-2LL*qsum(1,x));
}
fclose(stdin);fclose(stdout);
return 0;
}