【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 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是 ...
随机推荐
- python 标准库 -- requests
一. 安装 $ pip install requests requests 并不是python 标准库, 但为了汇总方便, 将其放置于此. 二. 用法 requests.get() : GET 请求 ...
- 2~62位任意进制转换(c++)
进制转换的符号表为[0-9a-zA-Z],共61个字符,最大可表示62进制. 思路是原进制先转换为10进制,再转换到目标进制. 疑问: 对于负数,有小伙伴说可以直接将符号丢弃,按照整数进行进位转换,最 ...
- Redis客户端管理工具,状态监控工具
TreeNMS是一款Redis web客户端管理工具,采用JAVA开发,实现基于web方式对Redis数据库进行管理.监控.数据维护. 功能包括:数据库的状态监控,库表的展示,key,value的展示 ...
- java中volatile不能保证线程安全
今天打了打代码研究了一下java的volatile关键字到底能不能保证线程安全,经过实践,volatile是不能保证线程安全的,它只是保证了数据的可见性,不会再缓存,每个线程都是从主存中读到的数据,而 ...
- (cljs/run-at (JSVM. :browser) "搭建刚好可用的开发环境!")
前言 书接上一回,在了解cljs基本语法后并在clojurescript.net的奇特错误提示后,我们必须痛定思痛地搭建一个本地的开发环境,以便后续深入地学习cljs. 现有的构建工具 由于浏览器 ...
- Mysql按时间段分组查询
Mysql按时间段分组查询来统计会员的个数,mysql个数 Mysql按时间段分组查询来统计会员的个数,mysql个数 1.使用case when方法(不建议使用)- 代码如下 复制代码SELECT ...
- Spring MVC 项目搭建 -1- 创建项目
Spring MVC 项目搭建 -1- 创建项目 1.创建 Dynamic Web project (SpringDemo),添加相关jar包 2.创建一个简单的controller类 package ...
- usaco training 4.2.3 Job Processing 题解
Job Processing题解 IOI'96 A factory is running a production line that requires two operations to be pe ...
- 学会git玩转github,结尾有惊喜!有惊喜!有惊喜!
一.什么是Github Github是全球最大的社交编程及代码托管网站(https://github.com/). Github可以托管各种git库,并提供一个web界面(用户名.github.io/ ...
- 缓动动画(json)
function animate(obj, json){ clearInterval(obj.timer); obj.timer=setInterval(function(){ var flag = ...