【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;
}
转载于:https://www.cnblogs.com/CQzhangyu/p/6296432.html
【BZOJ3772】精神污染 DFS序+主席树相关推荐
- 洛谷 - P3899 [湖南集训]谈笑风生(dfs序+主席树/二维数点)
题目链接:点击查看 题目大意:设 TTT 为一棵有根树,我们做如下的定义: 设 aaa 和 bbb 为 TTT 中的两个不同节点.如果 aaa 是 bbb 的祖先,那么称"aaa 比 bbb ...
- 洛谷 - P4197 Peaks(Kruskal重构树+dfs序+主席树)
题目链接:点击查看 题目大意:有 n 座山峰,每座山峰有他的高度 h[ i ] ,有些山峰之间有双向道路相连,共 m 条路径,每条路径有一个困难值,这个值越大表示越难走. 现在有 q 组询问,每组询问 ...
- nowcoder172C 保护 (倍增lca+dfs序+主席树)
https://www.nowcoder.com/acm/contest/172/C (sbw大佬太强啦 orz) 先把每一个路径(x,y)分成(x,lca),(y,lca)两个路径,然后就能发现,对 ...
- 【BZOJ3439】Kpm的MC密码,trie树+dfs序+主席树
Time:2016.05.07 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 1.have a trie,还得是倒着建的,记录每个结尾节点的id(可能会有重复,所以开一个vecto ...
- 2021牛客多校7 - xay loves trees(dfs序+主席树-标记永久化)
题目链接:点击查看 题目大意:给出两棵以点 111 为根节点的有根树,现在要求满足条件的最大集合: 在第一棵树中,集合内的任意两个点都必须满足祖先关系,即 uuu 是 vvv 的祖先或 vvv 是 u ...
- 2021牛客暑期多校训练营7 xay loves trees dfs序 + 主席树
传送门 文章目录 题意: 思路: 题意: 给你两棵树,让你在第一棵树选一条最长的深度递增的链,链上每一个点在第二棵树上都不互为祖先. n≤3e5n\le3e5n≤3e5 思路: 之前做过差不多的题传送 ...
- [BZOJ3772]精神污染
[BZOJ3772]精神污染 试题描述 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于 ...
- New Year Tree(dfs序+线段树+二进制)
题意: 给出一棵 n个节点的树,根节点为 1.每个节点上有一种颜色 ci.m次操作.操作有两种: 1 u c:将以 u为根的子树上的所有节点的颜色改为c. 2 u:询问以 u为根的子树上的所有节点的颜 ...
- 求和(dfs序+线段树)
题意: 已知有n个节点,有n−1条边,形成一个树的结构. 给定一个根节点k,每个节点都有一个权值,节点i的权值为vi. 给m个操作,操作有两种类型: 1 a x :表示将节点a的权值加上x 2 a ...
- 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树
题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...
最新文章
- DNS服务,A记录,URL转发,MX记录,NS记录,CNAME记录,解释与设置教
- linux下 SCP 、ssh、ssh-copy-id采用非默认端口传输
- 打开 XP Pro SP2 远程桌面的多用户支持
- 使用BAPI_CONTRACT_CREATE创建采购合同框架协议
- Oracle DBA之配置静态监听(listener registered statically)
- 实验图文详解——apache的编译安装及httpd服务开机自启
- java 队列和堆栈_Java中的堆栈和队列
- php file del 方法,php怎么遍历文件删除指定字符
- LeetCode 链表的插入排序
- [BZOJ]5018: [Snoi2017]英雄联盟 DP
- 使用ISA Server保护内部的web服务器
- Theano at a Glance
- Google推出中文图书搜索简体中文试用版(zz)
- 万年历的c语言程序代码含节假日,用C语言编写的万年历程序代码
- Spark中广播变量(boardcast)的使用
- 中文字体设置fontFamily无效
- Java程序包不存在问题的解决办法
- visual assist 小番茄常用设置
- postman怎么传对象list_使用Postman传对象中包含map、list参数
- 《港囧》徐峥:不会互联网思维的导演不是好产品经理