【BZOJ3772】精神污染

Description

兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户,海陆空交通设施发达。濑户内海沿岸气候温暖,多晴天,有日本少见的贸易良港神户港所在的神户市和曾是豪族城邑“城下町”的姬路市等大城市,还有以疗养地而闻名的六甲山地等。
兵库县官方也大力发展旅游,为了方便,他们在县内的N个旅游景点上建立了n-1条观光道,构成了一棵图论中的树。同时他们推出了M条观光线路,每条线路由两个节点x和y指定,经过的旅游景点就是树上x到y的唯一路径上的点。保证一条路径只出现一次。
你和你的朋友打算前往兵库县旅游,但旅行社还没有告知你们最终选择的观光线路是哪一条(假设是线路A)。这时候你得到了一个消息:在兵库北有一群丧心病狂的香菜蜜,他们已经选定了一条观光线路(假设是线路B),对这条路线上的所有景点都释放了【精神污染】。这个计划还有可能影响其他的线路,比如有四个景点1-2-3-4,而【精神污染】的路径是1-4,那么1-3,2-4,1-2等路径也被视为被完全污染了。
现在你想知道的是,假设随便选择两条不同的路径A和B,存在一条路径使得如果这条路径被污染,另一条路径也被污染的概率。换句话说,一条路径被另一条路径包含的概率。

Input

第一行两个整数N,M
接下来N-1行,每行两个数a,b,表示A和B之间有一条观光道。
接下来M行,每行两个数x,y,表示一条旅游线路。

Output

所求的概率,以最简分数形式输出。

Sample Input

5 3
1 2
2 3
3 4
2 5
3 5
2 5
1 4

Sample Output

1/3
样例解释
可以选择的路径对有(1,2),(1,3),(2,3),只有路径1完全覆盖路径2。

HINT

100%的数据满足:N,M<=100000
(题意只有最后一句是有用的,其余都是废话。)
题解:理解一下:对于每一个询问x,y,将y的子树中的所有节点都加到x的子树中的所有线段树中去。
具体做法:离散化+DFS处理入栈出栈序+求LCA+主席树

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=100010;
int n,m,cnt,tot,nm;
long long ans,dev;
int to[maxn<<1],next[maxn<<1],head[maxn],qt[maxn],qn[maxn],qh[maxn],root[maxn<<1];
int size[maxn],top[maxn],fa[maxn],son[maxn],deep[maxn],Q[maxn<<1],qin[maxn],qout[maxn];
struct node
{int sum,ls,rs;
}s[maxn*39];
int readin()
{int ret=0,f=1;    char gc=getchar();while(gc<'0'||gc>'9')    {if(gc=='-')f=-f;gc=getchar();}while(gc>='0'&&gc<='9')    ret=ret*10+gc-'0',gc=getchar();return ret*f;
}
void add(int a,int b)
{to[cnt]=b;next[cnt]=head[a];head[a]=cnt++;
}
void dfs1(int x)
{size[x]=1;Q[++Q[0]]=x;qin[x]=++nm;for(int i=head[x];i!=-1;i=next[i]){if(to[i]!=fa[x]){fa[to[i]]=x;deep[to[i]]=deep[x]+1;dfs1(to[i]);size[x]+=size[to[i]];if(size[to[i]]>size[son[x]])    son[x]=to[i];}}qout[x]=++nm;
}
void dfs2(int x,int tp)
{top[x]=tp;if(son[x])    dfs2(son[x],tp);for(int i=head[x];i!=-1;i=next[i])if(to[i]!=son[x]&&to[i]!=fa[x])dfs2(to[i],to[i]);
}
int getlca(int x,int y)
{while(top[x]!=top[y]){if(deep[top[x]]>deep[top[y]])    x=fa[top[x]];else    y=fa[top[y]];}if(deep[x]>deep[y])    return y;return x;
}
void insert(int x,int &y,int l,int r,int pos,int val)
{if(pos>r)    return ;y=++tot;if(l==r){s[y].sum=s[x].sum+val;return ;}int mid=l+r>>1;if(pos<=mid)    s[y].rs=s[x].rs,insert(s[x].ls,s[y].ls,l,mid,pos,val);else    s[y].ls=s[x].ls,insert(s[x].rs,s[y].rs,mid+1,r,pos,val);s[y].sum=s[s[y].ls].sum+s[s[y].rs].sum;
}
int query(int x1,int x2,int x3,int x4,int l,int r,int a,int b)
{if(a<=l&&r<=b)return s[x1].sum+s[x2].sum-s[x3].sum-s[x4].sum;int mid=l+r>>1;if(b<=mid)return query(s[x1].ls,s[x2].ls,s[x3].ls,s[x4].ls,l,mid,a,b);if(a>mid)return query(s[x1].rs,s[x2].rs,s[x3].rs,s[x4].rs,mid+1,r,a,b);return query(s[x1].ls,s[x2].ls,s[x3].ls,s[x4].ls,l,mid,a,b)+query(s[x1].rs,s[x2].rs,s[x3].rs,s[x4].rs,mid+1,r,a,b);
}
long long gcd(long long a,long long b)
{return (b==0)?a:gcd(b,a%b);
}
int main()
{n=readin(),m=readin();int i,j,a,b,c;memset(head,-1,sizeof(head));for(i=1;i<n;i++){a=readin(),b=readin();add(a,b),add(b,a);}deep[1]=1;dfs1(1),dfs2(1,1);for(i=1;i<=m;i++){a=readin(),b=readin();qt[i]=b;qn[i]=qh[a];qh[a]=i;}for(i=1;i<=n;i++){a=Q[i];root[a]=root[fa[a]];for(j=qh[a];j;j=qn[j]){b=qt[j];insert(root[a],root[a],1,nm,qin[b],1),insert(root[a],root[a],1,nm,qout[b],-1);}}for(i=1;i<=n;i++){a=i;for(j=qh[a];j;j=qn[j]){b=qt[j];c=getlca(a,b);ans+=query(root[a],root[b],root[c],root[fa[c]],1,nm,qin[c],qin[a]);ans+=query(root[a],root[b],root[c],root[fa[c]],1,nm,qin[c],qin[b]);ans-=query(root[a],root[b],root[c],root[fa[c]],1,nm,qin[c],qin[c]);ans--;}}dev=(long long)m*(m-1)/2;long long temp=gcd(ans,dev);printf("%lld/%lld",ans/temp,dev/temp);return 0;
}

