【bzoj3772】精神污染
Description
Input
Output
Sample Input
1 2
2 3
3 4
2 5
3 5
2 5
1 4
Sample Output
样例解释
可以选择的路径对有(1,2),(1,3),(2,3),只有路径1完全覆盖路径2。
题目大意:
一棵n个节点的树上有m条路径,求所有路径覆盖其他路径之和。
题解:
纱布出题人卡我内存。
设路径的两个端点为第一、二关键字,即x,y,考虑某条边i覆盖另外一条边j的条件,i的第一关键字在j第一关键字子树中,第二关键字同理,即j的第一关键字在i的第一关键字到lca(i.x,i.y)路径,j的第二关键字在i.x到lca或i.y到lca之间,用树上查分的思想,就是满足第一关键字在i.x到根或i.y的路径上,第二关键字在lca(i.x,i.y)到i.x,i.y之间的总数减去第一关键字在lca以及lca的父亲节点到根节点的路径,第二关键字同上的边。
然后在树上每个节点开一颗主席树,记录所有第一关键字在当前节点到根节点路径上的边的第二关键字的分布情况,这个分布情况也要满足可以查分,显然用欧拉括号序即可。
然后。。。千万不要给root【0】建一个空树。。。。。。
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int N=;
inline int read();
int n,m;
struct edges{
int v;int last;
}edge[N<<];int head[N] ,cnt;
inline void add_edge(int u,int v){
edge[++cnt].v=v;
edge[cnt].last=head[u];
head[u]=cnt;
}
int beg[N],end[N],deep[N];
int f[N][];
void dfs(int x){
beg[x]=++cnt;
for(int i=;(<<i)<=deep[x];i++)
f[x][i]=f[f[x][i-]][i-];
for(int i=head[x];i;i=edge[i].last){
if(f[x][]!=edge[i].v){
deep[edge[i].v]
=deep[x]+;
f[edge[i].v][]=x;
dfs(edge[i].v);
}
}
end[x]=++cnt;
}
inline int lca(int x,int y){
if(deep[x]<deep[y]) swap(x,y);
int t=deep[x]-deep[y];
for(int i=;t;i++)
if((<<i)&t)
t^=(<<i),x=f[x][i];
if(x!=y){
for(int i=;i>=;i--)
if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
x=f[x][];
}
return x;
}
//LCA************************************************
struct lines{
int v,last;
}line[N];int last[N], Cnt;
inline void add_line(int u,int v){
line[++Cnt].v=v;line[Cnt].last=last[u];
last[u]=Cnt;
}
//************************************************
struct Tree{
Tree *lc,*rc;int sum;
}*root[N*],tree[N*];int num;
inline int query (Tree *u,Tree *v,Tree *Lca,Tree *Lca_f,int x,int y,int L,int R){
if(x<=L&&R<=y) return u->sum+v->sum-Lca->sum-Lca_f->sum;
int mid=L+R>>;
int sum=;
if(y>mid) sum+=query(u->rc,v->rc,Lca->rc,Lca_f->rc,x,y,mid+,R);
if(x<=mid) sum+=query(u->lc,v->lc,Lca->lc,Lca_f->lc,x,y,L,mid);
return sum;
}
void build(Tree *&u,int l,int r){
u=tree+num;
u->sum=;
if(l==r){return ;}
int mid=l+r>>;
build(u->lc,l,mid);
build(u->rc,mid+,r);
}
void update(Tree *&u,Tree *p,int l,int r,int op,int w){
tree[++num]=*p;
u=tree+num;
u->sum+=w;
if(l==r) return ;
int mid=l+r>>;
if(op>mid) update(u->rc,p->rc,mid+,r,op,w);
else update(u->lc,p->lc,l,mid,op,w);
}
int tot;
void dfs_make(int x){
root[x]=root[f[x][]];
for(int i=last[x];i;i=line[i].last){
update(root[x],root[x],,cnt,beg[line[i].v],);
update(root[x],root[x],,cnt,end[line[i].v],-);
}
for(int i=head[x];i;i=edge[i].last){
if(f[x][]!=edge[i].v)
dfs_make(edge[i].v);
}
}
inline ll gcd(ll a,ll b){
return b==?a:gcd(b,a%b);
}
int main(){
n=read(),m=read();
for(int i=,u,v;i<n;i++){
u=read(),v=read();
add_edge(u,v);add_edge(v,u);
}
cnt=;
dfs();
build(root[],,cnt);
for(int i=,a,b;i<=m;i++){
a=read(),b=read();
add_line(a,b);
}
dfs_make();
ll ans=;
for(int i=;i<=n;i++) for(int j=last[i];j;j=line[j].last){ int u=i,v=line[j].v;
int Lca=lca(u,v);
ans+=query(root[u],root[v],root[Lca],root[f[Lca][]],beg[Lca],beg[u],,cnt)
+query(root[u],root[v],root[Lca],root[f[Lca][]],beg[Lca],beg[v],,cnt)
-query(root[u],root[v],root[Lca],root[f[Lca][]],beg[Lca],beg[Lca],,cnt);
ans--; }
ll aaa=(ll)(m)*(ll)(m-)/;
ll t=gcd(ans,aaa);
printf("%lld/%lld\n",ans/(int )t,aaa/t);
}
inline int read(){
int s=,f=;char ch=getchar();
for(;ch<''||ch>'';ch=getchar())if(ch=='-')f=-;
for(;ch>=''&&ch<='';ch=getchar())s=s*+(ch^);
return s*f;
}
【bzoj3772】精神污染的更多相关文章
- BZOJ3772: 精神污染
Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区, ...
- BZOJ3772精神污染——可持久化线段树+出栈入栈序
题目描述 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户 ...
- [BZOJ3772]精神污染 主席树上树+欧拉序
3772: 精神污染 Time Limit: 10 Sec Memory Limit: 64 MB Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位 ...
- BZOJ3772 精神污染 【主席树 + dfs序】
题目 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户,海 ...
- BZOJ3772精神污染&BZOJ3488&luogu3242接水果
LINK1:精神污染 LINK2:[ONTAK2010Highways](http://www.lydsy.com/JudgeOnline/problem.php?id=3488) LINK3:[接水 ...
- BZOJ3772 精神污染 主席树 dfs序
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3772 题意概括 给出一个树,共n个节点. 有m条互不相同的树上路径. 现在让你随机选择2条路径,问 ...
- BZOJ3772精神污染
参见http://blog.csdn.net/popoqqq/article/details/43122821 #include<bits/stdc++.h> using namespac ...
- bzoj3772 精神污染 dfs 序+主席树
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3772 题解 很简单的一道题目. 上午研究一个题目的时候发现了这个题目是一个弱化版,所以来写了一 ...
- 【BZOJ3772】精神污染 DFS序+主席树
[BZOJ3772]精神污染 Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是 ...
随机推荐
- 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)
编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...
- Django 模型和数据库 总结
模型和数据库 模型 首先我们在创建一个model的时候,这个类都是继承自 django.db.models.Model, 各种Model Field类型 AutoField,自动增长的IntegerF ...
- Win10 & Linux Docker 安装使用
Docker最近推出了可以运行在Win10和Mac上的稳定版本,让我们赶紧来体验一下. 一.Windows Docker 安装 1.安装 需要的条件为: 64bit Windows 10,开启Hype ...
- windbg工具安装配置及dump抓取
安装与配置windbg 安装与配置windbg的symbol(符号) 第一步 下载WinDBG, 第二步 双击下载的文件安装windbg.安装时注意记住安装到那里了. 第三步 windbg访问符号需要 ...
- solr 搜索引擎查询
搜索引擎查询的时候://对于这些filterQuery的字段,必须是indexed="true",如果之前有这个字段后来改这个indexed属性,则需要重新建立索引,否则搜索不到S ...
- 新安装mysql 第三方工具连接不上问题
Mysql从客户端连接服务器连不上的问题 公司要用Mysql做一个测试,开始在自己的本地建一个Mysql数据库自己本地的程序再连上去,没有遇到过连接不上的问题.这次数据库在服务器上,从本地客户端连 ...
- Ionic 常用组件解析
Ionic 常用组件解析 $ionicModal(弹出窗口): //创建一个窗口 //此处注意目录的起始位置为app $ionicModal.fromTemplateUrl('app/security ...
- VMware中Mac OS中显示共享文件夹的方法
在finder 偏好设置里的通用标签下,勾选 “已连接的服务器”
- accp8.0转换教材第8章JavaScript对象及初识面向对象理解与练习
JavaScript数据类型,对象,构造函数,原型对象,初识原型链,对象继承 一.单词部分 ①object父类②constructor构造函数③instance实例④call调用 ⑤apply应用⑥c ...
- 不错的 HttpHelper类 c#
/// <summary>/// 类说明:HttpHelper类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理/// 重要提示: ...