bzoj 3772 :精神污染 线段树+打标记 or 主席树
3772: 精神污染
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 315 Solved: 87
[Submit][Status][Discuss]
Description
Input
Output
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define LL long long
#define ls x*2,l,mid
#define rs x*2+1,mid+1,r
#define N 200005
using namespace std;
LL gcd(LL a,LL b)
{
if(!b)return a;
return gcd(b,a%b);
}
int n,m;
int head[N],ver[N*],nxt[N*],tot;
void add(int a,int b)
{
tot++;nxt[tot]=head[a];head[a]=tot;ver[tot]=b;return ;
}
int dep[N],fa[N][],dfn[N],z,ed[N];
void dfs(int x,int f)
{
dfn[x]=++z;
for(int i=head[x];i;i=nxt[i])
{
if(ver[i]==f)continue;
dep[ver[i]]=dep[x]+;
fa[ver[i]][]=x;
dfs(ver[i],x);
}ed[x]=z;
}
void yu()
{
for(int i=;i<=;i++)
{
for(int j=;j<=n;j++)
{
fa[j][i]=fa[fa[j][i-]][i-];
}
}return ;
}
int lca(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
for(int i=;i>=;i--)
{
if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
}
if(x==y)return x;
for(int i=;i>=;i--)
{
if(fa[x][i]!=fa[y][i])
{
x=fa[x][i];y=fa[y][i];
}
}
return fa[x][];
}
int a[N*];
void add(int x,int l,int r,int pos,int z)
{
if(l==r)
{
a[x]+=z;
return ;
}
int mid=(l+r)>>;
if(pos<=mid)add(ls,pos,z);
else add(rs,pos,z);
a[x]=a[x*]+a[x*+];
}
int qur(int x,int l,int r,int ll,int rr)
{
if(ll>rr)return ;
if(ll<=l&&rr>=r)
{
return a[x];
}
int mid=(l+r)>>;
if(ll>mid)return qur(rs,ll,rr);
if(rr<=mid)return qur(ls,ll,rr);
return qur(rs,ll,rr)+qur(ls,ll,rr);
}
struct qr
{
int x,y;
}q[N];
struct node
{
int op,y;
node(int xx,int yy)
{
op=xx;y=yy;
}
};
int faa(int x,int y)
{
for(int i=;i>=;i--)
{
if(dep[fa[x][i]]>dep[y])x=fa[x][i];
}
return x;
}
vector<node>lazy[N];
LL ans;
int sb[N];
void dp(int x,int f)
{
for(int i=;i<lazy[x].size();i++)
{
if(!lazy[x][i].op)continue;
if(lazy[x][i].op==)
{
ans-=qur(,,n,dfn[lazy[x][i].y],ed[lazy[x][i].y]);
}
else
{
int yy=lazy[x][i].y;
int now=faa(x,yy);
ans-=qur(,,n,,dfn[now]-)+qur(,,n,ed[now]+,n);
if(x==yy)
{
ans-=qur(,,n,dfn[x],dfn[x]);
}
}
}
for(int i=;i<lazy[x].size();i++)
{
add(,,n,dfn[lazy[x][i].y],);
if(lazy[x][i].op==)
{
int uu=lca(x,lazy[x][i].y);
sb[uu]++;
}
}
for(int i=head[x];i;i=nxt[i])
{
if(ver[i]==f)continue;
dp(ver[i],x);
}
for(int i=;i<lazy[x].size();i++)
{
if(!lazy[x][i].op)continue;
if(lazy[x][i].op==)
{
ans+=qur(,,n,dfn[lazy[x][i].y],ed[lazy[x][i].y]);
}
else
{
int yy=lazy[x][i].y;
int now=faa(x,yy);
if(x==yy)
{
ans+=qur(,,n,dfn[x],dfn[x]);
ans+=sb[x];
}
ans+=qur(,,n,,dfn[now]-)+qur(,,n,ed[now]+,n);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
int t1,t2;
for(int i=;i<n;i++)
{
scanf("%d%d",&t1,&t2);
add(t1,t2);add(t2,t1);
}
ans=-m;
dep[]=;
dfs(,-);
yu();
for(int i=;i<=m;i++)
{
scanf("%d%d",&q[i].x,&q[i].y);
int tmp=lca(q[i].x,q[i].y);
if(tmp==q[i].x)
{
lazy[q[i].y].push_back(node(,q[i].x));
if(q[i].x!=q[i].y)lazy[q[i].x].push_back(node(,q[i].y));
}
else if(tmp==q[i].y)
{
lazy[q[i].y].push_back(node(,q[i].x));
lazy[q[i].x].push_back(node(,q[i].y));
}
else
{
lazy[q[i].x].push_back(node(,q[i].y));
lazy[q[i].y].push_back(node(,q[i].x));
}
}
dp(,-);
LL tt=(LL)m*(m-)/;
LL oo=gcd(tt,ans);
printf("%lld/%lld\n",ans/oo,tt/oo);
return ;
}
bzoj 3772 :精神污染 线段树+打标记 or 主席树的更多相关文章
- bzoj 3772 精神污染 主席树+dfs序
精神污染 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 637 Solved: 177[Submit][Status][Discuss] Descri ...
- BZOJ 3772: 精神污染(dfs序+主席树)
传送门 解题思路 比较神仙的一道题.首先计算答案时可以每条路径所包含的路径数,对于\(x,y\)这条路径,可以在\(x\)这处开个\(vector\)存\(y\),然后计算时只需要算这个路径上每个点的 ...
- BZOJ 3772: 精神污染 (dfs序+树状数组)
跟 BZOJ 4009: [HNOI2015]接水果一样- CODE #include <set> #include <queue> #include <cctype&g ...
- BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树
[题目分析] BZOJ这个题目抄的挺霸气. 主席树是第一时间想到的,但是修改又很麻烦. 看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树. 学到了新的姿势,2333o(* ̄▽ ̄*)ブ [代 ...
- BZOJ 2141 排队(树状数组套主席树)
解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...
- [poj2104]可持久化线段树入门题(主席树)
解题关键:离线求区间第k小,主席树的经典裸题: 对主席树的理解:主席树维护的是一段序列中某个数字出现的次数,所以需要预先离散化,最好使用vector的erase和unique函数,很方便:如果求整段序 ...
- [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树
二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...
- BZOJ 3439: Kpm的MC密码 (trie+dfs序主席树)
题意 略 分析 把串倒过来插进trietrietrie上, 那么一个串的kpmkpmkpm串就是这个串在trietrietrie上对应的结点的子树下面的所有字符串. 那么像 BZOJ 3551/354 ...
- BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树
[题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...
随机推荐
- 2013第四届蓝桥杯C/C++ B组
题目标题: 高斯日记:Excel 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示 ...
- PHP.ini 能不能加载子配置文件 ?
答案是不能,php这个地方用的是另一个方案解决的 编译的时候 用这个参数 --with-config-file-scan-dir指定一个目录 然后在这个目录里面加载ini https://www. ...
- 利用Cocoapods创建基于SVN的私有库podspec
由于项目年后要进行组件化,考虑到公司内部实现的一些私有组件,不对外公开,而又想在不同项目中使用,该怎么办呢?由于cocoapods有了强大的功能,可以自己创建podspec,更可以设置私有的库.那么利 ...
- excel中如何将时间戳转换为日期格式
https://www.cnblogs.com/xueluozhangxin/p/5868225.html =TEXT((B2/1000+8*3600)/86400+70*365+19,"y ...
- webpack入门指南-step02
webpack 安装 1)安装前的准备:webpack是基于node环境的项目,所以使用前必须先安装node和npm. 在安装 Webpack 前,你本地环境需要支持 node.js.如果电脑没有装过 ...
- PHP的垃圾回收
PHP使用引用计数和写时拷贝(Copy-On-Write)来管理内存. 引用技术不言自明,写时拷贝工作原来如下: $worker = array("Fred", 35, " ...
- Python数据结构练习
1. 给定列表L,如[2,5,3,8,10,1],对其进行升序排序并输出. 代码: list = [2,5,8,10,1] print(list) list.sort() print(list) 2. ...
- spring冲刺第三天
昨天完成了环境配置和初步的地图设想. 今天从网上找了有关这方面的例子,运行试验了一番.编写的地图画面在程序上运行了一下,有些错误,还需要很多方面的改进. 这些例子有很多地方都不太懂,但还是看完了.我认 ...
- css3学习笔记三
css3有些特殊的元素选择器这和jquery相似.效果图如下
- Hibernate 与 mybatis 区别
JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结 我是一名java开发人员,hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践 ...