BZOJ3772精神污染——可持久化线段树+出栈入栈序
题目描述
输入
输出
样例输入
1 2
2 3
3 4
2 5
3 5
2 5
1 4
样例输出
样例解释
可以选择的路径对有(1,2),(1,3),(2,3),只有路径1完全覆盖路径2。
提示
#include<map>
#include<set>
#include<queue>
#include<cmath>
#include<stack>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mid ((L+R)>>1)
using namespace std;
int x,y;
int n,m;
int cnt;
int num;
int tot;
int anc;
long long ans;
struct node
{
int x;
int y;
}q[100010];
int d[100010];
int in[100010];
int to[200010];
int l[4000010];
int r[4000010];
int out[100010];
int sum[4000010];
int next[200010];
int head[100010];
int root[100010];
int f[100010][18];
vector<int>v[100010];
bool cmp(node a,node b)
{
if(a.x==b.x)
{
return a.y<b.y;
}
return a.x<b.x;
}
void add(int x,int y)
{
tot++;
next[tot]=head[x];
head[x]=tot;
to[tot]=y;
}
long long gcd(long long x,long long y)
{
if(y==0)
{
return x;
}
return gcd(y,x%y);
}
int updata(int pre,int L,int R,int x,int k)
{
int rt=++cnt;
if(L==R)
{
sum[rt]=sum[pre]+k;
return rt;
}
l[rt]=l[pre];
r[rt]=r[pre];
if(x<=mid)
{
l[rt]=updata(l[pre],L,mid,x,k);
}
else
{
r[rt]=updata(r[pre],mid+1,R,x,k);
}
sum[rt]=sum[l[rt]]+sum[r[rt]];
return rt;
}
int query(int x,int y,int fa,int anc,int L,int R,int ll,int rr)
{
if(ll==L&&rr==R)
{
return sum[x]+sum[y]-sum[fa]-sum[anc];
}
if(ll>mid)
{
return query(r[x],r[y],r[fa],r[anc],mid+1,R,ll,rr);
}
else if(rr<=mid)
{
return query(l[x],l[y],l[fa],l[anc],L,mid,ll,rr);
}
else
{
return query(l[x],l[y],l[fa],l[anc],L,mid,ll,mid)+query(r[x],r[y],r[fa],r[anc],mid+1,R,mid+1,rr);
}
}
void dfs1(int x,int fa)
{
in[x]=++num;
f[x][0]=fa;
d[x]=d[fa]+1;
for(int i=1;i<=17;i++)
{
f[x][i]=f[f[x][i-1]][i-1];
}
for(int i=head[x];i;i=next[i])
{
if(to[i]!=fa)
{
dfs1(to[i],x);
}
}
out[x]=++num;
}
void dfs2(int x,int fa)
{
root[x]=root[fa];
int len=v[x].size();
for(int i=0;i<len;i++)
{
root[x]=updata(root[x],1,num,in[v[x][i]],1);
root[x]=updata(root[x],1,num,out[v[x][i]],-1);
}
for(int i=head[x];i;i=next[i])
{
if(to[i]!=fa)
{
dfs2(to[i],x);
}
}
}
int lca(int x,int y)
{
if(d[x]<d[y])
{
swap(x,y);
}
int dep=d[x]-d[y];
for(int i=0;i<=17;i++)
{
if(((1<<i)&dep))
{
x=f[x][i];
}
}
if(x==y)
{ return x;
}
for(int i=17;i>=0;i--)
{
if(f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
v[x].push_back(y);
q[i].x=x;
q[i].y=y;
}
dfs1(1,0);
dfs2(1,0);
sort(q+1,q+m+1,cmp);
for(int i=1;i<=m;i++)
{
x=q[i].x;
y=q[i].y;
anc=lca(x,y);
ans+=query(root[x],root[y],root[anc],root[f[anc][0]],1,num,in[anc],in[x]);
ans+=query(root[x],root[y],root[anc],root[f[anc][0]],1,num,in[anc],in[y]);
ans-=query(root[x],root[y],root[anc],root[f[anc][0]],1,num,in[anc],in[anc]);
ans--;
}
long long k=gcd(ans,1ll*m*(m-1)/2);
long long g=1ll*m*(m-1)/2/k;
ans/=k;
printf("%lld/",ans);
printf("%lld",g);
}
BZOJ3772精神污染——可持久化线段树+出栈入栈序的更多相关文章
- 【bzoj4826】[Hnoi2017]影魔 单调栈+可持久化线段树
题目描述 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵魂,都有着自己 ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
- 【BZOJ-2653】middle 可持久化线段树 + 二分
2653: middle Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1298 Solved: 734[Submit][Status][Discu ...
- 【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队
看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: #include<bits/stdc++.h&g ...
- 【BZOJ 3674】可持久化并查集加强版&【BZOJ 3673】可持久化并查集 by zky 用可持久化线段树破之
最后还是去掉异或顺手A了3673,,, 并查集其实就是fa数组,我们只需要维护这个fa数组,用可持久化线段树就行啦 1:判断是否属于同一集合,我加了路径压缩. 2:直接把跟的值指向root[k]的值破 ...
- BZOJ-3524 Couriers 可持久化线段树
可持久化线段树,其实就是类主席树了.. 3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1124 Sol ...
- 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665
如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...
- BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )
树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...
- HDU 5919 Sequence II(可持久化线段树)
[题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=5919 [题目大意] 给出一个数列,每次查询数列中,区间非重元素的下标的中位数.查询操作强制在线. [ ...
随机推荐
- 【Codeforces 696D】Legen...
Codeforces 696 D 题意:给\(n\)个串,每个串有一个权值\(a_i\),现在要构造一个长度为\(l\leq 10^{14}\)的串,如果其中包含了第\(i\)个串,则会得到\(a_i ...
- 如何在Virtual box 下安装Mac os
这几天,突然奇想,想要试一试Mac os ,毕竟是贵族系统,装完之后,确实感觉字体很不错. 其他更优秀的功能还没发现,不过,还是希望在这里做一个记录. 以下附录我参照的网址:https://blog ...
- Luogu3232 HNOI2013 游走 高斯消元、期望、贪心
传送门 这种无向图上从一个点乱走到另一个点的期望题目好几道与高斯消元有关 首先一个显然的贪心:期望经过次数越多,分配到的权值就要越小. 设$du_i$表示$i$的度,$f_i$表示点$i$的期望经过次 ...
- Maven私有仓库: 发布release版本报错:Return code is: 400, ReasonPhrase: Repository does not allow upd ating assets: maven-releases.
今天在将一个maven组件由SNAPSHORT升级为正式版本1.0.0,然后执行发布: mvn clean deploy -pl ielong-common -am -DskipTests, 报错:R ...
- ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十四节--后台工作者HangFire与ABP框架Abp.Hangfire及扩展
返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 HangFire与Quartz.NET相比主要是HangFire的内置提供集成化的控制台,方便后台查看及监控,对于 ...
- Docker环境编译时的错误记录
1)报错一docker-compose -f compose/app.yaml -f compose/backend.yaml -f compose/proxy.yaml build peatio b ...
- Gitlab环境快速部署(RPM包方式安装)
之前梳理了一篇Gitlab的安装CI持续集成系统环境---部署Gitlab环境完整记录,但是这是bitnami一键安装的,版本比较老.下面介绍使用rpm包安装Gitlab,下载地址:https://m ...
- restfull环境搭建-helloword(三)
原文地址:http://only81.iteye.com/blog/1689537 This section creates a CRUD (Create, Read, Update, Delete) ...
- Python数据类型-7
什么数据类型. int 1,2,3用于计算. bool:True,False,用户判断. str:存储少量数据,进行操作 'fjdsal' '二哥','`13243','fdshklj' '战三,李四 ...
- E. Train Hard, Win Easy
链接 [http://codeforces.com/contest/1043/problem/E] 题意 有n个人,每个人都有做出a,b题的分数,xi,yi,但是有些人是不能组队的,问你每个人和其他能 ...