loj10131 暗的连锁
传送门
分析
首先我们知道如果在一棵树上加一条边一定会构成一个环,而删掉环上任意一条边都不改变连通性。我们把这一性质扩展到这个题上不难发现如果一条树边不在任意一个新边构成的环里则删掉这条边之后可以删掉任意一条新边,对方案数的贡献是m。而如果它只在一个新边构成的环中则要删除这条边和对应的新边,对方案数的贡献是1。而如果它在至少两个新边构成的环中则无论如何也不能将图分成两半,所以对方案数的贡献为0。在知道这些之后我们考虑如何维护一条边在几个由新边构成的环中,那我们自然考虑到了LCA,对于每一条新边将其LCA路径上的边的值都加1.所以我们只需要维护这个值就行了。据说可以用倍增+差分维护,但我并不会,我是用树剖维护的。我们考虑对于原来的树,除根节点外的每一个点入度一定为1,所以我们不在边上累加答案,而用这条边连接的两个点中深度较深的点来代表这条边,最后用2~n这几个点上的值便可以求出方案数。
代码
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cctype> #include<cmath> #include<cstdlib> #include<queue> #include<ctime> #include<vector> #include<set> #include<map> #include<stack> using namespace std; const int LOG = 20; vector<int>v[100010]; int ans,id[100010],col[440000],n,m; int son[100010],siz[100010],cnt,dep[100010],fa[100010],acc[100010]; inline void dfs(int x,int la){int maxn=0;siz[x]=1;for(int i=0;i<v[x].size();i++)if(v[x][i]!=la){fa[v[x][i]]=x;dep[v[x][i]]=dep[x]+1;dfs(v[x][i],x);siz[x]+=siz[v[x][i]];if(siz[v[x][i]]>maxn){maxn=siz[v[x][i]];son[x]=v[x][i];}}return; } inline void dfs2(int x,int ac){id[x]=++cnt;acc[x]=ac;if(!son[x])return;dfs2(son[x],ac);for(int i=0;i<v[x].size();i++)if(v[x][i]!=fa[x]&&v[x][i]!=son[x])dfs2(v[x][i],v[x][i]);return; } inline void update(int le,int ri,int wh,int x,int y,int k){if(x>y)return;if(le>=x&&ri<=y){col[wh]+=k;return;}int mid=(le+ri)>>1;if(col[wh]){col[wh<<1]+=col[wh];col[wh<<1|1]+=col[wh];col[wh]=0;}if(mid>=x)update(le,mid,wh<<1,x,y,k);if(mid<y)update(mid+1,ri,wh<<1|1,x,y,k);return; } inline int q(int le,int ri,int wh,int pl){if(le==ri)return col[wh];int mid=(le+ri)>>1,ans;if(col[wh]){col[wh<<1]+=col[wh];col[wh<<1|1]+=col[wh];col[wh]=0;}if(mid>=pl)ans=q(le,mid,wh<<1,pl);else ans=q(mid+1,ri,wh<<1|1,pl);return ans; } inline void solve(int x,int y){while(acc[x]!=acc[y]){if(dep[acc[x]]<dep[acc[y]])swap(x,y);update(1,n,1,id[acc[x]],id[x],1);x=fa[acc[x]];}if(id[x]>id[y])swap(x,y);update(1,n,1,id[x]+1,id[y],1);return; } int main(){int i,j,k;scanf("%d%d",&n,&m);for(i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);v[x].push_back(y);v[y].push_back(x);}fa[1]=0,dep[1]=1;dfs(1,0);dfs2(1,1);for(i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);solve(x,y);}for(i=2;i<=n;i++){int x=q(1,n,1,id[i]);if(x==0)ans+=m;else if(x==1)ans+=1;}printf("%d\n",ans);return 0; }
转载于:https://www.cnblogs.com/yzxverygood/p/9529516.html
loj10131 暗的连锁相关推荐
- 《信息学奥赛一本通 提高篇》 第四部分 数据结构 第4章 倍增求LCA
例题1 点的距离 信息学奥赛一本通(C++版)在线评测系统 例题2 暗的连锁(Poj3417) 信息学奥赛一本通(C++版)在线评测系统 LOj10131 暗的连锁_juruo_xlh-CSDN博客 ...
- 《信息学奥赛一本通》提高版题单
第一部分 基础算法 第 1 章 贪心算法 #10000 「一本通 1.1 例 1」活动安排 #10001 「一本通 1.1 例 2」种树 #10002 「一本通 1.1 例 3」喷水装置 #10003 ...
- LOJ 一本通一句话题解系列:
第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...
- 从“连锁”到“新联锁”,尚美生活如何引领酒店行业变革?
文|螳螂观察 作者|易不二 自疫情爆发以来,至今,酒旅行业的整体境况虽说已经逐渐向好,但并没有完全恢复元气. 甚至,反反复复的疫情带来的沉重打击一度让"92万家单体酒店正在寂寞死去" ...
- 解密暗池:那些不为人知的交易
来源 | 星球日报 文 | 芦荟 出品 | 区块链大本营(blockchain_camp) 有观点认为,暗池的存在,是聚合交易以及做市之外的新道路:既为大型机构投资者交易提供了合适的场所,也有助于 ...
- 扎堆上市的背后,中式连锁餐饮到底“卷”到了什么程度?
近几年来,快餐行业迅猛发展,除了西式快餐外,中式连锁餐饮品牌也日渐崛起.随着疫情的爆发,高频刚需的中式连锁餐饮品牌迎来了最快复苏,成为了餐饮业和资本界最为关注的领域. 近日,绝味食品发布公告称,其全资 ...
- “碧桂园凤凰”雄踞中国连锁酒店豪华品牌榜首
近日,由中国饭店协会主办的第九届中国饭店文化节暨全国饭店业振兴大会于广州举行.活动现场发布了<2020中国酒店集团TOP50报告>,碧桂园凤凰酒店品牌雄踞"2020中国连锁酒店豪 ...
- 华住酒店泄露数据的暗网出售情况剖析
原文地址:https://www.hackeye.net/securityevent/16146.aspx 趋势科技在他们所监控的深度网络论坛上发现了从我国华住酒店集团窃取的个人身份信息(PII).通 ...
- 某黑客使用Python 5 天爬取6亿3000万数据在暗网上售卖,恐怖如斯
昨天,一则"陌陌 3000 万数据暗网仅售 200 元"的消息在网上不胫而走. 陌陌回应暗网售卖数据:匹配度低 据微博用户 @lxghost 透露,陌陌有约 3000 万条数据在暗 ...
最新文章
- Spring MVC中用@ResponseBody转json,对json进行处理方法汇总
- 湖北地区的一些主要DNS服务器
- 函数计算 【题目描述】
- 适合打游戏的计算机内存品牌型号,玩游戏电脑内存要多大合适?不同内存容量玩游戏区别实测...
- NOIP2016全国信息学分区普级组 买铅笔(c++版)
- 企业级项目实战讲解!java的war包能直接改名么
- k歌的录音伴奏合成技术如何实现_K歌神器,用唱吧麦克风攀登天籁高峰
- Jupyter notebook中怎么添加Pytorch运行环境
- 设计模式 适配器模式
- 【英语学习】【WOTD】pungle 释义/词源/示例
- 半监督学习(semi-supervised learning)
- 在 Angular 8 中,我们可以期待些什么
- Minitab数据分析时,无法进行统计变量的选择
- 呼叫中心语音外呼营销系统软件成企业首选
- 关于sip协议-3PCC-SIPP工具相关及报错
- prosody之component
- 关于《上海市城镇生育保险办法》的问答
- CodeForces 140C New Year Snowm
- 解决 git 将文本文件视为二进制文件 导致无法查看diff
- 重磅!《中国迈向新一代人工智能》全文来了。道翰天琼认知智能平台为您揭秘新一代人工智能。
热门文章
- verilog之门级相关知识
- Go:表驱动单元测试
- 机器学习(三)——决策树(decision tree)算法介绍
- iOS-推送通知详解
- 04-3. 统计素数并求和(20)
- 2012.12.26 晚 小雨
- 已知一个函数f可以等概率的得到1-5间的随机数,问怎么等概率的得到1-7的随机数...
- 收集的图像处理网站http://blog.csdn.net/chief1985/article/details/1898358
- VIO-为什么要进行在线时间标定
- python课堂_python课堂整理6---字典