[BZOJ3772]精神污染(主席树+链剖)

BZOJ 3772 精神污染 可持久化线段树 题目大意:给定一棵树和树上的m条路径,求这m条路径中任选两条不同的路径时其中一条包含另一条的概率是多少 这题还真是精神污染- - 首先一个显而易见的结论就是如果路径A包含于路径B 那么就有A的两端点在路径B上 这是个充要条件 于是我们对于每个A路径的两段点x和y,将x开一个vector,把y存进去 这样对于每个B路径 我们要找的就是B路径上的所有点在vector中有多少出边也在这条B路径上 阅读详情

=== ===

这里放传送门

=== ===

题解

显然它要求的概率就是一条路径能覆盖另一条路径的对数除以总的路径对数。那么关键就是对于每一条路径,要么求出它能覆盖多少条路径,要么求出多少条路径能覆盖它。

实际上这两种做法都是可以的。如果是求多少条路径能覆盖它的话就是用dfs序+主席树,但是需要一些麻烦的分类讨论。如果是对于每一条路径求它能覆盖多少条路径的话就好像会简单一些。。因为如果路径A覆盖了路径B,那么路径B的起点和终点肯定都在A上。

对于这种两重限制的东西就可以试着用主席树来解决,因为主席树记录根节点的root数组可以搞一个限制,内层线段树还可以搞一个限制。这里的每一重限制因为都是路径上的,所以需要用树上主席树来搞。那么只需要用root[i]记录起点在i到根的路径上的所有路径信息,内层线段树记录这些路径的终点位置。查询的时候因为要查询终点在某一段路径上的路径个数,所以用链剖查一下就可以了。那么也就是要注意在加入某个路径的时候都要按照dfs序加。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#define Pow 17
using namespace std;
int n,m,p[100010],a[200010],nxt[200010],root[100010],cnt,tot,w[100010],num[100010],fa[100010];
int size[100010],son[100010],top[100010],deep[100010];
int f[100010][20];
long long ans,sum,g;
struct path{
    int x,y;
}e[100010];
struct segtree{
    int l,r,val;
}t[2000010];
int comp(path a,path b){return w[a.x]<w[b.x];}
void add(int x,int y){
    tot++;a[tot]=y;nxt[tot]=p[x];p[x]=tot;
}
long long gcd(long long a,long long b){
    long long r=a%b;
    while (r!=0){a=b;b=r;r=a%b;}
    return b;
}
void dfs(int u){
    deep[u]=deep[fa[u]]+1;
    for (int i=1;i<=Pow;i++)
      f[u][i]=f[f[u][i-1]][i-1];
    size[u]=1;son[u]=0;
    for (int i=p[u];i!=0;i=nxt[i])
      if (a[i]!=fa[u]){
          fa[a[i]]=u;f[a[i]][0]=u;
          dfs(a[i]);
          size[u]+=size[a[i]];
          if (size[a[i]]>size[son[u]])
            son[u]=a[i];
      }
}
void dfs_again(int u,int tp){
    top[u]=tp;w[u]=++cnt;
    num[cnt]=u;
    if (son[u]!=0) dfs_again(son[u],tp);
    for (int i=p[u];i!=0;i=nxt[i])
      if (a[i]!=fa[u]&&a[i]!=son[u])
        dfs_again(a[i],a[i]);
}
int find_lca(int x,int y){
    if (deep[x]!=deep[y]){
        if (deep[x]<deep[y]) swap(x,y);
        for (int i=Pow;i>=0;i--)
          if (deep[f[x][i]]>=deep[y])
            x=f[x][i];
    }
    for (int i=Pow;i>=0;i--)
      if (f[x][i]!=f[y][i]){
          x=f[x][i];y=f[y][i];
      }
    while (x!=y){x=f[x][0];y=f[y][0];}
    return x;
}
void insert(int &i,int j,int l,int r,int x,int fir){
    if (i<fir||fir==-1){i=++cnt;t[i]=t[j];}
    t[i].val++;
    if (l==r) return;
    int mid=(l+r)>>1;
    if (x<=mid) insert(t[i].l,t[j].l,l,mid,x,fir);
    else insert(t[i].r,t[j].r,mid+1,r,x,fir);
}
long long ask(int i,int j,int lc,int fl,int l,int r,int left,int right){
    if (left<=l&&right>=r)
      return t[i].val+t[j].val-t[lc].val-t[fl].val;
    int mid=(l+r)>>1,ans=0;
    if (left<=mid) ans+=ask(t[i].l,t[j].l,t[lc].l,t[fl].l,l,mid,left,right);
    if (right>mid) ans+=ask(t[i].r,t[j].r,t[lc].r,t[fl].r,mid+1,r,left,right);
    return ans;
}
long long Query(int x,int y,int lca){
    long long ans=0,X=x,Y=y;
    while (top[x]!=top[y]){
        if (deep[top[x]]<deep[top[y]]) swap(x,y);
        ans+=ask(root[X],root[Y],root[lca],root[fa[lca]],1,n,w[top[x]],w[x]);
        x=fa[top[x]];
    }
    if (deep[x]>deep[y]) swap(x,y);
    ans+=ask(root[X],root[Y],root[lca],root[fa[lca]],1,n,w[x],w[y]);
    return ans;
}
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<n;i++){
        int x,y;scanf("%d%d",&x,&y);
        add(x,y);add(y,x);
    }
    dfs(1);dfs_again(1,1);
    for (int i=1;i<=m;i++)
      scanf("%d%d",&e[i].x,&e[i].y);
    sort(e+1,e+m+1,comp);cnt=0;
    for (int i=1,ptr=1;i<=n;i++){
        int v=num[i],last=ptr;
        if (e[ptr].x!=v){root[v]=root[fa[v]];continue;}
        while (ptr<=m&&e[ptr].x==v) ++ptr;//定位起点在当前点的路径
        insert(root[v],root[fa[v]],1,n,w[e[last].y],-1);//把第一条路径加进去
        for (int j=last+1;j<ptr;j++)
          insert(root[v],root[fa[v]],1,n,w[e[j].y],root[v]);
    }
    for (int i=1;i<=m;i++){
        int lca=find_lca(e[i].x,e[i].y);
        ans+=Query(e[i].x,e[i].y,lca)-1;
    }
    sum=(long long)m*(m-1)/2;
    g=gcd(ans,sum);
    ans/=g;sum/=g;
    printf("%I64d/%I64d\n",ans,sum);
    return 0;
}
【UE5】【蓝图】 LevelSequence 动画播放与暂停 最近有些工作,在研究UE5 蓝图的LevelSequence,来制作一些简单动画。做个笔记,记录一下动画更换绑定actor的操作,以及动画播放后如何暂停和继续。 阅读详情

