【BZOJ3772】精神污染 DFS序+主席树
【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。
HINT
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=100010;
int n,m,cnt,tot,nm;
long long ans,dev;
int to[maxn<<1],next[maxn<<1],head[maxn],qt[maxn],qn[maxn],qh[maxn],root[maxn<<1];
int size[maxn],top[maxn],fa[maxn],son[maxn],deep[maxn],Q[maxn<<1],qin[maxn],qout[maxn];
struct node
{
int sum,ls,rs;
}s[maxn*39];
int readin()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f;gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
void add(int a,int b)
{
to[cnt]=b;
next[cnt]=head[a];
head[a]=cnt++;
}
void dfs1(int x)
{
size[x]=1;
Q[++Q[0]]=x;
qin[x]=++nm;
for(int i=head[x];i!=-1;i=next[i])
{
if(to[i]!=fa[x])
{
fa[to[i]]=x;
deep[to[i]]=deep[x]+1;
dfs1(to[i]);
size[x]+=size[to[i]];
if(size[to[i]]>size[son[x]]) son[x]=to[i];
}
}
qout[x]=++nm;
}
void dfs2(int x,int tp)
{
top[x]=tp;
if(son[x]) dfs2(son[x],tp);
for(int i=head[x];i!=-1;i=next[i])
if(to[i]!=son[x]&&to[i]!=fa[x])
dfs2(to[i],to[i]);
}
int getlca(int x,int y)
{
while(top[x]!=top[y])
{
if(deep[top[x]]>deep[top[y]]) x=fa[top[x]];
else y=fa[top[y]];
}
if(deep[x]>deep[y]) return y;
return x;
}
void insert(int x,int &y,int l,int r,int pos,int val)
{
if(pos>r) return ;
y=++tot;
if(l==r)
{
s[y].sum=s[x].sum+val;
return ;
}
int mid=l+r>>1;
if(pos<=mid) s[y].rs=s[x].rs,insert(s[x].ls,s[y].ls,l,mid,pos,val);
else s[y].ls=s[x].ls,insert(s[x].rs,s[y].rs,mid+1,r,pos,val);
s[y].sum=s[s[y].ls].sum+s[s[y].rs].sum;
}
int query(int x1,int x2,int x3,int x4,int l,int r,int a,int b)
{
if(a<=l&&r<=b)
return s[x1].sum+s[x2].sum-s[x3].sum-s[x4].sum;
int mid=l+r>>1;
if(b<=mid)
return query(s[x1].ls,s[x2].ls,s[x3].ls,s[x4].ls,l,mid,a,b);
if(a>mid)
return query(s[x1].rs,s[x2].rs,s[x3].rs,s[x4].rs,mid+1,r,a,b);
return query(s[x1].ls,s[x2].ls,s[x3].ls,s[x4].ls,l,mid,a,b)+
query(s[x1].rs,s[x2].rs,s[x3].rs,s[x4].rs,mid+1,r,a,b);
}
long long gcd(long long a,long long b)
{
return (b==0)?a:gcd(b,a%b);
}
int main()
{
n=readin(),m=readin();
int i,j,a,b,c;
memset(head,-1,sizeof(head));
for(i=1;i<n;i++)
{
a=readin(),b=readin();
add(a,b),add(b,a);
}
deep[1]=1;
dfs1(1),dfs2(1,1);
for(i=1;i<=m;i++)
{
a=readin(),b=readin();
qt[i]=b;
qn[i]=qh[a];
qh[a]=i;
}
for(i=1;i<=n;i++)
{
a=Q[i];
root[a]=root[fa[a]];
for(j=qh[a];j;j=qn[j])
{
b=qt[j];
insert(root[a],root[a],1,nm,qin[b],1),insert(root[a],root[a],1,nm,qout[b],-1);
}
}
for(i=1;i<=n;i++)
{
a=i;
for(j=qh[a];j;j=qn[j])
{
b=qt[j];
c=getlca(a,b);
ans+=query(root[a],root[b],root[c],root[fa[c]],1,nm,qin[c],qin[a]);
ans+=query(root[a],root[b],root[c],root[fa[c]],1,nm,qin[c],qin[b]);
ans-=query(root[a],root[b],root[c],root[fa[c]],1,nm,qin[c],qin[c]);
ans--;
}
}
dev=(long long)m*(m-1)/2;
long long temp=gcd(ans,dev);
printf("%lld/%lld",ans/temp,dev/temp);
return 0;
}
【BZOJ3772】精神污染 DFS序+主席树的更多相关文章
- bzoj3772 精神污染 dfs 序+主席树
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3772 题解 很简单的一道题目. 上午研究一个题目的时候发现了这个题目是一个弱化版,所以来写了一 ...
- BZOJ 3772: 精神污染(dfs序+主席树)
传送门 解题思路 比较神仙的一道题.首先计算答案时可以每条路径所包含的路径数,对于\(x,y\)这条路径,可以在\(x\)这处开个\(vector\)存\(y\),然后计算时只需要算这个路径上每个点的 ...
- 2018.09.30 bzoj3551:Peaks加强版(dfs序+主席树+倍增+kruskal重构树)
传送门 一道考察比较全面的题. 这道题又用到了熟悉的kruskal+倍增来查找询问区间的方法. 查到询问的子树之后就可以用dfs序+主席树统计答案了. 代码: #include<bits/std ...
- dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448
4448: [Scoi2015]情报传递 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 588 Solved: 308[Submit][Status ...
- 【bzoj3545/bzoj3551】[ONTAK2010]Peaks/加强版 Kruskal+树上倍增+Dfs序+主席树
bzoj3545 题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询 ...
- 【bzoj1803】Spoj1487 Query on a tree III DFS序+主席树
题目描述 You are given a node-labeled rooted tree with n nodes. Define the query (x, k): Find the node w ...
- [xdoj1216]子树第k小(dfs序+主席树)
解题关键:dfs序将树映射到区间,然后主席树求区间第k小,为模板题. #pragma comment(linker, "/STACK:1024000000,1024000000") ...
- BZOJ 3439: Kpm的MC密码 (trie+dfs序主席树)
题意 略 分析 把串倒过来插进trietrietrie上, 那么一个串的kpmkpmkpm串就是这个串在trietrietrie上对应的结点的子树下面的所有字符串. 那么像 BZOJ 3551/354 ...
- 【bzoj3772】精神污染 STL+LCA+主席树
题目描述 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户 ...
随机推荐
- linux访问ftp服务器命令
在linux访问时输入 用户名 anonymous 密码直接回车可以匿名登录 如果传输非文本,先输入bianry,然后再get就可以了 比如 ftp> get 5-4.tif 227 Enter ...
- PHPstorm8 自动换行设置方法
PHPstorm是一款非常不错的PHP开发工具,有很多需要自己设置.比如,IDE常见的代码自动换行功能需要我们自己去配置才能实现. File -> Settings -> Editor ...
- Ubuntu之Docker安装
1.添加官方的GPG key到系统 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 2.添加D ...
- 最小顶点覆盖(Minimum Vertex Cover)与最大独立集(Maximum Independent Set)
问题描述:就是在图中找最小的点集,使得覆盖所有边. 和独立集等价:独立集问题:在图中找最大的点集,使得点集内的所有点互不相连. 引理:顶点覆盖集和独立集互补. 上面这个引理使得这两个问题可以相互规约, ...
- DexClassLoader
DexClassLoader加载自己写的第三方jar包,例如金山毒霸需要加载ksremote.jar. 现在将DexClassLoader加载jar包成果分享一下. 1.新建Android工程,封 ...
- erlang二进制的难理解的地方,有点神奇
40> <<A:16>> = <<1,2>>.<<1,2>>41> <<B:16/bits>> ...
- EF修改对象里面的值。。。(对象字段多的时候)
后台代码 public ActionResult Edit(my m)//my实体类 { testEntities t = new testEntities();//数据库上下文 t.my.Attac ...
- 【Java面试题】31 介绍Collection框架的结构
Collection:List列表,Set集 Map:Hashtable,HashMap,TreeMap Collection 是单列集合 List 元素是有序的.可重复 有序的 colle ...
- 网页中Span和Div的区别
它们被用来组合一大块的HTML代码并赋予一定的信息,大部分用类属性class和标识属性id与元素联系起来,见CSS中级指南的类和id选择符. span和div的不同之处在于span是内联的,用在一小块 ...
- yield的作用
执行程序遇到yield关键字会交出执行权,跳出协程方法,继续执行协程方法以外的其他代码逻辑,在约定的时间后,重新回到yield关键字处,继续执行yield语句后面的代码内容, yield return ...