【题目链接】

点击打开链接

【算法】

树链剖分

每个宗教建一棵线段树,注意数据量大,要动态开点

【代码】

#include<bits/stdc++.h>
using namespace std;
#define MAXLOG 18
const int MAXN = 1e5 + ;
const int MAXS = 1e7 + ; int i,n,q,x,y,t,Lca,SZ,timer;
int w[MAXN],c[MAXN],son[MAXN],dfn[MAXN],top[MAXN],size[MAXN],anc[MAXN][MAXLOG],
dep[MAXN],fa[MAXN],lc[MAXS],rc[MAXS],sum[MAXS],Max[MAXS],root[MAXN];
vector<int> e[MAXN];
char opt[]; inline void dfs1(int x)
{
int i,y;
anc[x][] = fa[x];
for (i = ; i < MAXLOG; i++)
{
if (dep[x] < ( << i)) break;
anc[x][i] = anc[anc[x][i-]][i-];
}
size[x] = ;
for (i = ; i < e[x].size(); i++)
{
y = e[x][i];
if (fa[x] != y)
{
dep[y] = dep[x] + ;
fa[y] = x;
dfs1(y);
size[x] += size[y];
if (size[y] > size[son[x]]) son[x] = y;
}
}
}
inline void dfs2(int x,int tp)
{
int i,y;
dfn[x] = ++timer;
top[x] = tp;
if (son[x]) dfs2(son[x],tp);
for (i = ; i < e[x].size(); i++)
{
y = e[x][i];
if (fa[x] != y && son[x] != y) dfs2(y,y);
}
}
inline int lca(int x,int y)
{
int i,t;
if (dep[x] > dep[y]) swap(x,y);
t = dep[y] - dep[x];
for (i = ; i < MAXLOG; i++)
{
if (t & ( << i))
y = anc[y][i];
}
if (x == y) return x;
for (i = MAXLOG - ; i >= ; i--)
{
if (anc[x][i] != anc[y][i])
{
x = anc[x][i];
y = anc[y][i];
}
}
return fa[x];
}
inline void push_up(int root)
{
Max[root] = max(Max[lc[root]],Max[rc[root]]);
sum[root] = sum[lc[root]] + sum[rc[root]];
}
inline void modify(int &root,int l,int r,int x,int val)
{
int mid;
if (!root) root = ++SZ;
if (l == r)
{
Max[root] = sum[root] = val;
return;
}
mid = (l + r) >> ;
if (mid >= x) modify(lc[root],l,mid,x,val);
else modify(rc[root],mid+,r,x,val);
push_up(root);
}
inline int query_max(int root,int l,int r,int ql,int qr)
{
int mid;
if (!root) return ;
if (l == ql && r == qr) return Max[root];
mid = (l + r) >> ;
if (mid >= qr) return query_max(lc[root],l,mid,ql,qr);
else if (mid + <= ql) return query_max(rc[root],mid+,r,ql,qr);
else return max(query_max(lc[root],l,mid,ql,mid),query_max(rc[root],mid+,r,mid+,qr));
}
inline int query_sum(int root,int l,int r,int ql,int qr)
{
int mid;
if (!root) return ;
if (l == ql && r == qr) return sum[root];
mid = (l + r) >> ;
if (mid >= qr) return query_sum(lc[root],l,mid,ql,qr);
else if (mid + <= ql) return query_sum(rc[root],mid+,r,ql,qr);
else return query_sum(lc[root],l,mid,ql,mid) + query_sum(rc[root],mid+,r,mid+,qr);
} inline int solve1(int c,int x,int y)
{
int ans = ,
tx = top[x],ty = top[y];
while (tx != ty)
{
ans = max(ans,query_max(root[c],,n,dfn[tx],dfn[x]));
x = fa[tx]; tx = top[x];
}
ans = max(ans,query_max(root[c],,n,dfn[y],dfn[x]));
return ans;
}
inline int solve2(int c,int x,int y)
{
int ans = ,
tx = top[x],ty = top[y];
while (tx != ty)
{
ans += query_sum(root[c],,n,dfn[tx],dfn[x]);
x = fa[tx]; tx = top[x];
}
ans += query_sum(root[c],,n,dfn[y],dfn[x]);
return ans;
} int main()
{ scanf("%d%d",&n,&q);
for (i = ; i <= n; i++) scanf("%d%d",&w[i],&c[i]);
for (i = ; i < n; i++)
{
scanf("%d%d",&x,&y);
e[x].push_back(y);
e[y].push_back(x);
}
dfs1();
dfs2(,);
for (i = ; i <= n; i++) modify(root[c[i]],,n,dfn[i],w[i]);
while (q--)
{
scanf("%s",&opt);
if (strcmp(opt,"CC") == )
{
scanf("%d%d",&x,&y);
modify(root[c[x]],,n,dfn[x],);
c[x] = y;
modify(root[c[x]],,n,dfn[x],w[x]);
}
if (strcmp(opt,"CW") == )
{
scanf("%d%d",&x,&y);
modify(root[c[x]],,n,dfn[x],y);
w[x] = y;
}
if (strcmp(opt,"QS") == )
{
scanf("%d%d",&x,&y);
Lca = lca(x,y);
t = solve2(c[x],x,Lca) + solve2(c[x],y,Lca);
if (c[Lca] == c[x]) t -= w[Lca];
printf("%d\n",t);
}
if (strcmp(opt,"QM") == )
{
scanf("%d%d",&x,&y);
Lca = lca(x,y);
printf("%d\n",max(solve1(c[x],x,Lca),solve1(c[x],y,Lca)));
}
} return ; }

