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 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区, ...
随机推荐
- spark RDD 常见操作
fold 操作 区别 与 co 1.mapValus 2.flatMapValues 3.comineByKey 4.foldByKey 5.reduceByKey 6.groupByKey 7.so ...
- 移动端手势库hammerJS 2.0.4官方文档翻译(转)
hammerJS是一个优秀的.轻量级的触屏设备手势库,现在已经更新到2.04版本,跟1.0版本有点天壤地别了,毕竟改写了事件名并新增了许多方法,允许同时监听多个手势.自定义识别器,也可以识别滑动方向. ...
- VMware Linux 下 Nginx 安装配置 - Tomcat 配置 (二)
准备工作 相关浏览: VMware Linux 下 Nginx 安装配置 (一) 1. 选在 /usr/local/ 下创建 softs 文件夹,通过 ftp 命令 把 apache-tomcat-7 ...
- CS229 笔记07
CS229 笔记07 Optimal Margin Classifier 回顾SVM \[ \begin{eqnarray*} h_{w,b}&=&g(w^{\rm T}x+b)\\[ ...
- 第9月第12天 lua_push lua_to luaL_check stack quick
1. c代码中通过lua_push 把数据压入堆栈,lua调用c函数得到数据.luaL_check是对lua_to的封装,从堆栈中获取lua代码中函数调用的数据. static int lread(l ...
- 使用 jquery-autocomplete插件 完成文本框输入自动填充联想效果 解决兼容IE输入中文问题
项目中有时会用到ajax自动补全查询,就像Google的搜索框中那样,输入汉字或者字母的首个字母,则包含这个汉字或者字母的相关条目会显示出来供用户选择,该插件就是实现这样的功能的.autocomple ...
- CasperJS API介绍
一.使用标准JavaScript对象作为可选参数构造CasperJS实例 1 直接在create()函数里面使用 var casper = require('casper').create({ cli ...
- WPF的EventAggregator的发布和订阅
EventAggregator是Prism中专门处理ViewModel与ViewModel之间事件传递的类对象,它提供了针对事件的发布方法和订阅方法,所以可以非常方便的来管理事件.下面分几步来实现相关 ...
- linux使用badblocks命令扫描硬盘排除故障(待验证)
检查硬盘是否产生坏道并输出# badblocks -s -v -o /root/badblocks.log /dev/sda //公司操作 -s Show the p ...
- mysql及linux发行版下载源
MySQL国内镜像资源 搜狐开源镜像站:http://mirrors.sohu.com/ 国内开源镜像站点汇总 http://segmentfault.com/a/1190000000375848 ...