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> ...
随机推荐
- Python基础系列讲解—动态类型语言的特点
前言 在C语言中变量所分配到的地址是内存空间中一个固定的位置,当我们改变变量值时, 对应内存空间中的值也相应改变.在Python中变量存储的机制是完全不一样的,当给一个变量赋值时首先解释器会给这个值分 ...
- Beta发布 _thunder_文案+美工展示
作业要求:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/1366 团队介绍:thunder 组成员及各位博客地址: 1.王航:htt ...
- Thunder-Beta发布-事后诸葛亮会议-2017秋-软件工程第十一次作业
小组名称:Thunder项目名称:爱阅APP小组成员:王航 李传康 翟宇豪 邹双黛 苗威 宋雨 胡佑蓉 杨梓瑞一.设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有 ...
- 团队作业 week9
1. Bug bash 我们现在在TFS服务器中有17个BUG等待分配,但是所有BUG的数量肯定不止. 2. Scenario testing 测试人员以不同的身份来对网站进行测试,对于无法满足当前身 ...
- ns-3 可视化模拟 (一) PyViz
PyViz 个人觉得这个的使用简单. (1)首先安装 这是ubuntu下的 sudo apt-get install python-dev python-pygraphviz python-kiwi ...
- nginx配置hls
备注:本来是想用浏览器播放hls,后来没有成功,最后使用flash播放rtmp的方案.所以下面的配置未使用. 修改/usr/local/nginx/conf/nginx.conf文件内容如下: wor ...
- mysql 性能分析及explain用法
转载自http://blog.sina.com.cn/s/blog_4586764e0100o9s1.html 使用explain语句去查看分析结果 如 explain select * from ...
- Enterprise Library 2.0 参考源码索引
http://www.projky.com/entlib/2.0/Microsoft/Practices/EnterpriseLibrary/Caching/BackgroundScheduler.c ...
- JPEG图像压缩算法流程详解
JPEG图像压缩算法流程详解 JPEG代表Joint Photographic Experts Group(联合图像专家小组).此团队创立于1986年,1992年发布了JPEG的标准而在1994年获得 ...
- Rsyslog日志服务搭建
rsyslog是比syslog功能更强大的日志记录系统,可以将日志输出到文件,数据库和其它程序.Centos 6.x默认的rsyslog版本是5.x. 网上关于rsyslog的安装配置文档倒是不少,但 ...