题意:给定一棵树,树上每个点有权值和类型。支持:修改某个点的类型;修改某个点的权值;询问某条链上某个类型的点的和/最大值。点数/类型数/询问数<=100000.

分析:

树链剖分,对每个类型的点建立线段树(动态开点)。

note: 忘记写t_query返回值调半天……

莫名其妙地1A

代码:

 #include <bits/stdc++.h>
using namespace std; int a[],s[],dep[],size[],vis[],top[],wson[],fa[][],n,m,t1,t2,t3,t4;
int sid[],tid[],ind,cnt,ch[][],root[],c[],w[];
vector <int> g[]; void dfs1(int p){
size[p]=;
vis[p]=;
for(int i=;i<g[p].size();i++)
if(vis[g[p][i]]==) {
dep[g[p][i]]=dep[p]+;
fa[g[p][i]][]=p;
dfs1(g[p][i]);
size[p]+=size[g[p][i]];
if(size[g[p][i]]>size[wson[p]]) wson[p]=g[p][i];
}
} void dfs2(int p){
vis[p]=;
sid[p]=++ind;
tid[ind]=p;
if(wson[p]) {
top[wson[p]]=top[p];
dfs2(wson[p]);
}
for(int i=;i<g[p].size();i++)
if(vis[g[p][i]]==) {
top[g[p][i]]=g[p][i];
dfs2(g[p][i]);
}
} void lca_presolve() {
for(int i=;i<=;i++)
for(int j=;j<=n;j++)
fa[j][i]=fa[fa[j][i-]][i-];
} int lca(int p,int q) {
if(dep[q]>dep[p]) swap(p,q);
for(int i=;i>=;i--) if(dep[fa[p][i]]>=dep[q]) p=fa[p][i];
for(int i=;i>=;i--) if(fa[p][i]-fa[q][i]) p=fa[p][i],q=fa[q][i];
if(p-q) p=fa[p][],q=fa[q][];
return max(p,q);
} void init() {
dep[]=;
top[]=;
dfs1();
memset(vis,,sizeof vis);
dfs2();
lca_presolve();
} void modify(int &p,int l,int r,int pos,int k) {
if(p==) p=++cnt;
if(l==r) {
a[p]=k;
s[p]=k;
}
else {
if(pos<=(l+r)/) modify(ch[p][],l,(l+r)/,pos,k);
else modify(ch[p][],(l+r)/+,r,pos,k);
a[p]=max(a[ch[p][]],a[ch[p][]]);
s[p]=s[ch[p][]]+s[ch[p][]];
}
} void tmodify(int t,int pos,int k) {
modify(root[t],,*n,sid[pos],k);
} int queryMax(int p,int l,int r,int ql,int qr) {
if(p==) return ;
if(l>qr||r<ql) return ;
if(l>=ql&&r<=qr) return a[p];
return max(queryMax(ch[p][],l,(l+r)/,ql,qr),queryMax(ch[p][],(l+r)/+,r,ql,qr));
} int querySum(int p,int l,int r,int ql,int qr) {
if(p==) return ;
if(l>qr||r<ql) return ;
if(l>=ql&&r<=qr) return s[p];
return querySum(ch[p][],l,(l+r)/,ql,qr)+querySum(ch[p][],(l+r)/+,r,ql,qr);
} int lqueryMax(int t,int anc,int son) {
int ans=;
while(dep[top[son]]>dep[anc]) {
ans=max(ans,queryMax(root[t],,*n,sid[top[son]],sid[son]));
son=fa[top[son]][];
}
ans=max(ans,queryMax(root[t],,*n,sid[anc],sid[son]));
return ans;
} int lquerySum(int t,int anc,int son) {
int ans=;
while(dep[top[son]]>dep[anc]) {
ans+=querySum(root[t],,*n,sid[top[son]],sid[son]);
son=fa[top[son]][];
}
ans+=querySum(root[t],,*n,sid[anc],sid[son]);
return ans;
} int tqueryMax(int t,int p,int q) {
int l=lca(p,q);
return max(lqueryMax(t,l,p),lqueryMax(t,l,q));
} int tquerySum(int t,int p,int q) {
int l=lca(p,q);
return lquerySum(t,l,p)+lquerySum(t,l,q)-w[l]*(c[l]==c[p]);
} string str; int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=;i<=n;i++) {
cin>>t1>>t2;
//tmodify(t2,sid[i],t1);
c[i]=t2;
w[i]=t1;
}
for(int i=;i<n;i++) {
cin>>t1>>t2;
g[t1].push_back(t2);
g[t2].push_back(t1);
}
init();
for(int i=;i<=n;i++) {
tmodify(c[i],i,w[i]);
}
for(int i=;i<=m;i++) {
cin>>str>>t1>>t2;
if(str=="CC") {
tmodify(c[t1],t1,);
tmodify(t2,t1,w[t1]);
c[t1]=t2;
}
if(str=="CW") {
tmodify(c[t1],t1,);
tmodify(c[t1],t1,t2);
w[t1]=t2;
}
if(str=="QS") {
cout<<tquerySum(c[t1],t1,t2)<<endl;
}
if(str=="QM") {
cout<<tqueryMax(c[t1],t1,t2)<<endl;
}
}
}

最新文章

  1. Request.Form接收不到post数据.
  2. js/jQuery使用过程中常见问题
  3. article和section
  4. myeclipse中配置maven
  5. http://jingyan.baidu.com/album/03b2f78c4cc0ad5ea337ae7d.html
  6. Codeforces Round #376 (Div. 2) C. Socks---并查集+贪心
  7. nagios架构及windows,linux客户端配置
  8. Apache CXF实现Web Service(4)——Tomcat容器和Spring实现JAX-RS(RESTful) web service
  9. ANDROID_MARS学习笔记_S05_004_过滤杂质,得到真正的加速度
  10. Android开发学习之TypedArray类
  11. hdu_3067_小t的游戏(脑洞)
  12. [Swift]LeetCode617. 合并二叉树 | Merge Two Binary Trees
  13. jQuery-全屏滚动插件【fullPage.js】API 使用方法总结
  14. microcks 微服务mocks 工具&amp;&amp;运行时
  15. VS2008--VS2013 各种版本官方下载地址
  16. 000 Jquery的Hello World程序
  17. qt——c++环境下qt编程,类的声明与构造
  18. 深度学习笔记(六)VGG14
  19. sparksql连接mysql
  20. django -- url (模版语言 {% url &#39;test1&#39; param1=5 param2=6 %})

热门文章

  1. 初窥ECharts
  2. RequestFacade对象获取请求头时忽略大小写
  3. 【转载】structlog4j介绍
  4. kuangbin专题 专题九 连通图 Warm up HDU - 4612
  5. POJ - 1426-Find The Multiple-专为小白解惑-同余加搜索树
  6. VB程序去nag
  7. MySql -- check 约束
  8. MAC安装MacPorts 卡在“正在运行软件包脚本”的解决办法
  9. Wannafly Winter Camp 2020 Day 6H 异或询问 - 二分
  10. phpcms搜索给分页代码添加参数方法