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> ...
随机推荐
- 高可用OpenStack(Queen版)集群-15.Glance&Cinder集成Ceph
参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...
- 从零开始的Python学习Episode 16——模块
一.模块 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相 ...
- GC知识随笔
1. http://blog.csdn.net/column/details/14851.html 地址记录 2.关于Minor GC,Major GC与Full GC 1) Minor GC ...
- 互评Beta版本——Thunder组爱阅app(探路者团队测评)
基于NABCD评论作品,及改进建议 每个小组评论其他小组beta发布的作品. 1.根据(不限于)NABCD评论作品的选题; N(Need,需求):在Beta中加入了书友QQ群,以及反馈建议,更好的 ...
- Notes of Daily Scrum Meeting(11.14)
Notes of Daily Scrum Meeting(11.14) 今天是项目第三周的周五,按原计划这时我们的项目应该已经要进入尾声进行组装调试了,但由于之前放假还有队员们的 效率比较低的原因,我 ...
- Scrum Meeting 11.06
成员 今日任务 明日计划 用时 徐越 学习ListView+simpleAdapter,actionBar.阅读并修改前端代码 继续修改前端代码.完善数据库 4h 赵庶宏 构建后端数据库,进行完善 ...
- cocos2d-x 相关文章资源(安卓开发)
http://blog.csdn.net/sdhjob/article/details/38734993 http://www.cnblogs.com/code4app/p/4026665.html ...
- 人and绩效and职业道德
人行走在这个世界上 避免不了的是各种悲哀 人就像是一个茶几 上面放满了各种杯具 而要做的是要么把杯具打碎了咽下去,要么被杯具打晕 本布衣 躬耕于南阳 不求闻达于诸侯 每个人都可以选择自己的生活方式 或 ...
- 福大软工 Alpha 事后诸葛亮
写在前面 林燊大哥 一路走来,好不容易,终于完结了. 设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 解决的问题 用户在进店之前无法得知店铺的优劣 ...
- (小组)第六次作业:NABCD模型分析。产品Backlog。
NABCD模型分析: NABCD模型分析 1.N——need需求 随着时代的进步,人们生活水平的提高,现在手机的普及率已经非常高了,而且现在的家长很多时候会忙于工作,很少会花时间出来给自己读小学的孩子 ...