LGP4216题解
这是一种题解没有的 \(O(m\log n)\) 做法。
首先第一步转化。设这是第 \(x\) 个任务,若 \(opt\) 为 \(1\),危险值大于 \(c\) 的只有可能在第 \(x-c-1\) 个任务以前出现。
于是题目就变成了在某一时刻单点加和在某一时刻链上查询,离线即可去掉“某一时刻”。
单点加和链上查询,大家用的应该都是树剖,复杂度是 \(O(\log^2n)\) 的。然而使用 DFS 序和差分,将单点加转化为子树加,将链上查询转化为单点查询。
具体来说就是设一个 \(s[u]\) 表示节点 \(u\) 到根节点有多少个节点是危险的,那么单点加就可以变成子树加,在 DFS 序上就是区间加。
链上查询只需要查询 \(u,v,LCA(u,v),f[LCA(u,v)]\),也就是单点查。
区间加单点查,树状数组上!
极短的代码:
#include<cstdio>
#include<vector>
const int M=2e5+5;
int n,m,dfc,d[M],f[M],dfn[M],siz[M],son[M],top[M];
int BIT[M];int opt[M],x[M],y[M],ans[M];
std::vector<int>G[M],id[M];
void DFS1(int u){
dfn[u]=++dfc;d[u]=d[f[u]]+1;siz[u]=1;
for(int&v:G[u]){
DFS1(v);siz[u]+=siz[v];
if(siz[v]>siz[son[u]])son[u]=v;
}
}
void DFS2(int u,int tp){
top[u]=tp;if(!son[u])return;DFS2(son[u],tp);
for(int&v:G[u])if(v!=son[u])DFS2(v,v);
}
inline int LCA(int u,int v){
while(top[u]^top[v]){
if(d[top[u]]>d[top[v]])u=f[top[u]];
else v=f[top[v]];
}
return d[u]>d[v]?v:u;
}
inline int dis(const int&u,const int&v){
return d[u]+d[v]-(d[LCA(u,v)]<<1)+1;
}
inline void Add(int x,const int&val){
for(;x<=n;x+=1<<__builtin_ctz(x))BIT[x]+=val;
}
inline int Query(int x){
int ans=0;
for(;x>=1;x-=1<<__builtin_ctz(x))ans+=BIT[x];
return ans;
}
inline int Q(const int&x,const int&y){
int lca=LCA(x,y);
return Query(dfn[x])+Query(dfn[y])-Query(dfn[lca])-Query(dfn[f[lca]]);
}
signed main(){
register int i,k;
scanf("%d",&n);
for(i=1;i<=n;++i)scanf("%d",f+i),G[f[i]].push_back(i);
for(i=1;f[i];i=f[i]);
DFS1(i);DFS2(i,i);
scanf("%d",&m);
for(i=1;i<=m;++i){
scanf("%d",opt+i);
if(opt[i]==1){
scanf("%d%d%d",x+i,y+i,&k);
if(k<i)id[i-k-1].push_back(i);
}
if(opt[i]==2){
scanf("%d",x+i);
}
}
for(i=1;i<=m;++i){
if(opt[i]==2){
Add(dfn[x[i]],1);Add(dfn[x[i]]+siz[x[i]],-1);
}
for(int&v:id[i])ans[v]=Q(x[v],y[v]);
if(opt[i]==1){
printf("%d %d\n",dis(x[i],y[i]),ans[i]);
}
}
}
LGP4216题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- 浮动float、浮动影响和清除浮动
普通流(normal flow) 这个单词很多人翻译为 文档流 , 字面翻译 普通流 或者标准流都可以. 前面我们说过,网页布局的核心,就是用CSS来摆放盒子位置.如何把盒子摆放到合适的位置? CSS ...
- 基于Apache的Tomcat负载均衡和集群(2)
反向代理负载均衡 (Apache+JK+Tomcat) 使用代理服务器可以将请求转发给内部的Web服务器,让代理服务器将请求均匀地转发给多台内部Web服务器之一上,从而达到负载均衡的目的.这种代理方式 ...
- MySQL 索引、事务与存储引擎
MySQL 索引.事务与存储引擎 1.索引 2.事务 3.存储引擎 1.索引: 索引的概念 : 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址 ...
- 强化学习中REIINFORCE算法和AC算法在算法理论和实际代码设计中的区别
背景就不介绍了,REINFORCE算法和AC算法是强化学习中基于策略这类的基础算法,这两个算法的算法描述(伪代码)参见Sutton的reinforcement introduction(2nd). A ...
- 【CF888G】Xor-MST(生成树 Trie)
题目链接 大意 给出\(N\)个点的点权,定义两个点之间的边权为这两个点权的异或和,求这\(N\)个点间的最小生成树. 思路 贪心地想,相连的两个点异或和应当尽量的小. 那么应先从高位确定,因为高位的 ...
- Solution -「CF 1375G」Tree Modification
\(\mathcal{Description}\) Link. 给定一棵 \(n\) 个结点的树,每次操作选择三个结点 \(a,b,c\),满足 \((a,b),(b,c)\in E\),并令 ...
- 前端程序员初步认识 docker
初步认识 docker 为什么要学习 docker 有同学说他开发工作中有两大神器,一个是 vim 编辑器,另一个就是 Docker. 什么是 docker Docker 是一个开源的应用容器引擎. ...
- CentOS8 固定IP无法访问外网问题解决(ping: www.hao123.com: Name or service not known)
CentOS8虚拟机用了一段时间后,需要安装telnet-server服务,却无法正常安装.之前安装ftp服务是没有问题的,安装问题如下: 错误提示,无法下载相关元数据:网上也是0.0B/s.那么可能 ...
- 📚 选择排序和插入排序区别-DS笔记
选择排序法 A[i...n)未排序,A[0...i)已排序 A[i...n]中最小值要放到A[i]的位置 复杂度 \(O(n^2)\) 第一层循环n次 第二层循环:i=0,n次:i=1,n-1次... ...
- C#淘汰的知识点
.NET 5+ 中已过时的功能 数组淘汰 .NET Framework 2以上的版本中,ArrayList可以说已经被淘汰了,应该用泛型类中的List<T> https://www.cnb ...