【jzoj5305】【NOIP2017提高A组模拟8.18】【C】
来源:互联网 发布:淘宝店铺引流量方法 编辑:程序博客网 时间:2024/06/08 19:54
description
solution
tarjan缩环,一个环贡献2^1,跑lca即可。
code
#include<set>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define LL long long#define fo(i,j,k) for(int i=j;i<=k;i++)#define fd(i,j,k) for(int i=j;i>=k;i--)#define fr(i,j) for(int i=begin[j];i;i=next[i])using namespace std;int const mn=1e5+9,mm=3*1e5+9,mo=1e9+7;int n,m,q,gra,u[mm],v[mm],begin[mn],to[mm],next[mm],tim,dfn[mn],low[mn],st[mn],ins[mn], lg2,f[mn],dep[mn],bel[mn],fa[mn][18],Pow[mn];void insert(int u,int v){ to[++gra]=v; next[gra]=begin[u]; begin[u]=gra;}void dfs(int p,int q){ dfn[p]=low[p]=++tim; ins[st[++st[0]]=p]=1; fr(i,p)if(i!=(q^1)){ if(!dfn[to[i]]){ dfs(to[i],i); low[p]=min(low[p],low[to[i]]); }else if(ins[to[i]])low[p]=min(low[p],dfn[to[i]]); } if(dfn[p]==low[p]){ f[p]=st[st[0]]!=p; while(st[st[0]]!=p)bel[st[st[0]]]=p,ins[st[st[0]--]]=0; bel[st[st[0]]]=p,ins[st[st[0]--]]=0; }}void df2(int p,int q){ dfn[p]=1; f[p]+=f[q]; dep[p]=dep[q]+1; fa[p][0]=q; fr(i,p)if(to[i]!=q)df2(to[i],p);}int lc(int u,int v){ if(dep[u]<dep[v])swap(u,v); int uu=u,vv=v; fd(i,lg2,0)if(dep[fa[u][i]]>=dep[v])u=fa[u][i]; if(u==v)return Pow[f[uu]-f[fa[vv][0]]]; fd(i,lg2,0)if(fa[u][i]!=fa[v][i])u=fa[u][i],v=fa[v][i]; return Pow[f[uu]+f[vv]-f[fa[u][0]]-f[fa[u][1]]];}int main(){ freopen("d.in","r",stdin); freopen("d.out","w",stdout); scanf("%d%d",&n,&m); gra=1; fo(i,1,m){ scanf("%d%d",&u[i],&v[i]); insert(u[i],v[i]); insert(v[i],u[i]); } fo(i,1,n)if(!dfn[i])dfs(i,0); gra=1; fo(i,1,n)begin[i]=dfn[i]=0; fo(i,1,m)if(bel[u[i]]!=bel[v[i]]){ insert(bel[u[i]],bel[v[i]]); insert(bel[v[i]],bel[u[i]]); } fo(i,1,n)if(!dfn[i])df2(i,0); lg2=log(n)/log(2); fo(j,1,lg2)fo(i,1,n)fa[i][j]=fa[fa[i][j-1]][j-1]; scanf("%d",&q); Pow[0]=1; fo(i,1,n)Pow[i]=Pow[i-1]*2%mo; fo(cas,1,q){ int u,v; scanf("%d%d",&u,&v); printf("%d\n",lc(bel[u],bel[v])); } return 0;}
阅读全文
1 0
- 【jzoj5305】【NOIP2017提高A组模拟8.18】【C】
- JZOJ 5305. 【NOIP2017提高A组模拟8.18】C
- JZOJ 5305. 【NOIP2017提高A组模拟8.18】C (Standard IO)
- 【jzoj5306】【NOIP2017提高A组模拟8.18】【棋盘游戏】
- [jzoj5307]【NOIP2017提高A组模拟8.18】偷窃
- 【JZOJ5307】【NOIP2017提高A组模拟8.18】偷窃
- A【NOIP2017提高组模拟12.18】
- 【JZOJ4928】【NOIP2017提高组模拟12.18】A
- 【NOIP2017提高组模拟12.18】A
- 【JZOJ4928】【NOIP2017提高组模拟12.18】A
- 【NOIP2017提高A组模拟7.7】图
- 【NOIP2017提高A组模拟7.13】abcd
- 区间【NOIP2017提高A组模拟7.10】
- 【NOIP2017提高A组模拟8.22】密码
- 【NOIP2017提高A组模拟8.23】密码
- 【NOIP2017提高A组模拟8.24】早苗
- 【NOIP2017提高A组模拟8.24】提米树
- 空【NOIP2017提高A组模拟8.24】
- xargs
- Mongo In Action--查询与聚合
- 在x86架构机器上交叉编译linux内核方法
- 【HTCVR】VRTK插件模块功能分析之传送移动(一)
- information_schema介绍
- 【jzoj5305】【NOIP2017提高A组模拟8.18】【C】
- css的优先级
- C#选择排序
- Error: Cannot find module 'webpack/lib/node/NodeTemplatePlugin' at Function.Module._resolveFilen
- 虚拟机上运行ROS 问题及其解决方案
- CF 461B Appleman and Tree (树形dp)
- 迪克斯托最短路径算法
- log4j日志笔记
- C语言中 a-- 和a-1 的区别