bzoj 4448 [Scoi2015]情报传递 (树链剖分+主席树)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4448
题面:
Description
Input
Output
Sample Input
0 1 1 2 2 3 3
6
1 4 7 0
2 1
2 4
2 7
1 4 7 1
1 4 7 3
Sample Output
5 2
5 1
HINT
- #include<bits/stdc++.h>
- using namespace std;
- #define lson l,m,rt<<1
- #define rson m+1,r,rt<<1|1
- #define mid int m = (l + r) >> 1
- const int M = 2e5+;
- const int Max = 5e6+;
- struct node{
- int to,next;
- }e[M<<];
- int head[M];
- int dep[M],fa[M],siz[M],son[M],top[M],tid[M],rk[M],cnt,cnt1;
- int ls[Max],rs[Max],sum[Max],root[Max],idx,n,q,t[M];
- void add(int u,int v){
- e[++cnt1].to = v; e[cnt1].next = head[u];head[u] = cnt1;
- }
- void dfs1(int u,int faz,int deep){
- dep[u] = deep;
- fa[u] = faz;
- siz[u] = ;
- for(int i = head[u];i;i = e[i].next){
- int v = e[i].to;
- if(v != fa[u]){
- dfs1(v,u,deep+);
- siz[u] += siz[v];
- if(son[u] == -||siz[v] > siz[son[u]])
- son[u] = v;
- }
- }
- }
- void dfs2(int u,int t){
- top[u] = t;
- tid[u] = cnt;
- rk[cnt] = u;
- cnt++;
- if(son[u] == -) return ;
- dfs2(son[u],t);
- for(int i = head[u];i;i = e[i].next){
- int v = e[i].to;
- if(v != son[u]&&v != fa[u])
- dfs2(v,v);
- }
- }
- void update(int old,int &k,int l,int r,int p){
- k = ++idx;
- ls[k] = ls[old]; rs[k] = rs[old]; sum[k] = sum[old] + ;
- if(l == r) return ;
- mid;
- if(p <= m) update(ls[old],ls[k],l,m,p);
- else update(rs[old],rs[k],m+,r,p);
- }
- int query(int L,int R,int l,int r,int p){
- L = root[L - ], R = root[R];
- int ret = ;
- while(l != r){
- mid;
- if(p <= m) L = ls[L] ,R = ls[R], r = m;
- else ret += sum[ls[R]] - sum[ls[L]],L = rs[L],R = rs[R],l = m+;
- }
- if(p >= l) ret += sum[R] - sum[L];
- return ret;
- }
- int solve(int x,int y,int p){
- int ans = ; int fx = top[x],fy = top[y];
- int tmp = dep[x] + dep[y];
- while(fx != fy){
- if(dep[fx] < dep[fy]) swap(x,y),swap(fx,fy);
- ans += query(tid[fx],tid[x],,q,p);
- x = fa[fx]; fx = top[x];
- }
- if(dep[x] > dep[y]) swap(x,y);
- ans += query(tid[x],tid[y],,q,p);
- cout<<tmp - *dep[x] + <<" "<<ans<<endl;
- }
- int x,k,w,u[M],v[M],c[M];
- int main()
- {
- ios::sync_with_stdio();
- cin.tie(); cout.tie();
- memset(son,-,sizeof(son));
- cin>>n;
- for(int i = ;i <= n;i ++){
- cin>>x; add(x,i);
- }
- dfs1(,-,); dfs2(,);
- cin>>q;
- memset(t,q,sizeof(t));
- int cnt2 = ;
- for(int i = ;i <= n;i ++) t[i] = q;
- for(int i = ;i <= q;i ++){
- cin>>k;
- if(k == ){
- cin>>u[cnt2]>>v[cnt2]>>w;
- c[cnt2++] = i - w - ;
- }
- else
- cin>>x,t[x] = i;
- }
- for(int i = ;i <= n;i ++)
- update(root[i-],root[i],,q,t[rk[i]]);
- for(int i = ;i < cnt2;i ++)
- solve(u[i],v[i],c[i]);
- }
bzoj 4448 [Scoi2015]情报传递 (树链剖分+主席树)的更多相关文章
- dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448
4448: [Scoi2015]情报传递 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 588 Solved: 308[Submit][Status ...
- BZOJ 4448: [Scoi2015]情报传递 树链剖分 主席树
4448: [Scoi2015]情报传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4448 Description 奈特公司是一个巨 ...
- Codechef FIBTREE 树链剖分 主席树 LCA 二次剩余 快速幂
原文链接https://www.cnblogs.com/zhouzhendong/p/CC-FIBTREE.html 题目传送门 - CC-FIBTREE 题意 给定一个有 $n$ 个节点,初始点权都 ...
- BZOJ1146 [CTSC2008]网络管理Network 树链剖分 主席树 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1146 题意概括 在一棵树上,每一个点一个权值. 有两种操作: 1.单点修改 2.询问两点之间的树链 ...
- [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. 分析: 树链剖分,对每个类型的点 ...
- BZOJ4012 HNOI2015开店(树链剖分+主席树)
考虑这样一个问题:一棵树初始全是白点,有两种操作:把一个点染黑:询问某点到所有黑点的距离之和. 注意到树上两点x和y的距离为depth[x]+depth[y]-depth[lca(x,y)]*2.要求 ...
随机推荐
- jqgrid 分页时,清空原表格数据加载返回的新数据
由于,我们是动态分页,分页后的数据是在触发分页后动态加载而来.如何使jqgrid清空原数据而加载新数据? 1)调用jqgrid的 clearGridData 方法清空表格数据 2)调用jqgrid的 ...
- Excel frequency函数
计算连续次数最常用的函数就是FREQUENCY,下面就这个函数在计算连续次数的应用做一个详细图解.首先,我们需要了解一下FREQUENCY函数的计算原理. FREQENCY(数据区域,用于设置区 ...
- Docker的Mysql数据库:把数据存储在本地目录
Docker mysql 把数据存储在本地目录,很简单,只需要映射本地目录到容器即可 1.加上-v参数 $ docker run -d -e MYSQL_ROOT_PASSWORD=admin --n ...
- bundle install 安装的 gem 提示 cannot load such file
/usr/local/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load ...
- Java入门知识1
1. 获取标准屏幕的输入时,需导入java.util.Scanner包. 2. 主类的名称与.java的文件名需一致. 3. 文件中主类设置为public,其他类前面无需加访问级别. 4. 继承时,使 ...
- pandas 初识(三)
Python Pandas 空值 pandas 判断指定列是否(全部)为NaN(空值) import pandas as pd import numpy as np df = pd.DataFrame ...
- GitLab篇之Linux下环境搭建
之前公司一直在使用微软的VSS和SVN做为源代码管理工具,考虑到VSS和SVN的局限性,个人一直建议我们应该采用Git来管理我们的源代码.Git的好处不多说相信大家也都知道的.Git不仅仅是一个源代码 ...
- 三丰云使用记录--部署iis服务器
写在前面的话:看在我这么热心写使用推广记录,麻烦延长下使用天数,谢谢 官网地址:https://www.sanfengyun.com 三丰云是北京太极三丰云计算有限公司旗下网络服务品牌,十八年IDC ...
- Shell 基础 -- 总结几种括号、引号的用法
Shell 脚本中经常需要用到一些括号.引号表达式,功能各不相同,本文详细介绍一下. 1.双引号 " " 双引号常用于包含一组字符串,在双引号中,除了 "$". ...
- 怎么用JavaScript写一个区块链?
几乎所有语言都可以编写区块链开发程序.那么如何用JavaScript写一个区块链?以下我将要用JavaScript来创建1个简单的区块链来演示它们的内部到底是怎样工作的.我将会称作SavjeeCoin ...