BZOJ3331: [BeiJing2013]压力
Tarjan的三大应用之一:求解点双联通分量。
求解点双联通分量。然后缩点,差分优化即可。
//BZOJ 3331 //by Cydiater //2016.10.29 #include <iostream> #include <cmath> #include <cstdlib> #include <cstdio> #include <queue> #include <map> #include <cstring> #include <string> #include <algorithm> #include <set> #include <bitset> #include <iomanip> #include <ctime> #include <vector> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) #define cmax(a,b) a=max(a,b) #define cmin(a,b) a=min(a,b) #define Auto(i,a) for(int i=LINK[a];i;i=e[i].next) #define vci vector<int> #define pb push_back const int MAXN=4e5+5; const int oo=0x3f3f3f3f; inline int read(){ char ch=getchar();int x=0,f=1; while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int N,M,Q,lable[MAXN],dfn[MAXN],low[MAXN],stack[MAXN],top=0,dfs_clock=0,fa[MAXN][25],dep[MAXN],group_num=0; vci group[MAXN]; struct edge{int x,y,next;}; struct Graph{ int LINK[MAXN],len; Graph(){memset(LINK,0,sizeof(LINK));len=0;} edge e[MAXN]; inline void insert(int x,int y){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;e[len].x=x;} inline void Insert(int x,int y){insert(x,y);insert(y,x);} void tarjan(int node){ dfn[node]=low[node]=++dfs_clock; stack[++top]=node;int son=0; Auto(i,node)if(!dfn[e[i].y]){ tarjan(e[i].y); cmin(low[node],low[e[i].y]); if(low[e[i].y]>=dfn[node]){ int tmp;group_num++; do{ tmp=stack[top--]; group[group_num].pb(tmp); }while(tmp!=e[i].y); group[group_num].pb(node); } }else cmin(low[node],dfn[e[i].y]); } void dfs(int node,int deep,int father){ fa[node][0]=father;dep[node]=deep; Auto(i,node)if(e[i].y!=father)dfs(e[i].y,deep+1,node); } void get_ancestor(){ up(i,1,20)up(node,1,N+group_num)if(fa[node][i-1]) fa[node][i]=fa[fa[node][i-1]][i-1]; } int LCA(int x,int y){ if(x==y) return x; if(dep[x]<dep[y])swap(x,y); down(i,20,0)if(dep[x]-(1<<i)>=dep[y])x=fa[x][i]; if(x==y) return x; down(i,20,0)if(fa[x][i]!=0&&fa[x][i]!=fa[y][i]){ x=fa[x][i];y=fa[y][i]; } return fa[x][0]; } void re_dfs(int node){ Auto(i,node)if(e[i].y!=fa[node][0]){ re_dfs(e[i].y); lable[node]+=lable[e[i].y]; } } }G1,G2; namespace solution{ void init(){ N=read();M=read();Q=read(); up(i,1,M){ int x=read(),y=read(); G1.Insert(x,y); } } void slove(){ G1.tarjan(1); up(i,1,group_num)up(j,0,group[i].size()-1)G2.Insert(i+N,group[i][j]); G2.dfs(1,0,0);G2.get_ancestor(); memset(lable,0,sizeof(lable)); while(Q--){ int x=read(),y=read(),lca=G2.LCA(x,y); lable[x]++;lable[y]++;lable[lca]--;lable[fa[lca][0]]--; } G2.re_dfs(1); } void output(){ up(i,1,N)printf("%d\n",lable[i]); } } int main(){ //freopen("input.in","r",stdin); using namespace solution; init(); slove(); output(); return 0; }
BZOJ3331: [BeiJing2013]压力的更多相关文章
- BZOJ3331 [BeiJing2013]压力[圆方树+树上差分]
圆方树新技能get.具体笔记见图连通性问题学习笔记. 这题求无向图的必经点,这个是一个固定套路:首先,一张连通的无向图中,每对点双和点双之间是以一个且仅一个割点连接起来的(如果超过一个就不能是割点了) ...
- 【BZOJ3331】[BeiJing2013]压力 Tarjan求点双
[BZOJ3331][BeiJing2013]压力 Description 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量.他们每天 ...
- 3331: [BeiJing2013]压力
3331: [BeiJing2013]压力 LCA+树上差分,和之前类似的题差不多,就是多了个v-dcc缩点,唯一要注意的就是判断是否是割点,对于不是割点的点,如果他是起点或重点,ans++,和差分没 ...
- bzoj 3331: [BeiJing2013]压力
Description 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的 核心路由器典型的要处理100Gbit/s的网络流量.他们每天都生活在巨大的压力 之下. 小强建立了一个模型.这 ...
- BZOJ 3331 [BeiJing2013]压力-Tarjan + 树上差分
Solution Tarjan 点双缩点, 加上树上差分计算. 注意特判... 我特判挂了好久呜呜呜 Code #include<cstdio> #include<cstring&g ...
- BZOJ3331 BZOJ2013 压力
考前挣扎 圆方树这么早就出现了嘛... 要求每个点必须被经过的次数 所以就是路径上的割点/端点++ 由于圆方树上所有非叶子圆点都是割点 所以就是树上差分就可以辣. 实现的时候出了一点小问题. 就是这里 ...
- 关于连通性问题的Tarjan算法暂结
关于基础知识的预备桥和割点.双联通分量.强连通分量,支配树.(并不会支配树) 关于有向图的Tarjan,是在熟悉不过的了,它的主要功能就是求强联通分量,缩个点,但是要注意一下构建新图的时候有可能出现重 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- bzoj3331 压力(圆方树)
题目链接 圆方树 圆方树就是对于联通无向图中的每一个点双新建一个方点,与点双中的每个点连一条边,然后将原来的边删去.将原来的点看作圆点,新建的点看作方点.所以叫做圆方树. 性质 1.圆方树肯定是棵树( ...
随机推荐
- ORA-14450: attempt to access a transactional temp table already in use
在ORACLE数据中修改会话级临时表时,有可能会遇到ORA-14550错误,那么为什么会话级全局临时表会报ORA-14450错误呢,如下所示,我们先从一个小小案例入手: 案例1: SQL> CR ...
- MYSQL复制
今天我们聊聊复制,复制对于mysql的重要性不言而喻,mysql集群的负载均衡,读写分离和高可用都是基于复制实现.下文主要从4个方面展开,mysql的异步复制,半同步复制和并行复制,最后会简单聊下第三 ...
- Oracle 12c 使用scott等普通用户的方法
目录: 一.前言 二.使用普通用户 三.自动启动PDB 一.前言 最近电脑上安装了oracle 12c数据库,想体验下新特性.安装完后,便像11g一样在dos窗口进行下面的操作: SQL Produc ...
- 设计模式C#实现(十六)——中介者模式
意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互. 适用 ...
- [经验]Textbox 做日志记录,
private void Log(string msg) { txtLog.MaxLength = ; txtLog.AppendText(msg); } 起因:在Winform中用Textbox显示 ...
- 编程中Foo, Bar 到底什么意思?
1 前言 在很多国外计算机书本和一些第三份开源软件的Demo中经常用到两个英文单词Foo,Bar.这到底是什么意思呢?从步入屌丝界的IT生活见到这两个单词到现在我还是不知道这两个单词的真正含义,今天有 ...
- Memcached在windows下安装与使用
建议:windows系统下仅为测试所有,生产环境下服务端应使用Linux系统. 本文最后更新于:2014-08-03 18:24 原文:http://www.yaosansi.com/post/mem ...
- execve(file, argv, env)参数argv获取字符串个数
/* Copyright (C) 1999, 2000, 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU ...
- ACM练手
#include<iostream> #include<string.h> using namespace std; #define N 100 class stack { c ...
- 【2016-10-26】【坚持学习】【Day13】【WCF】【EF + Data Services】
今天做了一个demo, EF+Data Services 先建立一个网站项目 添加一个ADO.NET 数据模型 相当于一个EF容器,用来连接MSSQL数据库 添加一个WCF Data Services ...