3331: [BeiJing2013]压力
LCA+树上差分,和之前类似的题差不多,就是多了个v-dcc缩点,唯一要注意的就是判断是否是割点,对于不是割点的点,如果他是起点或重点,ans++,和差分没有关系,对于割点,则需要用到差分,注意割点与非割点的答案要分开存储,否则会死的。
另外要注意的是数组的大小,开始我因为数组开小了然后MLE了(对,就是这么神奇),因为如果退化成一条链,缩完点后的点数会比缩点前还要多。
#include<iostream>
#include<cstdio>
#include<vector>
#define MAXN 300010
using namespace std;
struct edge
{
int u,v,nxt;
#define u(x) ed[x].u
#define v(x) ed[x].v
#define n(x) ed[x].nxt
#define u2(x) ed2[x].u
#define v2(x) ed2[x].v
#define n2(x) ed2[x].nxt
}ed[MAXN*4],ed2[MAXN*4];
int first[MAXN],num_e;
#define f(x) first[x]
int first2[MAXN],num_e2;
#define f2(x) first2[x]
int n,m,q; int dfn[MAXN],low[MAXN],num,root;
int stack[MAXN],top,cnt;
bool iscut[MAXN];
vector<int> dcc[MAXN];
void tarjan(int x)
{
dfn[x]=low[x]=++num;
stack[++top]=x;
if(x==root&&!f(x)){dcc[++cnt].push_back(x);return;}
int flag=0;
for(int i=f(x);i;i=n(i))
if(!dfn[v(i)])
{
tarjan(v(i));low[x]=min(low[x],low[v(i)]);
if(low[v(i)]>=dfn[x])
{
flag++;
if(x!=root||flag>1)iscut[x]=1;
cnt++;int z;
do{dcc[cnt].push_back(z=stack[top--]);}while(z!=v(i));
dcc[cnt].push_back(x);
}
}
else low[x]=min(low[x],dfn[v(i)]);
}
int new_id[MAXN],c[MAXN];
int f[MAXN][20],dep[MAXN];
void dfs(int x,int fa,int deep)
{
f[x][0]=fa;dep[x]=deep;
for(int i=f2(x);i;i=n2(i))
if(v2(i)!=fa)
dfs(v2(i),x,deep+1);
}
int ans[MAXN],eans[MAXN];
void dfs2(int x,int fa)
{
for(int i=f2(x);i;i=n2(i))
if(v2(i)!=fa)
{
dfs2(v2(i),x);
eans[x]+=eans[v2(i)];
}
}
int LCA(int x,int y)
{
if(dep[x]>dep[y])swap(x,y);
while(dep[x]!=dep[y])
for(int i=0;;i++)
if(dep[f[y][i]]<dep[x])
{y=f[y][i-1];break;}
if(x==y)return x;
while(f[x][0]!=f[y][0])
for(int i=0;;i++)
if(f[x][i]==f[y][i])
{x=f[x][i-1],y=f[y][i-1];break;}
return f[x][0];
}
inline void add(int u,int v);
inline void add2(int u,int v);
signed main()
{
// freopen("in.txt","r",stdin); scanf("%d%d%d",&n,&m,&q);
int a,b;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
add(a,b),add(b,a);
}
for(int i=1;i<=n;i++)
if(!dfn[i]){root=i;tarjan(i);}
num=cnt;
for(int i=1;i<=n;i++)
if(iscut[i])new_id[i]=++num;
for(int i=1;i<=cnt;i++)
for(int j=0;j<dcc[i].size();j++)
{
int x=dcc[i][j];
if(iscut[x])
add2(i,new_id[x]),add2(new_id[x],i);
else c[dcc[i][j]]=i;
}
dfs(1,0,1);
for(int j=1;j<20;j++)
for(int i=1;i<=num;i++)
f[i][j]=f[f[i][j-1]][j-1];
for(int i=1;i<=q;i++)
{
scanf("%d%d",&a,&b);
if(!iscut[a])ans[a]++;
if(!iscut[b])ans[b]++;
int ca=iscut[a]?new_id[a]:c[a],
cb=iscut[b]?new_id[b]:c[b],
lca=LCA(ca,cb);
eans[ca]++,eans[cb]++;
eans[f[lca][0]]--,eans[lca]--;
}
dfs2(1,0);
for(int i=1;i<=n;i++)
printf("%d\n",iscut[i]?eans[new_id[i]]:ans[i]);
}
inline void add(int u,int v)
{
++num_e;
u(num_e)=u;
v(num_e)=v;
n(num_e)=f(u);
f(u)=num_e;
}
inline void add2(int u,int v)
{
++num_e2;
u2(num_e2)=u;
v2(num_e2)=v;
n2(num_e2)=f2(u);
f2(u)=num_e2;
}
3331: [BeiJing2013]压力的更多相关文章
- bzoj 3331: [BeiJing2013]压力
Description 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的 核心路由器典型的要处理100Gbit/s的网络流量.他们每天都生活在巨大的压力 之下. 小强建立了一个模型.这 ...
- BZOJ 3331 [BeiJing2013]压力-Tarjan + 树上差分
Solution Tarjan 点双缩点, 加上树上差分计算. 注意特判... 我特判挂了好久呜呜呜 Code #include<cstdio> #include<cstring&g ...
- 【BZOJ3331】[BeiJing2013]压力 Tarjan求点双
[BZOJ3331][BeiJing2013]压力 Description 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量.他们每天 ...
- BZOJ3331: [BeiJing2013]压力
传送门 Tarjan的三大应用之一:求解点双联通分量. 求解点双联通分量.然后缩点,差分优化即可. //BZOJ 3331 //by Cydiater //2016.10.29 #include &l ...
- BZOJ3331 [BeiJing2013]压力[圆方树+树上差分]
圆方树新技能get.具体笔记见图连通性问题学习笔记. 这题求无向图的必经点,这个是一个固定套路:首先,一张连通的无向图中,每对点双和点双之间是以一个且仅一个割点连接起来的(如果超过一个就不能是割点了) ...
- Solution -「BZOJ 3331」压力
\(\mathcal{Description}\) Link. 给定一个 \(n\) 个点 \(m\) 条边的连通无向图,并给出 \(q\) 个点对 \((u,v)\),令 \(u\) 到 \ ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 关于连通性问题的Tarjan算法暂结
关于基础知识的预备桥和割点.双联通分量.强连通分量,支配树.(并不会支配树) 关于有向图的Tarjan,是在熟悉不过的了,它的主要功能就是求强联通分量,缩个点,但是要注意一下构建新图的时候有可能出现重 ...
- Note -「圆方树」学习笔记
目录 圆方树的定义 圆方树的构造 实现 细节 圆方树的运用 「BZOJ 3331」压力 「洛谷 P4320」道路相遇 「APIO 2018」「洛谷 P4630」铁人两项 「CF 487E」Touris ...
随机推荐
- day 52
目录 静态文件配置 form表单默认是get请求 request方法的初识 数据库的迁移命令 静态文件配置 默认情况下所有的html文件都放在templates文件夹内 什么是静态文件 网站所使用到的 ...
- Linux下安装docker,更改镜像仓库地址,并部署springboot应用
今天做不成的事,明天也不会做好. 各位同学大家好,随着docker的快速发展,越来越多的人开始使用,一方面随着容器化这个趋势越来越火,docker成为了其中的佼佼者:二来容器化确实降低了运维的门槛,让 ...
- maven打包时无法识别lombok中@Data生成的get set方法
开发中使用了lombok,在使用maven编译打包时发现识别不了lombok通过注解@Data在实体类中生成的get,set方法.通过在网上的一篇博客找到了解决的办法,将maven-compiler- ...
- VUE.之安装 font-awesome
VUE.之安装 font-awesome 我们在项目中经常使用各种图标:font-awesome (http://fontawesome.dashgame.com/) 1.npm 安装font-awe ...
- linux引导和登录/注销配置文件
引导和登录/注销 /etc/issue & /etc/issue.net 这些文件由 mingetty(和类似的程序)读取,用来向从终端(issue)或通过 telnet 会话(issue.n ...
- ACM-ICPC 2019 西安邀请赛 D.Miku and Generals(二分图+可行性背包)
“Miku is matchless in the world!” As everyone knows, Nakano Miku is interested in Japanese generals, ...
- Django项目:CRM(客户关系管理系统)--10--04PerfectCRM实现King_admin注册功能02
from django import conf #配置文件print("dj conf:",conf) #配置文件print("dj conf:",conf.s ...
- Laravel 安装登录模块
cmd打开项目目录,执行如下代码即可 php artisan make:auth url访问
- R语言分类算法之随机森林
R语言分类算法之随机森林 1.原理分析: 随机森林是通过自助法(boot-strap)重采样技术,从原始训练样本集N中有放回地重复随机抽取k个样本生成新的训练集样本集合,然后根据自助样本集生成k个决策 ...
- Codeforces Round #263 (Div. 2) A. Appleman and Easy Task【地图型搜索/判断一个点四周‘o’的个数的奇偶】
A. Appleman and Easy Task time limit per test 1 second memory limit per test 256 megabytes input sta ...