BZOJ3772精神污染
参见http://blog.csdn.net/popoqqq/article/details/43122821
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+;
ll ans;int n,m,idx,cnt,head[N],tmp,rt[N],f[N][],d[N],in[N],out[N];
vector<int>p[N];
struct tree
{
int w,l,r;
}t[];
struct node
{
int x,y;
}q[N];
bool cmp(node a,node b)
{
return a.x==b.x?a.y<b.y:a.x<b.x;
}
struct edge
{
int to,nex;
}e[N<<];
void add(int x,int y)
{
e[++cnt].to=y;e[cnt].nex=head[x];head[x]=cnt;
}
void change(int &x,int y,int l,int r,int p,int w)
{
if(x==y||!x)x=++tmp,t[x]=t[y];
if(l==r){
t[x].w+=w;return;
}
int mid=l+r>>;
if(p<=mid)change(t[x].l,t[y].l,l,mid,p,w);
else change(t[x].r,t[y].r,mid+,r,p,w);
t[x].w=t[t[x].l].w+t[t[x].r].w;
}
void dfs(int x)
{
in[x]=++idx;
for(int i=;i<;++i)f[x][i]=f[f[x][i-]][i-];
for(int i=head[x];i;i=e[i].nex)
{
int y=e[i].to;
if(y==f[x][])continue;
d[y]=d[x]+;f[y][]=x;
dfs(y);
}
out[x]=++idx;
return;
}
void dfs2(int x)
{
for(int i=;i<p[x].size();++i)
{
change(rt[x],rt[f[x][]],,*n,in[p[x][i]],);
change(rt[x],rt[f[x][]],,*n,out[p[x][i]],-);
}
if(!p[x].size())rt[x]=rt[f[x][]];
for(int i=head[x];i;i=e[i].nex)
{
int y=e[i].to;
if(y==f[x][])continue;
dfs2(y);
}
}
int query(int rt1,int rt2,int rt3,int rt4,int l,int r,int L,int R)
{
if(l==L&&r==R)return t[rt1].w+t[rt2].w-t[rt3].w-t[rt4].w;//线段树动态开点
int mid=l+r>>;
if(R<=mid)return query(t[rt1].l,t[rt2].l,t[rt3].l,t[rt4].l,l,mid,L,R);
else if(L>mid)return query(t[rt1].r,t[rt2].r,t[rt3].r,t[rt4].r,mid+,r,L,R);
else return query(t[rt1].l,t[rt2].l,t[rt3].l,t[rt4].l,l,mid,L,mid)+query(t[rt1].r,t[rt2].r,t[rt3].r,t[rt4].r,mid+,r,mid+,R);
}
int lca(int x,int y)
{
if(d[x]<d[y])swap(x,y);
int tt=d[x]-d[y];
for(int i=;i<;++i)
if(tt&(<<i))x=f[x][i];
for(int i=;i>=;--i)
if(f[x][i]!=f[y][i])
{
x=f[x][i];y=f[y][i];
}
return x==y?x:f[x][];
}
ll gcd(ll a,ll b)
{
return b==?a:gcd(b,a%b);
}
int main()
{
scanf("%d%d",&n,&m);
int x,y,z;
for(int i=;i<n;++i)
{
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
for(int i=;i<=m;++i)
{
scanf("%d%d",&q[i].x,&q[i].y);
if(q[i].x>q[i].y)swap(q[i].x,q[i].y);
p[q[i].x].push_back(q[i].y);
}
dfs();dfs2();
for(int i=;i<=m;++i)
{
x=q[i].x,y=q[i].y,z=lca(x,y);
ans+=query(rt[x],rt[y],rt[z],rt[f[z][]],,*n,in[z],in[x]);
ans+=query(rt[x],rt[y],rt[z],rt[f[z][]],,*n,in[z],in[y]);
ans-=query(rt[x],rt[y],rt[z],rt[f[z][]],,*n,in[z],in[z]);
ans--;
}
sort(q+,q++m,cmp);
for(int i=,j=i+;i<=m;i=j,j=i+)
{
while(j<=m&&q[i].x==q[j].x&&q[i].y==q[j].y)++j;
ans-=1ll*(j-i)*(j-i-)/;
}
ll b=1ll*m*(m-)/,Gcd=gcd(ans,b);
printf("%lld/%lld\n",ans/Gcd,b/Gcd);
return ;
}
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 精神污染 dfs 序+主席树
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3772 题解 很简单的一道题目. 上午研究一个题目的时候发现了这个题目是一个弱化版,所以来写了一 ...
- 【BZOJ3772】精神污染 DFS序+主席树
[BZOJ3772]精神污染 Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是 ...
- 【bzoj3772】精神污染
Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区, ...
随机推荐
- css3 :nth-child()选择器的使用
一.nth-child() 1. nth-child(n):父元素下的第n个子元素,n>0,索引从1开始.不区分子元素类型. 2. nth-child(odd):父元素下的奇数子元素,等同于:n ...
- ORACLE递归查询(适用于ID,PARENTID结构数据表)
Oracle 树操作(select…start with…connect by…prior) oracle树查询的最重要的就是select…start with…connect by…prior语法了 ...
- AngularJS 启程二
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> ...
- Java Web之路(二)Servlet之HttpServletResponse和HttpServletRequest
HttpServletResponse 1.告诉服务器应用使用UTF-8解析文本的两种方式,告诉客户端要使用什么编码 response.setHeader("content-type&quo ...
- 获取SQL Server数据库中的表和字段描述
获取所有dbo表的扩展属性: SELECT * FROM fn_listextendedproperty (NULL, 'schema', 'dbo', 'table', default, NULL, ...
- Python核心编程——Chapter16
好吧,在拜读完<Python网络编程基础>之后,回头再搞一搞16章的网络编程吧. Let‘s go! 16.4.修改书上示例的TCP和UDP客户端,使得服务器的名字不要在代码里写死,要允许 ...
- 20155230 2016-2017-2 《Java程序设计》第五周学习总结
20155230 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 1.错误处理通常称为异常处理. 2.catch括号中列出的异常不得有继承关系,否则会发生编译 ...
- django错误笔记——1242 Subquery returns more than 1 row
在数据库查询操作过程中,子查询结果不唯一,导致外面的查询无法进行. 我的错误语句: rid = models.User.objects.filter(username=username).values ...
- c++刷题(39/100)笔试题3
题目1: 现在你需要用一台奇怪的打字机书写一封书信.信的每行只能容纳宽度为100的字符,也就是说如果写下某个字符会导致行宽超过100,那么就要另起一行书写 信的内容由a-z的26个小写字母构成,而每个 ...
- python中的 __repr__和__str__
__repr__,被内置函数repr用于把一个对象用"官方"的字符串形式表示出来(终端友好) 1.值传给eval()来返回一个对象的字符串表示形式 2.否则返回一个尖括 ...