「HNOI2015」开店(树链剖分, 主席树)
/*
考虑将所求的值拆分
记每个点到根的路径长度为dis_i, 那么我们要求的就是\sum_{i = l} ^ r dis_i + dis[u] * (r - l + 1)
- 2\sum_{i = l} ^ r dis_{LCA(i, u)}
前两个前缀和处理
对于第三个可以转换成一个经典问题, 就是对于每个点到根的路径 + 1, 那么第三个东西就是这个点到根的贡献和了
*/
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<iostream>
#define ll long long
#define mmp make_pair
#define M 200010
using namespace std;
int read()
{
int nm = 0, f = 1;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
return nm * f;
}
int n, q, A, sz[M], son[M], fa[M], top[M], dfn[M], dft, ver[M], cnt;
ll dis[M], ans, sum[M], w[M];
pair<int, int> sta[M];
vector<pair<int, int> > to[M];
int lc[10001000], rc[10001000], v[10001000], rt[M];
ll t[10001000];
void dfs(int now, int f)
{
sz[now] = 1;
fa[now] = f;
for(int i = 0; i < to[now].size(); i++)
{
int vj = to[now][i].first, v = to[now][i].second;
if(vj == f) continue;
dis[vj] = dis[now] + v;
ver[vj] = v;
dfs(vj, now);
if(sz[vj] > sz[son[now]]) son[now] = vj;
sz[now] += sz[vj];
}
}
void dfs(int now)
{
dfn[now] = ++dft;
w[dfn[now]] = ver[now];
if(son[now])
{
top[son[now]] = top[now];
dfs(son[now]);
}
for(int i = 0; i < to[now].size(); i++)
{
int vj = to[now][i].first;
if(vj == fa[now] || vj == son[now]) continue;
top[vj] = vj;
dfs(vj);
}
}
void modify(int last, int &now, int l, int r, int ln, int rn)
{
now = ++cnt;
lc[now] = lc[last], rc[now] = rc[last], t[now] = t[last], v[now] = v[last];
if(l == ln && r == rn)
{
v[now]++;
return;
}
t[now] += w[rn] - w[ln - 1];
int mid = (l + r) >> 1;
if(ln > mid) modify(rc[last], rc[now], mid + 1, r, ln, rn);
else if(rn <= mid) modify(lc[last], lc[now], l, mid, ln, rn);
else modify(lc[last], lc[now], l, mid, ln, mid), modify(rc[last], rc[now], mid + 1, r, mid + 1, rn);
}
ll query(int now, int l, int r, int ln, int rn)
{
ll ans = 1ll * (w[rn] - w[ln - 1]) * v[now];
if(l == ln && r <= rn) return ans + t[now];
int mid = (l + r) >> 1;
if(rn <= mid) return ans + query(lc[now], l, mid, ln, rn);
else if(ln > mid) return ans + query(rc[now], mid + 1, r, ln, rn);
else return ans + query(lc[now], l, mid, ln, mid) + query(rc[now], mid + 1, r, mid + 1, rn);
}
void Modify(int &now, int x)
{
for(; top[x] != 1; x = fa[top[x]]) modify(now, now, 1, n, dfn[top[x]], dfn[x]);
modify(now, now, 1, n, dfn[1], dfn[x]);
}
ll Query(int now, int x)
{
ll ans = 0;
for(; top[x] != 1; x = fa[top[x]]) ans += query(now, 1, n, dfn[top[x]], dfn[x]);
ans += query(now, 1, n, dfn[1], dfn[x]);
return ans;
}
int main()
{
n = read(), q = read(), A = read();
for(int i = 1; i <= n; i++) sta[i] = mmp(read(), i);
sort(sta + 1, sta + n + 1);
for(int i = 1; i < n; i++)
{
int vi = read(), vj = read(), v = read();
to[vi].push_back(mmp(vj, v));
to[vj].push_back(mmp(vi, v));
}
dfs(1, 0);
top[1] = 1;
dfs(1);
for(int i = 1; i <= n; i++) sum[i] = sum[i - 1] + dis[sta[i].second], w[i] += w[i - 1];
for(int i = 1; i <= n; i++) rt[i] = rt[i - 1], Modify(rt[i], sta[i].second);
while(q--)
{
int u = read(), l = read(), r = read();
l = (ans + l) % A, r = (ans + r) % A;
if(r < l) swap(l, r);
ans = 0;
l = lower_bound(sta + 1, sta + n + 1, mmp(l, 0)) - sta,
r = lower_bound(sta + 1, sta + n + 1, mmp(r, 0x3e3e3e3e)) - sta - 1;
ans += Query(rt[l - 1], u);
ans -= Query(rt[r], u);
ans *= 2;
ans += 1ll * (r - l + 1) * dis[u];
ans += sum[r] - sum[l - 1];
cout << ans << "\n";
}
return 0;
}
「HNOI2015」开店(树链剖分, 主席树)的更多相关文章
- dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448
4448: [Scoi2015]情报传递 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 588 Solved: 308[Submit][Status ...
- BZOJ4012 HNOI2015开店(树链剖分+主席树)
考虑这样一个问题:一棵树初始全是白点,有两种操作:把一个点染黑:询问某点到所有黑点的距离之和. 注意到树上两点x和y的距离为depth[x]+depth[y]-depth[lca(x,y)]*2.要求 ...
- Codechef FIBTREE 树链剖分 主席树 LCA 二次剩余 快速幂
原文链接https://www.cnblogs.com/zhouzhendong/p/CC-FIBTREE.html 题目传送门 - CC-FIBTREE 题意 给定一个有 $n$ 个节点,初始点权都 ...
- BZOJ1146 [CTSC2008]网络管理Network 树链剖分 主席树 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1146 题意概括 在一棵树上,每一个点一个权值. 有两种操作: 1.单点修改 2.询问两点之间的树链 ...
- bzoj 4448 [Scoi2015]情报传递 (树链剖分+主席树)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4448 题面: Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络 ...
- BZOJ 4448: [Scoi2015]情报传递 树链剖分 主席树
4448: [Scoi2015]情报传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4448 Description 奈特公司是一个巨 ...
- [GDOI2016][树链剖分+主席树]疯狂动物城
题面 Description Nick 是只在动物城以坑蒙拐骗为生的狐狸,儿时受到偏见的伤害,放弃了自己的理想.他被兔子 Judy 设下圈套,被迫与她合作查案,而卷入意想不到的阴谋,历尽艰险后成为搭档 ...
- HDU 5111 Alexandra and Two Trees 树链剖分 + 主席树
题意: 给出两棵树,每棵树的节点都有一个权值. 同一棵树上的节点的权值互不相同,不同树上节点的权值可以相同. 要求回答如下询问: \(u_1 \, v_1 \, u_2 \, v_2\):询问第一棵树 ...
- 5.15 牛客挑战赛40 E 小V和gcd树 树链剖分 主席树 树状数组 根号分治
LINK:小V和gcd树 时限是8s 所以当时好多nq的暴力都能跑过. 考虑每次询问暴力 跳父亲 这样是nq的 4e8左右 随便过. 不过每次跳到某个点的时候需要得到边权 如果直接暴力gcd的话 nq ...
- BZOJ3531 SDOI2014 旅行 - 树链剖分,主席树
题意:给定一棵树,树上每个点有权值和类型.支持:修改某个点的类型:修改某个点的权值:询问某条链上某个类型的点的和/最大值.点数/类型数/询问数<=100000. 分析: 树链剖分,对每个类型的点 ...
随机推荐
- python5-10 检查用户名
检查用户名5-10 current_users = ['Tom', 'bob', 'Alice', 'zhangsan', 'Lisi', 'John'] new_users = ['zhangsan ...
- 安装Redis的PHP扩展
1.安装phpize(php如果升级到php7,这步会报错,报错参考:https://www.cnblogs.com/clubs/p/10091103.html) yum install php-de ...
- java-普通类文件@Autowired自动注入为null
@Autowired注解在非Controller中注入为null 1.配置文件(类文件所在的包) <context:component-scan base-package="net.n ...
- ASP.NET AJAX入门系列(6):UpdateProgress控件简单介绍
在ASP.NET AJAX Beta2中,UpdateProgress控件已经从“增值”CTP中移到了ASP.NET AJAX核心中.以下两篇关于UpdateProgress的文章基本翻译自ASP.N ...
- F5负载均衡原理
一. 负载均衡技术 负载均衡技术在现有网络结构之上提供了一种廉价.有效.透明的方法,来扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性. 1.负载均衡发生的流程图 ...
- openwrt 无线中继
参考: https://wiki.openwrt.org/doc/recipes/relayclient 该方法可以实现中继AP,而不需要AP(WDS)模式.中继后,相当于该路由所有的LAN口以及AP ...
- backgroud 应用减小资源大小和请求数
一,一个典型的应用,利用小图的自动延伸,实现整个网页背景图,充分节约资源宽带.如:汽车之家的404页背景图就是这样 <div style="height: 3000px; backgr ...
- Delphi中使用ADO连接Excel
第一部分: . 设置ADOConnection的ConnectionString属性的OLE DB的提供者要选择Microsoft Jet 4.0 OLE DB Provider(这本来是用于连接Ac ...
- ubuntu-docker入门到放弃(一)docker的安装
基于ubuntu14.04系统 安装参考官网:https://docs.docker.com 1.首先检查是否安装过docker,如果安装过,卸载: sudo apt-get remove docke ...
- [转][C#]Environment 类
当执行 Environment.GetEnvironmentVariables() 时,可以得到以下结果(受所安装软件影响,每台电脑都不一样) Count = ["SystemDrive&q ...