转载于:https://www.cnblogs.com/CQzhangyu/p/6296432.html

【BZOJ3772】精神污染 DFS序+主席树相关推荐

  1. 洛谷 - P3899 [湖南集训]谈笑风生(dfs序+主席树/二维数点)

    题目链接:点击查看 题目大意:设 TTT 为一棵有根树,我们做如下的定义: 设 aaa 和 bbb 为 TTT 中的两个不同节点.如果 aaa 是 bbb 的祖先,那么称"aaa 比 bbb ...

  2. 洛谷 - P4197 Peaks(Kruskal重构树+dfs序+主席树)

    题目链接:点击查看 题目大意:有 n 座山峰,每座山峰有他的高度 h[ i ] ,有些山峰之间有双向道路相连,共 m 条路径,每条路径有一个困难值,这个值越大表示越难走. 现在有 q 组询问,每组询问 ...

  3. nowcoder172C 保护 (倍增lca+dfs序+主席树)

    https://www.nowcoder.com/acm/contest/172/C (sbw大佬太强啦 orz) 先把每一个路径(x,y)分成(x,lca),(y,lca)两个路径,然后就能发现,对 ...

  4. 【BZOJ3439】Kpm的MC密码,trie树+dfs序+主席树

    Time:2016.05.07 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 1.have a trie,还得是倒着建的,记录每个结尾节点的id(可能会有重复,所以开一个vecto ...

  5. 2021牛客多校7 - xay loves trees(dfs序+主席树-标记永久化)

    题目链接:点击查看 题目大意:给出两棵以点 111 为根节点的有根树,现在要求满足条件的最大集合: 在第一棵树中,集合内的任意两个点都必须满足祖先关系,即 uuu 是 vvv 的祖先或 vvv 是 u ...

  6. 2021牛客暑期多校训练营7 xay loves trees dfs序 + 主席树

    传送门 文章目录 题意: 思路: 题意: 给你两棵树,让你在第一棵树选一条最长的深度递增的链,链上每一个点在第二棵树上都不互为祖先. n≤3e5n\le3e5n≤3e5 思路: 之前做过差不多的题传送 ...

  7. [BZOJ3772]精神污染

    [BZOJ3772]精神污染 试题描述 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于 ...

  8. New Year Tree(dfs序+线段树+二进制)

    题意: 给出一棵 n个节点的树,根节点为 1.每个节点上有一种颜色 ci.m次操作.操作有两种: 1 u c:将以 u为根的子树上的所有节点的颜色改为c. 2 u:询问以 u为根的子树上的所有节点的颜 ...

  9. 求和(dfs序+线段树)

    题意: 已知有n个节点,有n−1条边,形成一个树的结构. 给定一个根节点k,每个节点都有一个权值,节点i的权值为vi​. 给m个操作,操作有两种类型: 1 a x :表示将节点a的权值加上x 2 a ...

  10. 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树

    题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...

最新文章

  1. DNS服务,A记录,URL转发,MX记录,NS记录,CNAME记录,解释与设置教
  2. linux下 SCP 、ssh、ssh-copy-id采用非默认端口传输
  3. 打开 XP Pro SP2 远程桌面的多用户支持
  4. 使用BAPI_CONTRACT_CREATE创建采购合同框架协议
  5. Oracle DBA之配置静态监听(listener registered statically)
  6. 实验图文详解——apache的编译安装及httpd服务开机自启
  7. java 队列和堆栈_Java中的堆栈和队列
  8. php file del 方法,php怎么遍历文件删除指定字符
  9. LeetCode 链表的插入排序
  10. [BZOJ]5018: [Snoi2017]英雄联盟 DP
  11. 使用ISA Server保护内部的web服务器
  12. Theano at a Glance
  13. Google推出中文图书搜索简体中文试用版(zz)
  14. 万年历的c语言程序代码含节假日,用C语言编写的万年历程序代码
  15. Spark中广播变量(boardcast)的使用
  16. 中文字体设置fontFamily无效
  17. Java程序包不存在问题的解决办法
  18. visual assist 小番茄常用设置
  19. postman怎么传对象list_使用Postman传对象中包含map、list参数
  20. 《港囧》徐峥:不会互联网思维的导演不是好产品经理

热门文章

  1. 解决VIVADO ZYNQ编译提示PS引脚约束警告
  2. android 键盘遮挡
  3. 【cmd】cmd怎么到达指定的文件夹
  4. ZOJ 1789 The Suspects(经典并查集)
  5. Python中随机漫步的实现
  6. 如何制定项目PMO战略计划?
  7. 教资缴费显示内部服务器错误,中小学教师资格考试网上支付常见问题
  8. 皮皮虾vs最右短视频分析
  9. macOS上如何通过.crash文件定位崩溃地址
  10. LDC注册数据获取|ACE2004, ACE 2005,OntoNotes等数据