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> ...
随机推荐
- WebSocket抓包分析
转载自:https://www.cnblogs.com/songwenjie/p/8575579.html Chrome控制台 (1)F12进入控制台,点击Network,选中ws栏,注意选中Filt ...
- 小刘的深度学习---CNN
前言: 前段时间我在树莓派上通过KNN,SVM等机器学习的算法实现了门派识别的项目,所用到的数据集是经典的MNIST.可能是因为手写数字与印刷体存在一些区别,识别率并是很不高.基于这样的情况,我打算在 ...
- git ssh密钥配置添加
1. 初次安装git配置用户名和邮箱 $ git config --global user.name "xxx" $ git config --global user.email ...
- maven摘除jar包中配置文件
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-p ...
- C++:构造函数2——拷贝构造函数
前言:拷贝构造函数是C++中的重点之一,在这里对其知识进行一个简单的总结. 一.什么是拷贝构造函数 在C++中,对于内置类型的变量来说,在其创建的过程中用同类型的另一个变量来初始化它是完全可以的,如 ...
- Chapter 8 面向对象设计
设计也是一个建模的活动,在设计阶段将集中研究系统的软件实现问题包括体系结构设计.详细设计.用户界面设计和数据库设计等.通常设计活动分为系统设计和详细设计两个主要阶段.软件设计要遵循模块化.耦合度和内聚 ...
- sql经常出现死锁解决办法
文章:sql server在高并发状态下同时执行查询与更新操作时的死锁问题
- [2017BUAA软工]个人项目心得体会:数独
心得体会 回顾此次个人项目,感受比较复杂,最明显的一点是--累!代码编写.单元测试.代码覆盖.性能优化,环环相扣,有种从作业发布开始就一直在赶DDL的感觉,但是很充实,也学习到和体验了很多东西.最令人 ...
- app token session rsp
引用:https://blog.csdn.net/jack85986370/article/details/51362278 一.登录机制 粗略地分析, 登录机制主要分为登录验证.登录保持.登出三个部 ...
- sqlserver trigger(触发器)-更新某几列数据时触发【转】
CREATE TRIGGER [dbo].[updataAlarmLevel]ON [dbo].[Alarm_Alarm_Info]AFTER INSERT, UPDATE – 在更新和插入之后ASB ...