【SDOI 2014】 旅行的更多相关文章

  1. 【BZOJ 3531】【SDOI 2014】旅行

    因为有$10^5$个宗教,需要开$10^5$个线段树. 平时开的线段树是“满”二叉树,但在这个题中代表一个宗教的线段树管辖的区间有很多点都不属于这个宗教,也就不用“把枝叶伸到这个点上”,所以这样用类似 ...

  2. 【BZOJ 3529】【SDOI 2014】数表

    看Yveh的题解,这道题卡了好长时间,一直不明白为什么要······算了当时太naive我现在都不好意思说了 #include<cstdio> #include<cstring> ...

  3. [BZOJ 3530][Sdoi 2014]数数

    阿拉~好像最近总是做到 AC 自动机的题目呢喵~ 题目的算法似乎马上就能猜到的样子…… AC 自动机 + 数位 dp 先暴力转移出 f[i][j] :表示从 AC 自动机上第 j 号节点走 i 步且不 ...

  4. BZOJ 3533 sdoi 2014 向量集

    设(x,y)为Q的查询点,分类讨论如下:1.y>0:  最大化a*x+b*y,维护一个上凸壳三分即可 2.y<0:最大化a*x+b*y  维护一个下凸壳三分即可 我们考虑对时间建出一棵线段 ...

  5. [SDOI 2014]数表

    Description 有一张N×m的数表,其第i行第j列(1 < =i < =N,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和.给定a,计算数表中不大于 ...

  6. 解题:SDOI 2014 重建

    题面 做这个这个题需要稍微深入理解一点矩阵树定理:套矩阵树定理得到的东西是有意义的,它是“所有生成树边权乘积之和”(因为度数矩阵是点的边权和,邻接矩阵是边权),即$\sum_{t}\prod_{e∈t ...

  7. 解题:SDOI 2014 数表

    题面 为了好写式子,先不管$a$的限制 设$facs$为因子和,那么有 $ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^mfacs(gcd(i,j))$ 再设$f( ...

  8. 【BZOJ 3530】【SDOI 2014】数数

    http://www.lydsy.com/JudgeOnline/problem.php?id=3530 上午gty的测试题,爆0了qwq 类似文本生成器那道题,把AC自动机的转移建出来,准确地说建出 ...

  9. 「BZOJ 3529」「SDOI 2014」数表「莫比乌斯反演」

    题意 有一张 \(n\times m\) 的数表,其第\(i\)行第\(j\)列的数值为能同时整除\(i\)和\(j\)的所有自然数之和. \(T\)组数据,询问对于给定的 \(n,m,a\) , 计 ...

随机推荐

  1. loadrunner 多用户并发操作解读

    假设存在: 数据:A.B.C 虚拟用户:Vuser1.Vuser2.Vuser3 脚本中参数出现三次,脚本迭代三次 怎样取下一行数据? Sequential:顺序,所有虚拟用户按照顺序读取数据表 Ra ...

  2. 【2018 Multi-University Training Contest 2】

    01: 02: 03: 04:https://www.cnblogs.com/myx12345/p/9394511.html 05: 06: 07:https://www.cnblogs.com/my ...

  3. POJ 3461 字符串出现次数 && HDU1711 字符串第一次出现的位置 模板题

      Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 48387   Accepted: 19261 Descri ...

  4. Junit中Assert.assertEquals()和Assert.assertSame方法有什么异同

    1)提供的接口数量不完全相同.assertEquals支持boolean,long,int等等java primitiveType变量.assertSame只支持Object. 2)比较的逻辑不同,结 ...

  5. final finally finalize 区别及用法

    final 1,final修饰的class,代表不可以继承扩展. 2.final的方法也是不可以重写的. 3.final修饰的变量是不可以修改的.这里所谓的不可修改对于基本类型来来,的确是不可以修改. ...

  6. Shiro note

    我们需要实现Realms的Authentication 和 Authorization.其中 Authentication 是用来验证用户身份,Authorization 是授权访问控制,用于对用户进 ...

  7. ZXing 二维码解析生成工具类

    原文:http://www.open-open.com/code/view/1455848023292 import com.google.zxing.*; import com.google.zxi ...

  8. crontab使用简介

    crontab的配置文件: 前四行是用来配置crond任务运行的环境变量 第一行SHELL变量指定了系统要使用哪个shell,这里是bash 第二行PATH变量指定了系统执行命令的路径 第三行MAIL ...

  9. MatConvNet 练习使用CNN

    首先在 VGG Convolutional Neural Networks Practical 官网上做了四个练习.现在代码可以直接用 但是在using pretrained models中有个错,n ...

  10. MVC的验证(模型注解和非侵入式脚本的结合使用) .Net中初探Redis .net通过代码发送邮件 Log4net (Log for .net) 使用GDI技术创建ASP.NET验证码 Razor模板引擎 (RazorEngine) .Net程序员应该掌握的正则表达式

    MVC的验证(模型注解和非侵入式脚本的结合使用)   @HtmlHrlper方式创建的标签,会自动生成一些属性,其中一些属性就是关于验证 如图示例: 模型注解 通过模型注解后,MVC的验证,包括前台客 ...