【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 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是 ...
随机推荐
- 使用ConfuserEx加密混淆程序以及如何脱壳反编译
一,准备如下工具: ConfuserEx.UnConfuserEx.Fixer.ConfuserExStringDecryptor.ConfuserExSwitchKiller.de4dot.ILSp ...
- arcgis api for js入门开发系列十一地图统计图
上一篇实现了demo的叠加SHP图层,本篇新增地图统计图,截图如下: 地图统计图实现的思路如下:利用拓展arcgis api的js文件(MapChartGraphic.js以及MapChartGrap ...
- 怀念Galois
我的第一篇谈到具体学科的博客,还是献给我最钟爱的数学. 个人比较喜欢离散数学,并非因为曲高和寡,而是因为数学分析.概率论.拓扑学.泛函之类的高手实在太多.而离散数学更为抽象,抽象到抽象代数直接以抽象二 ...
- js函数验证方式:验证是否是数字,支持小数,负数
验证 datatype="/^\d+(\.\d+)?$/" validatform验证是否是数字 支持小数点 datatype="d" 貌似支持小数 js函数验 ...
- 一些爬虫中的snippet
1.tornado 一个精简的异步爬虫(来自tornado的demo) #!/usr/bin/env python import time from datetime import timedelta ...
- 【LeetCode】160. Intersection of Two Linked Lists
题目: Write a program to find the node at which the intersection of two singly linked lists begins. Fo ...
- 【Android Developers Training】 94. 创建一个空内容提供器(Content Provider)
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- html路径问题
1.绝对路径 绝对路径是指文件在硬盘上真正存在的路径.例如"bg.jpg"这个图片是存放在硬盘的"E:\book\网页布局代码\第2章"目录下,那么 ...
- 微信小程序的开发环境搭建(Windows版本)
前言: 小程序是指微信公众平台小程序,小程序可以帮助开发者快速的开发小程序,小程序可以在微信内被便捷地获取和传播:是一种不需要下载安装即可使用的应用小程序,和原有的三种公众号是并行的体系.2017年1 ...
- servlet+jsp update修改页面的实现,整整搞了两个小时才搞定
package DAO; public class books { private int bid; private String bname; private int booksl; private ...