【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 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是 ...
随机推荐
- 360安全检测出的WordPress漏洞的修复方法
1.跨站脚本攻击(XSS) 这个漏洞注意是因为用户评论可以提交代码,有安全风险.虽然你的WordPress以及是最新版,但是你的WordPress主题却不一定跟着更新!因此,需要稍微修改一下评论相关的 ...
- java 单链表的实现
package liaobiao;//链表测试public class Node { private int value; private Node next; //存放下一个节点的指针 //构造方法 ...
- MySQL left join操作中 on与where放置条件的区别
优先级 两者放置相同条件,之所以可能会导致结果集不同,就是因为优先级.on的优先级是高于where的. 1 1 首先明确两个概念: LEFT JOIN 关键字会从左表 (table_name1) 那里 ...
- docker 初识之二(简单发布ASP.NET Core 网站)
在发布ASP.NET Core网站以前,先介绍一下DaoCloud 一个免费的docker云容器服务平台.登陆官方网站,创建一台docker主机,这台主机有120分钟的使用时间,对于鄙人学习使用正好合 ...
- Python Click 学习笔记(转)
原文链接:Python Click 学习笔记 Click 是 Flask 的团队 pallets 开发的优秀开源项目,它为命令行工具的开发封装了大量方法,使开发者只需要专注于功能实现.恰好我最近在开发 ...
- Kafka 源代码分析之Log
这里分析Log对象本身的源代码. Log类是一个topic分区的基础类.一个topic分区的所有基本管理动作.都在这个对象里完成.类源代码文件为Log.scala.在源代码log目录下. Log类是L ...
- html网页的兼容性和css优先级
网页不仅是在一个浏览器上显示的网页,也要多考虑其他浏览器的兼容性,火狐.谷歌.搜狗等浏览器总体来说,网页的变化不大,最主要的是还是IE浏览器. color:red\9; IE6 IE7 IE8 ...
- JAVAEE——SSH三大框架整合(spring+struts2+hibernate)
一.整合原理 二.导包(41个) 1.hibernate (1)hibernate/lib/required (2)hibernate/lib/jpa | java persist api java的 ...
- Python系列教程(一):简介
Python发展历史 起源 Python的作者,Guido von Rossum,荷兰人.1982年,Guido从阿姆斯特丹大学获得了数学和计算机硕士学位.然而,尽管他算得上是一位数学家,但他更加享受 ...
- CSS3-loading动画(二)
上次分享了四个CSS3的加载动画,今天继续(标题接上一次). 在线demo:http://liyunpei.xyz/loading.html (持续更新) 请注意:代码中的关键帧动画有的用的lin ...