【题目链接】

点击打开链接

【算法】

树链剖分

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

【代码】

#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. Tao Tao要吃鸡(01背包)

    题目描述 Taotao的电脑带不动绝地求生,所以taotao只能去玩pc版的荒野行动了,和绝地求生一样,游戏人物本身可以携带一定重量m的物品,装备背包之后可以多携带h(h为0代表没有装备背包)重量的东 ...

  2. Codeforces Round #387 (Div. 2) A+B+C+D!

    A. Display Size 水题,暴力(数据都是水题).0:04 int main() { int n; while(~scanf("%d",&n)) { int mi ...

  3. NIUDAY 11.23 北京站抢票啦 | 看 AI 落地行业 享 AI 时代红利

    2018 年是见证「奇迹」的一年.AI 从多年的热门话题中开始走下神坛,逐渐深入到了各个行业,加速经济结构优化及行业智慧化升级,AI 已不再是难以企及的神话而是可触摸的美好未来. 政策支持加上资本推动 ...

  4. 【dp】D. Caesar's Legions

    https://www.bnuoj.com/v3/contest_show.php?cid=9146#problem/D [题意]给定n1个A,n2个B,排成一排,要求A最多能连续k1个紧挨着,B最多 ...

  5. BZOJ 1509[NOI 2003]逃学的小孩 树形dp

    1509: [NOI2003]逃学的小孩 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 995  Solved: 505[Submit][Status][ ...

  6. input文本框的value属性在页面中不随输入的数据而变化

    今天,在做试验遇到这么一个需求: 一个input文本框,输入值后将标签传到后台,在后台解析标签,发现value仍然是初值,不是我们改变后的值. 例如: <input name="&qu ...

  7. kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.

    https://blog.csdn.net/Mr_Hou2016/article/details/79484032

  8. 简单使用SOCKET,TCP,UDP模式之间的通信

    TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机网络OSI模型中, ...

  9. 巧用MySQL AHI加速神器,让你的InnoDB查询飞起来!

    DBAPLUS  http://mp.weixin.qq.com/s/cIjQIz-ZngSYJ3k2ZBBSsg

  10. CSS浮动通俗讲解

    首先要知道,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流.如下图: 可以看出,即使div1的宽度很小,页面中一行可以容下div1和div2,div2也不会排在div1后边,因为d ...