BZOJ3772精神污染——可持久化线段树+出栈入栈序
题目描述
输入
输出
样例输入
1 2
2 3
3 4
2 5
3 5
2 5
1 4
样例输出
样例解释
可以选择的路径对有(1,2),(1,3),(2,3),只有路径1完全覆盖路径2。
提示
- #include<map>
- #include<set>
- #include<queue>
- #include<cmath>
- #include<stack>
- #include<vector>
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #define mid ((L+R)>>1)
- using namespace std;
- int x,y;
- int n,m;
- int cnt;
- int num;
- int tot;
- int anc;
- long long ans;
- struct node
- {
- int x;
- int y;
- }q[100010];
- int d[100010];
- int in[100010];
- int to[200010];
- int l[4000010];
- int r[4000010];
- int out[100010];
- int sum[4000010];
- int next[200010];
- int head[100010];
- int root[100010];
- int f[100010][18];
- vector<int>v[100010];
- bool cmp(node a,node b)
- {
- if(a.x==b.x)
- {
- return a.y<b.y;
- }
- return a.x<b.x;
- }
- void add(int x,int y)
- {
- tot++;
- next[tot]=head[x];
- head[x]=tot;
- to[tot]=y;
- }
- long long gcd(long long x,long long y)
- {
- if(y==0)
- {
- return x;
- }
- return gcd(y,x%y);
- }
- int updata(int pre,int L,int R,int x,int k)
- {
- int rt=++cnt;
- if(L==R)
- {
- sum[rt]=sum[pre]+k;
- return rt;
- }
- l[rt]=l[pre];
- r[rt]=r[pre];
- if(x<=mid)
- {
- l[rt]=updata(l[pre],L,mid,x,k);
- }
- else
- {
- r[rt]=updata(r[pre],mid+1,R,x,k);
- }
- sum[rt]=sum[l[rt]]+sum[r[rt]];
- return rt;
- }
- int query(int x,int y,int fa,int anc,int L,int R,int ll,int rr)
- {
- if(ll==L&&rr==R)
- {
- return sum[x]+sum[y]-sum[fa]-sum[anc];
- }
- if(ll>mid)
- {
- return query(r[x],r[y],r[fa],r[anc],mid+1,R,ll,rr);
- }
- else if(rr<=mid)
- {
- return query(l[x],l[y],l[fa],l[anc],L,mid,ll,rr);
- }
- else
- {
- return query(l[x],l[y],l[fa],l[anc],L,mid,ll,mid)+query(r[x],r[y],r[fa],r[anc],mid+1,R,mid+1,rr);
- }
- }
- void dfs1(int x,int fa)
- {
- in[x]=++num;
- f[x][0]=fa;
- d[x]=d[fa]+1;
- for(int i=1;i<=17;i++)
- {
- f[x][i]=f[f[x][i-1]][i-1];
- }
- for(int i=head[x];i;i=next[i])
- {
- if(to[i]!=fa)
- {
- dfs1(to[i],x);
- }
- }
- out[x]=++num;
- }
- void dfs2(int x,int fa)
- {
- root[x]=root[fa];
- int len=v[x].size();
- for(int i=0;i<len;i++)
- {
- root[x]=updata(root[x],1,num,in[v[x][i]],1);
- root[x]=updata(root[x],1,num,out[v[x][i]],-1);
- }
- for(int i=head[x];i;i=next[i])
- {
- if(to[i]!=fa)
- {
- dfs2(to[i],x);
- }
- }
- }
- int lca(int x,int y)
- {
- if(d[x]<d[y])
- {
- swap(x,y);
- }
- int dep=d[x]-d[y];
- for(int i=0;i<=17;i++)
- {
- if(((1<<i)&dep))
- {
- x=f[x][i];
- }
- }
- if(x==y)
- {
- return x;
- }
- for(int i=17;i>=0;i--)
- {
- if(f[x][i]!=f[y][i])
- {
- x=f[x][i];
- y=f[y][i];
- }
- }
- return f[x][0];
- }
- int main()
- {
- scanf("%d%d",&n,&m);
- for(int i=1;i<n;i++)
- {
- scanf("%d%d",&x,&y);
- add(x,y);
- add(y,x);
- }
- for(int i=1;i<=m;i++)
- {
- scanf("%d%d",&x,&y);
- v[x].push_back(y);
- q[i].x=x;
- q[i].y=y;
- }
- dfs1(1,0);
- dfs2(1,0);
- sort(q+1,q+m+1,cmp);
- for(int i=1;i<=m;i++)
- {
- x=q[i].x;
- y=q[i].y;
- anc=lca(x,y);
- ans+=query(root[x],root[y],root[anc],root[f[anc][0]],1,num,in[anc],in[x]);
- ans+=query(root[x],root[y],root[anc],root[f[anc][0]],1,num,in[anc],in[y]);
- ans-=query(root[x],root[y],root[anc],root[f[anc][0]],1,num,in[anc],in[anc]);
- ans--;
- }
- long long k=gcd(ans,1ll*m*(m-1)/2);
- long long g=1ll*m*(m-1)/2/k;
- ans/=k;
- printf("%lld/",ans);
- printf("%lld",g);
- }
BZOJ3772精神污染——可持久化线段树+出栈入栈序的更多相关文章
- 【bzoj4826】[Hnoi2017]影魔 单调栈+可持久化线段树
题目描述 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵魂,都有着自己 ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
- 【BZOJ-2653】middle 可持久化线段树 + 二分
2653: middle Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1298 Solved: 734[Submit][Status][Discu ...
- 【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队
看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: #include<bits/stdc++.h&g ...
- 【BZOJ 3674】可持久化并查集加强版&【BZOJ 3673】可持久化并查集 by zky 用可持久化线段树破之
最后还是去掉异或顺手A了3673,,, 并查集其实就是fa数组,我们只需要维护这个fa数组,用可持久化线段树就行啦 1:判断是否属于同一集合,我加了路径压缩. 2:直接把跟的值指向root[k]的值破 ...
- BZOJ-3524 Couriers 可持久化线段树
可持久化线段树,其实就是类主席树了.. 3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1124 Sol ...
- 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665
如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...
- BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )
树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...
- HDU 5919 Sequence II(可持久化线段树)
[题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=5919 [题目大意] 给出一个数列,每次查询数列中,区间非重元素的下标的中位数.查询操作强制在线. [ ...
随机推荐
- Luogu P1525 关押罪犯
传送门 首先 这是一个并查集= = 这道题其实明白了还挺简单的qwq 思路: 因为只看仇恨值最大的一对儿,所以把他们从大到小排序,越大的就尽量分开,直到不能再分为止qwq q[x]表示x最大的敌人(x ...
- 1-STM32嵌入LUA开发(控制小灯闪耀)
今天因为想让STM32完美的处理字符串,所以就想着让STM32嵌入lua,本来想用f103c8t6,但是一编译就提示内存不足...... 所以单片机的型号选择的 \ 我下载到了RBT6的芯片上测试的 ...
- maven 基础
maven安装链接 maven基础命令: 编译命令:mvn compile 测试命令:mvn test 清空命令:mvn clean 打包命令:mvn package 打包命令:mvn install ...
- 画线函数Glib_Line算法的研究
在这里首先先简单把我对函数的功能的理解阐述一下,方便后面的分析:Glib_Line函数实现的功能是通过参数给定(x1,y1,x2,y2,color),来确定起点(x1,y1)和终点(x2,y2)两 ...
- Hive 表分区
Hive表的分区就是一个目录,分区字段不和表的字段重复 创建分区表: create table tb_partition(id string, name string) PARTITIONED BY ...
- Python高级特性(切片,迭代,列表生成式,生成器,迭代器)
掌握了Python的数据类型.语句和函数,基本上就可以编写出很多有用的程序了. 比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现: L = [] n = 1 while n ...
- synchronized和Lock的异同
JAVA语言使用两种机制来实现堆某种共享资源的同步,synchronized和Lock.其中,synchronized使用Object对象本身的notify.wait.notifyAll调度机制,而l ...
- 一个JAVA程序员成长之路分享
我搞JAVA也有些日子了, 因为我比较贪玩,上进心不那么强, 总是逼不得已为了高薪跳槽才去学习, 所以也没混成什么大牛, 但好在现在也已经成家立业, 小日子过的还算滋润, 起码顶得住一月近万元的吃喝拉 ...
- mybatis-高级结果映射之一对一
mybatis的高级结果映射可以很轻松的帮助我们处理一对一, 一对多的数据关系. 1 数据准备 1.1 数据库 创建以下的名为 mybatis 的数据库, 并在其下创建4个表. 在此就不贴出来建表的 ...
- 虚拟机console基础环境配置——系统镜像站点配置
1. 概述2. 部署HTTP服务器2.1 YUM安装httpd2.2 配置httpd2.3 启动httpdf2.4 测试httpd3. 部署FTP服务器3.1 YUM安装vsftpd3.2 配置vsf ...