正好练练熟练度。。(刷水题谋财害命QAQ)

#include<cstdio>
#include<iostream>
#define ll long long
#define R register ll
#define ls (tr<<1)
#define rs (tr<<1|1)
const int M=;
using namespace std;
inline ll g() {
R ret=; register char ch; while(!isdigit(ch=getchar())) ;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret;
}
int n,m,tr,cnt,num,mod;
int vr[M<<],nxt[M<<],fir[M],dfn[M],pre[M],d[M],sz[M],son[M],top[M],rw[M],w[M];
ll tg[M<<],sum[M<<];
inline void add(int u,int v) {vr[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;}
void dfs(int u) { sz[u]=; R mx=;
for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];
if(!d[v]) {
pre[v]=u; d[v]=d[u]+; dfs(v); sz[u]+=sz[v];
if(sz[v]>mx) son[u]=v,mx=sz[v];
}
}
}
void dfs_(int u,int tp) {
top[u]=tp,dfn[u]=++num,rw[num]=u;
if(son[u]) dfs_(son[u],tp);
for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];
if(v!=pre[u]&&v!=son[u]) dfs_(v,v);
}
}
inline void build(int tr,int l,int r) {
if(l==r) {sum[tr]=; return ;}
R md=(l+r)>>; build(ls,l,md),build(rs,md+,r);
sum[tr]=sum[ls]+sum[rs];
}
inline void spread(int tr,int len) {
if(tg[tr])
tg[ls]+=tg[tr],sum[ls]+=(len-(len>>))*tg[tr],
tg[rs]+=tg[tr],sum[rs]+=(len>>)*tg[tr],tg[tr]=;
}
inline ll query(int tr,int l,int r,int LL,int RR) { R ret=;
if(LL<=l&&r<=RR) {return sum[tr];} spread(tr,r-l+); R md=(l+r)>>;
if(LL<=md) ret+=query(ls,l,md,LL,RR);
if(RR>md) ret+=query(rs,md+,r,LL,RR); return ret;
}
inline void update(int tr,int l,int r,int LL,int RR,int inc) {
if(LL<=l&&r<=RR) {tg[tr]+=inc,sum[tr]+=(r-l+)*inc; return ;}
spread(tr,r-l+); R md=(l+r)>>;
if(LL<=md) update(ls,l,md,LL,RR,inc);
if(RR>md) update(rs,md+,r,LL,RR,inc);
sum[tr]=sum[ls]+sum[rs];
}
inline void change(int u,int v,int inc) {
while(top[u]!=top[v]) {
if(d[top[u]]<d[top[v]]) swap(u,v);
update(,,n,dfn[top[u]],dfn[u],inc);
u=pre[top[u]];
} if(dfn[u]>dfn[v]) swap(u,v);
update(,,n,dfn[u],dfn[v],inc);
}
signed main() {
n=g();
for(R i=,u,v;i<n;++i) u=g(),v=g(),add(u,v),add(v,u); cnt=;
d[tr]=; dfs(tr),dfs_(tr,tr); build(,,n); m=g();
for(R i=;i<=m;++i) { register char ch; while(!isalpha(ch=getchar()));
R u=g(),v,inc;
if(ch=='A') v=g(),inc=g(),change(u,v,inc);
else if(ch=='Q') printf("%lld\n",query(,,n,dfn[u],dfn[u]+sz[u]-));
}
}

2019.04.22

最新文章

  1. 利用伪类:before&amp;&amp;:after实现图标库图标
  2. sql数据库不能用localhost/phpMyadmin登陆,真正要修改的文件是哪个
  3. Python 函数嵌套
  4. Shader预处理宏、内置状态变量、多版本编译等
  5. 网页中的JavaScript
  6. Web services 安全 - HTTP Basic Authentication
  7. ionic+angular+cordova 安卓环境搭建
  8. poj 3259 Wormholes spfa算法
  9. Linux场景下的辅助命令操作汇总
  10. JDBC-ODBC桥接访问SQLServer2008数据库
  11. Arrays工具类的实用功能
  12. 全局鼠标钩子:WH_MOUSE_LL, 在【 win 10 上网本】上因为太卡,运行中丢失全局鼠标钩子
  13. Comet OJ 热身赛(E题)(处理+最短路算法)
  14. 快速做ssh免密钥登陆
  15. JDK线程池的拒绝策略
  16. (免费电影)苹果手机合并.ts视频
  17. java按行和列进行输出数据
  18. Python字符集
  19. 课堂练习 psp表
  20. 7-31 The World&#39;s Richest(25 分)

热门文章

  1. 2-2 zookeeper下载、安装以及配置环境变量
  2. 【总结整理】关于ArcGIS中拓扑的理解
  3. 列表控件JList的使用
  4. Blender 工具使用——模式切换
  5. Django扩展Auth-User表的几种方法
  6. 同一个id出现多条数据的问题
  7. Pull项目失败
  8. 前端(HTML/CSS/JS)-JavaScript编码规范
  9. Bulma 中的媒体查询
  10. Python入门:模拟登录(二)或注册之requests处理带token请求