[BZOJ3772]精神污染 主席树上树+欧拉序
3772: 精神污染
Time Limit: 10 Sec Memory Limit: 64 MB
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 <algorithm>
#include <vector>
using namespace std;
typedef long long LL;
const int N=;
vector<int>vec[N];
int n,m,num,deep[N],adj[N],e,l[N],r[N];
struct edge{int zhong,next;}s[N<<];
inline void add(int qi,int zhong){s[++e].zhong=zhong;s[e].next=adj[qi];adj[qi]=e;}
struct data{int qi,zhong;}ro[N];
inline bool mt(const data &a,const data &b){return (a.qi==b.qi)?a.zhong<b.zhong:a.qi<b.qi;}
struct node
{
node *ch[];int cnt;
void* operator new (size_t,node *a,node *b,int c)
{
static node mempool[N*],*C=mempool;
C->ch[]=a,C->ch[]=b,C->cnt=c;
return C++;
}
node* insert(int l,int r,int pos,int val)
{
if(l==r)return new (NULL,NULL,this->cnt+val)node;
int mi=(l+r)>>;
if(pos<=mi) return new (ch[]->insert(l,mi,pos,val),ch[],this->cnt+val)node;
else return new (ch[],ch[]->insert(mi+,r,pos,val),this->cnt+val)node;
}
}*root[N];
int query(node *a,node *b,node *c,node *d,int le,int ri,int L,int R)
{
if(L<=le&&ri<=R)return a->cnt+b->cnt-c->cnt-d->cnt;
int ret=,mi=(le+ri)>>;
if(L<=mi)ret+=query(a->ch[],b->ch[],c->ch[],d->ch[],le,mi,L,R);
if(mi<R)ret+=query(a->ch[],b->ch[],c->ch[],d->ch[],mi+,ri,L,R);
return ret;
} int f[N][],bin[];
inline int LCA(int a,int b)
{
if(deep[a]<deep[b])swap(a,b);
int cha=deep[a]-deep[b];
for(int j=;~j;j--)
if(cha&bin[j])a=f[a][j];
if(a==b)return a;
for(int j=;~j;j--)
if(f[a][j]!=f[b][j])a=f[a][j],b=f[b][j];
return f[a][];
} void dfs1(int rt,int fa)
{
l[rt]=++num;deep[rt]=deep[fa]+;
for(int i=adj[rt];i;i=s[i].next)
if(s[i].zhong!=fa)f[s[i].zhong][]=rt,dfs1(s[i].zhong,rt);
r[rt]=++num;
}
void dfs2(int rt,int fa)
{
root[rt]=root[fa];
for(int i=,len=vec[rt].size();i<len;i++)
{
root[rt]=root[rt]->insert(,n<<,l[vec[rt][i]],);
root[rt]=root[rt]->insert(,n<<,r[vec[rt][i]],-);
}
for(int i=adj[rt];i;i=s[i].next)
if(s[i].zhong!=fa)dfs2(s[i].zhong,rt);
}
LL Z,M;
LL gcd(LL a,LL b){return (b==)?a:gcd(b,a%b);} int main()
{
scanf("%d%d",&n,&m);int a,b;
for(int i=;i<n;i++)scanf("%d%d",&a,&b),add(a,b),add(b,a);
for(int i=;i<=m;i++)
scanf("%d%d",&ro[i].qi,&ro[i].zhong),vec[ro[i].qi].push_back(ro[i].zhong);
root[]=new (NULL,NULL,) node;
root[]->ch[]=root[]->ch[]=root[];
dfs1(,);dfs2(,);
bin[]=;for(int i=;i<=;i++)bin[i]=bin[i-]<<;
for(int j=;j<=;j++)
for(int i=;i<=n;i++)
f[i][j]=f[f[i][j-]][j-];
for(int i=;i<=m;i++)
{
int lca=LCA(ro[i].qi,ro[i].zhong),t=f[lca][];
a=ro[i].qi,b=ro[i].zhong;
Z+=query(root[a],root[b],root[lca],root[t],,n<<,l[lca],l[a]);
Z+=query(root[a],root[b],root[lca],root[t],,n<<,l[lca],l[b]);
Z-=query(root[a],root[b],root[lca],root[t],,n<<,l[lca],l[lca]);
Z--;
}
M=(LL)m*(m-)>>;LL tmp=gcd(Z,M);
printf("%lld/%lld",Z/tmp,M/tmp);
}
[BZOJ3772]精神污染 主席树上树+欧拉序的更多相关文章
- BZOJ3772 精神污染 主席树 dfs序
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3772 题意概括 给出一个树,共n个节点. 有m条互不相同的树上路径. 现在让你随机选择2条路径,问 ...
- 【BZOJ 3772】精神污染 主席树+欧拉序
这道题的内存…………………真·精神污染……….. 这道题的思路很明了,我们就是要找每一个路径包含了多少其他路径那么就是找,有多少路径的左右端点都在这条路径上,对于每一条路径,我们随便选定一个端点作为第 ...
- bzoj 3772 精神污染 主席树+dfs序
精神污染 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 637 Solved: 177[Submit][Status][Discuss] Descri ...
- BZOJ 4026 dC Loves Number Theory (主席树+数论+欧拉函数)
题目大意:给你一个序列,求出指定区间的(l<=i<=r) mod 1000777 的值 还复习了欧拉函数以及线性筛逆元 考虑欧拉函数的的性质,(l<=i<=r),等价于 (p[ ...
- CF383C Propagating tree (线段树,欧拉序)
\(tag\)没开够\(WA\)了一发... 求出\(dfs\)序,然后按深度分类更新与查询. #include <iostream> #include <cstdio> #i ...
- BZOJ 4034 [HAOI2015]树上操作(欧拉序+线段树)
题意: 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增 ...
- Underground Lab CodeForces - 782E (欧拉序)
大意:$n$结点,$m$条边无向图, 有$k$个人, 每个人最多走$\left\lceil\frac {2n}{k}\right\rceil$步, 求一种方案使得$k$个人走遍所有的点 $n$结点树的 ...
- hdu 2586 欧拉序+rmq 求lca
题意:求树上任意两点的距离 先说下欧拉序 对这颗树来说 欧拉序为 ABDBEGBACFHFCA 那欧拉序有啥用 这里先说第一个作用 求lca 对于一个欧拉序列,我们要求的两个点在欧拉序中的第一个位置之 ...
- lca 欧拉序+rmq(st) 欧拉序+rmq(线段树) 离线dfs 倍增
https://www.luogu.org/problemnew/show/P3379 1.欧拉序+rmq(st) /* 在这里,对于一个数,选择最左边的 选择任意一个都可以,[left_index, ...
随机推荐
- PowerShell小技巧 算术表达式求值
前几天要统计一个组虚拟机使用的硬盘容量,只希望得到一个大概的值,计算的值截图如下: 写成算术表达式的话大概是:60 * 3 + 80 * 2 + 90 * 3 + 120 * 6 + 140 * 2 ...
- linux命令 zcat
zcat命令查看一个gzip格式的压缩文件zcat file.gz > test.txt 查看一个压缩文件的内容,并将内容 輸入到 文件test.txt zcat命令也可以解压缩数据,并把解压 ...
- 只能在堆上生成的对象 VS. 只能在栈上生成的对象
1. 只能在堆上 即禁止在栈上生成.如何实现? 当对象建立在栈上面时,是由编译器分配内存空间的,调用构造函数来构造栈对象.如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存. 所以,只需 ...
- Oracle案例11——Oracle表空间数据库文件收缩
我们经常会遇到数据库磁盘空间爆满的问题,或由于归档日志突增.或由于数据文件过多.大导致磁盘使用紧俏.这里主要说的场景是磁盘空间本身很大,但表空间对应的数据文件初始化的时候就直接顶满了磁盘空间,导致经常 ...
- JS获取长度方法总结
目录: 1length 2size() 3length与size()的区别 4获取元素的索引 - index() 5获取对应的索引 - eq() 概述: 在工作中大家经常需要获取对象的长度,或者要获取 ...
- 零基础图文傻瓜教程接入Facebook的sdk
零基础图文傻瓜教程接入Facebook的sdk 本人视频教程系类 iOS中CALayer的使用 0. 先解决你的 VPN FQ上外网问题,亲,解决这一步才能进行后续操作^_^. 1. 点击右侧链接 ...
- CMD命令行窗口 复制黏贴
1.在cmd命令窗口空黑处,单击鼠标右键——选择[标记]——单击鼠标左链拖动选择要复制的文字,[再按一下Eenter键]就完成了命令的复制了. 2.粘贴就更简单了,窗口内单击右键——选择[粘贴],就将 ...
- python常见释疑(有别于报错)(不定时更新)
文:铁乐与猫 01.在cmd运行py脚本后,直接回到了提示符,没有任何输出,看起来像是并没有运行一样. 答:你的感觉很可能是对的,但脚本很可能己经正常运行,只是你的代码里面很可能没有给出print提示 ...
- c++与matlab联合编程,调用Deploytool 生成exe文件和dll文件(转)
转自:http://www.cnblogs.com/xlw1219/archive/2012/12/25/2832222.html 首先必须知道联合编程需要知道的一些命令解释: mcc 的作用是将 . ...
- Maven实战(十)利用 Nexus 来构建企业级 Maven 仓库
目录 一.简介 Nexus是Maven仓库管理器,用来搭建一个本地仓库服务器,这样做的好处是便于管理,节省网络资源,速度快,还有一个非常有用的功能就是可以通过项目的SNAPSHOT版本管理,来进行模块 ...