相关推荐

5分钟搞懂SCMA:稀疏码多址接入的核心原理与实战应用

本文深入浅出地解析了SCMA(稀疏码多址接入)的核心原理与实战应用。通过对比传统正交多址技术,阐释了SCMA如何通过非正交叠加和稀疏码本设计,实现远超资源单元数的用户接入,从而有效应对5G海量机器通信(mMTC)的挑战。文章还探讨了其在上行海量连接、免授权接入等场景的应用潜力及工程实现中的关键考量。

zeta9的博客 264

BZOJ[3772]精神污染 二维数点

BZOJ[3772]精神污染 本题就是求每条路径被多少条路径所覆盖(也可以求覆盖了多少条路径)。 我们对于一条路径,分析怎样的路径可以覆盖它。 假设路径A的两个端点为x,y,路径B的两个端点为a,b。(Dfn[a]&lt;Dfn[b] and Dfn[x]&lt;Dfn[y]Dfn[a]&lt;Dfn[b]\ and\ Dfn[x]&lt;Dfn...

Loging的博客 534

从零开始:如何利用Device Monitoring Studio构建高效数据监控系统

本文详细介绍了如何利用HHD Device Monitoring Studio从零开始构建高效数据监控系统。涵盖基础架构设计、核心功能解析、实战部署指南及高级数据分析技术,帮助用户实现非侵入式监控,提升设备调试和网络协议分析效率。特别适合物联网和工业自动化领域的开发者与运维人员。

weixin_29201859的博客 329

线段树:【bzoj3772】

Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户,海陆空交通设施发达。濑户内海沿岸气候温暖,多晴天,有日本少见的贸易良港神户港所在的神户市和曾是豪族城邑“城下町”的姬路市等大城市,还有以疗养地而闻名的六甲山地等。 兵库县官方也

NOI2015的专栏 691

深入解析STM32F40x CAN控制器的配置与优化

本文深入解析STM32F40x CAN控制器的配置与优化,涵盖基础工作模式、波特率计算、筛选器配置及中断管理等关键技术。通过实战案例和代码示例,帮助开发者高效配置CAN通信,提升工业控制系统的稳定性和性能。

weixin_26834815的博客 222

LaTeX小白必看:TeX Live+TeXstudio保姆级安装教程(附清华镜像加速)

本文为LaTeX新手提供了一份详尽的TeX Live和TeXstudio安装指南。通过清华大学镜像站实现高速下载,并详细讲解了从下载、定制化安装到配置优化的每一步,帮助用户快速搭建稳定高效的本地LaTeX写作环境,轻松处理学术文档排版。

weixin_29214559的博客 413

BZOJ3772:精神污染

浅谈主席树:https://www.cnblogs.com/AKMer/p/9956734.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3772 简化题意就是求\(\sum\)覆盖路径\(i\)的路径条数。 假设路径\(i\)的两个端点是\(u\),\(v\),两个点的最近公共祖先是\(lca\)。 假如\(lc...

aga28832的博客 2438

ThingsBoard 3.1.1版本在window本地运行之TB-Gateway服务搭建(三)

TB-gateway服务是TB不可或缺的部分,很多的协议都需要TB-gateway来做分类处理,今天我们就来做TB-Gateway服务搭建。

晚点遇见你,余生都是你! 2474

BZOJ 3772 精神污染 主席树+欧拉序

Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户,海陆空交通设施发达。濑户内海沿岸气候温暖,多晴天,有日本少见的贸易良港神户港所在的神户市和曾是豪族城邑“城下町”的姬路市等大城市,还有...

weixin_30599769的博客 207

【华为OD机试真题】4、字符统计及重排 | 机试真题+思路参考+代码解析(C++、Java、Py)

题目描述 >给出一个仅包含字母的字符串,不包含空格,统计字符串中各个字母(区分大小写)出现的次数, 并按照字母出现次数从大到小的顺序。输出各个字母及其出现次数。 如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前

KJ.JK 3289

【天气雷达】双偏振产品-差分反射率ZDR详解

双偏振产品-差分反射率ZDR详解。

珞瑜的博客 5408

【bzoj3772】 精神污染 dfs序+主席树

PoPoQQQ的题解太神了,表示看了好久才看懂,于是自己写了一份题解祸害人类。     首先有一个结论对于一条路径x-->y,如果它的两个端点x和y都在另一条路径上,则这条路径被另一条路径包含。     那么问题转化为了对于一条路径,判断两个端点都在这条路径上的路径有多少条。     那么对于每一个节点x,我们用一个vector来存节点y,当且仅当存在一条路径x-->y。     我们说主

Oxer的专栏 1701

FATFS挂载多个存储设备(2):功能配置及功能测试

本文介绍了基于FATFS文件系统实现多存储设备挂载的方法,包含底层设备驱动函数编写、功能配置、功能测试。

kevin1499的博客 2585

BZOJ3772精神污染

BZOJ3772精神污染 题面:权限题,去网上找题面吧。 解析 有两种思考方式:1.考虑每条路径分别被多少条路径覆盖。2.考虑每条路径分别覆盖了多少条路径。两种都简单的说一下吧。 1.可以发现覆盖路径(a,b)的路径两端必然在以a为根的子树和以b为根的子树即dfs序上连续的一段,否则也可以转化为两端。这样就可以用主席树,分别对每一条路径,在ai对应的线段树中插入bi,然后就在a这一端的线...

172

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

BZOJ_3772_精神污染_主席树

BZOJ_3772_精神污染_主席树 Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户,海陆空交通设施发达。濑户内海沿岸气候温暖,多晴天,有日本少见的贸易良港神户港所在的神户市和曾是豪族城邑“城下町”的姬路市等大城市...

198

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

[BZOJ3772]精神污染

Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户,海陆空交通设施发达。濑户内海沿岸气候温暖,多晴天,有日本少见的贸易良港神户港所在的神户市和曾是豪族城邑“城下町”的姬路市等大城市,还有以疗养地而闻名的六甲山地等。 兵库县官方...

a5163273的博客 235

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

BZOJ 3772: 精神污染(dfs序+主席树)

传送门 解题思路   比较神仙的一道题。首先计算答案时可以每条路径所包含的路径数,对于\(x,y\)这条路径,可以在\(x\)这处开个\(vector\)存\(y\),然后计算时只需要算这个路径上每个点的\(vector\)中的元素是否也在这条路径上。这个可以用主席树维护,主席树维护括号序列,进时\(+1\),出时\(-1\),然后加加减减算一下。这题卡空间。。 代码 #include<bi...

weixin_30613727的博客 111

【BZOJ】P3772 精神污染

DFS序+主席树 其实这还可以用树状数组搞的(伟大的XSH大佬提出的) But,本人苦调3个多小时,调不出来,最后无奈一查题解——woc,主席树! 暴力一发,A了。。。 那么来看看主席树是怎么PC过去的。 维护什么? 首先,想一下若路径A能被路径B包含,那么A的两端点就在路径B上。(无需讨论链和折线的情况) 那么,对于每个路径一端点开个vector,把另一端点加入其中。 然后,主席树上,我们就储...

weixin_30455661的博客 199

[BZOJ3772]精神污染(dfs序+主席树)

题目描述传送门题解对于每一条链计算能完全覆盖它的有多少条。 处理出来dfs序了之后,可以发现边大概分为三种情况:x和y的lca不是x和y中的某一个,x和y的lca是x或y,还有就是一条路径就是一个点。对于第一种情况,能覆盖它的路径一定是一个端点在x的子树里,一个端点在y的子树里。对于第二种情况,能覆盖它的路径一定是一个端点在y的子树里,另外一个端点在x的子树外。对于第三种情况,除了计算和第二种情况

zyf2000 1754

bzoj 3772: 精神污染 (主席树+dfs序)

3772: 精神污染 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 266  Solved: 72 [Submit][Status][Discuss] Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于

clover_hxy的博客 738

[BZOJ3772]精神污染(主席树)

这题还真是精神污染

薇小薇 662

bzoj3772: 精神污染

题面在这里题意:给出一个树,共n个节点。 有m条互不相同的树上路径。 现在让你随机选择2条路径,问两条路径存在包含关系的概率(输出最简分数)。 n,m<=100000做法:假如我们把所有路径存下来,对于x,y的一条路,在x处打一个y标记,在y处打一个x标记,那么我们查询的时候,只要查询x,y两侧分别有多少标记就可以了,因为x,y两侧的点形成的路径肯定包含x-y。再说得明白一点,就是假如你对每个

juruo? juruo! 640

bzoj 3772 精神污染 主席树

题面 题目传送门 解法 考虑怎样的两条路径会相交 假设某一条路径为(x,y)(x,y)(x,y) 如果(x,y)(x,y)(x,y)这条路径的某一个端点就是这两个点的lcalcalca,那么另一条路径的两个端点一定是一个在深度较大的子树里,另一个不在深度较小的点的子树里 如果(x,y)(x,y)(x,y)这条路径会经过lcalcalca,那么另一条路径的两个端点一定分别在xxx和y...

mysterynoip的博客 262

BZOJ3772 精神污染

标签:主席树,LCA题目题目传送门Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户,海陆空交通设施发达。濑户内海沿岸气候温暖,多晴天,有日本少见的贸易良港神户港所在的神户市和曾是豪族城邑“城下町”的姬路市等大城市,还有以疗养地而闻名的

Welcome to yjjr's blog! 1794

bzoj3772 精神污染(dfs序+主席树)

Description兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户,海陆空交通设施发达。濑户内海沿岸气候温暖,多晴天,有日本少见的贸易良港神户港所在的神户市和曾是豪族城邑“城下町”的姬路市等大城市,还有以疗养地而闻名的六甲山地等。 兵库县官方也大力发展旅...

Coco_T的博客 406

【BZOJ3772】精神污染 DFS序+主席树

【BZOJ3772】精神污染 Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户,海陆空交通设施发达。濑户内海沿岸气候温暖,多晴天,有日本少见的贸易良港神户港所在的神户市和曾是豪族城邑“城下町”的姬路市等大城市,还有以疗养地而闻...

weixin_30782331的博客 85
上一篇: [BZOJ3626][LNOI2014]LCA(离线+链剖)
下一篇: 同余方程组——中国剩余定理の板子
FromATP
博客等级 码龄10年 75粉丝 163原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值