首页 > 其他分享 > [BZOJ3331][BeiJing2013]压力

[BZOJ3331][BeiJing2013]压力

时间:2023-03-28 11:13:06浏览次数:51  
标签:BeiJing2013 int top num low 压力 now BZOJ3331 5211314

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>

using namespace std;

vector <int> temp[5211314], bcc[5211314]; 
int n, m, q;
int next_[5211314], head[5211314], to[5211314], cnt;
int op[5211314], stack[5211314], top_num;
//op表示i是否在栈内,top_num表示栈的长度
int num, dfn[5211314], low[5211314], poi_num;
int deep[5211314], son[5211314], size[5211314], fa[5211314], top[5211314];
int sum[5211314];

inline void add_poi( int v1 , int v2 ) {
	++ cnt;
	next_[cnt] = head[v1];
	head[v1] = cnt;
	to[cnt] = v2;
	return;
}

void tarjan( int now ) {
	stack[++ top_num] = now;
	op[now] = true;
	dfn[now] = low[now] = ++ num;
	for (int i = head[now]; i != 0; i = next_[i]) {
		if ( dfn[to[i]] == 0 ) {
			tarjan( to[i] );
			low[now] = min( low[now] , low[to[i]] );
			if ( low[to[i]] >= dfn[now] ) {
				poi_num ++;
				int tem;
				do {
					tem = stack[top_num];
					top_num --;
					bcc[poi_num].push_back( tem );
					op[tem] = false;
				} while( tem != to[i] );
				bcc[poi_num].push_back( now );
			}//求点双 圆方树
		}
		else if ( op[to[i]] = true ) {
			low[now] = min( low[now] , dfn[to[i]] );
		}
	}
	return;
}

void build_new_edg() {
	for (int i = 1, x; i <= poi_num; ++ i) {
		for (int j = 0; j < bcc[i].size(); ++ j) {
			x = bcc[i][j];
			temp[x].push_back( i + n );
			//第i个点双的编号为i+n
			//这里表示点x与编号为i的点双连接
			temp[i + n].push_back( x );
		}
	}
	return;
}

void dfs_son( int now , int father ) {
	fa[now] = father;
	deep[now] = deep[father] + 1;
	size[now] = 1;
	for (int i = 0, to_poi; i < temp[now].size(); ++ i) {
		to_poi = temp[now][i];
		if ( to_poi != father ) {
			dfs_son( to_poi , now );
			size[now] += size[to_poi];
			if ( size[son[now]] < size[to_poi] ) {
				son[now] = to_poi;
			}
		}
	}
	return;
}

void dfs_line( int now , int top_ ) {
	top[now] = top_;
	if ( son[now] ) {
		dfs_line( son[now] , top_ );
	}
	for (int i = 0, to_poi; i < temp[now].size(); ++ i) {
		to_poi = temp[now][i];
		if ( to_poi != fa[now] && to_poi != son[now] ) {
			dfs_line( to_poi , to_poi );
		}
	}
	return;
}//正常树链剖分

int lca( int x , int y ) {
	while ( top[x] != top[y] ) {
		if ( deep[top[x]] < deep[top[y]] ) swap( x , y );
		x = fa[top[x]];
	}
	if ( deep[x] < deep[y] ) swap( x , y );
	//此时y的深度小,且x与y在同一条链上,则此时y为初始未更改之前的x和y的lca
	return y;
}

void update( int now ) {
	for (int i = 0, to_poi; i < temp[now].size(); ++ i) {
		to_poi = temp[now][i];
		if ( to_poi != fa[now] ) {
			update( to_poi );
			sum[now] += sum[to_poi];
		}
	}
	return;
}

int main() {
	freopen("pressure.in","r",stdin);
	freopen("pressure.out","w",stdout);
	scanf("%d%d%d",&n,&m,&q);
	for (int i = 1, u, v; i <= m; ++ i) {
		scanf("%d%d",&u,&v);
		add_poi( u , v );
		add_poi( v , u );
	}
	tarjan( 1 );
	build_new_edg();
	dfs_son( 1 , 0 );
	dfs_line( 1 , 1 );
	for (int i = 1, u, v; i <= q; ++ i) {
		scanf("%d%d",&u,&v);
		int Lca = lca( u , v );
		sum[u] ++;
		sum[v] ++;
		sum[Lca] --;
		//因为下面要求所有儿子走过的次数的和会在两点的lca处加2次
		//所以要减去1次
		sum[fa[Lca]] --;
		//这列减一因为此时Lca的父亲并没有走到,所以更新时加上的1要减去
	}
	update( 1 );
	for (int i = 1; i <= n; ++ i) {
		printf("%d\n",sum[i]);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}

标签:BeiJing2013,int,top,num,low,压力,now,BZOJ3331,5211314
From: https://www.cnblogs.com/jueqingfeng/p/17264362.html

相关文章

  • 《来初中物理题-压强、压力》 回复
    《来初中物理题-压强、压力》         https://tieba.baidu.com/p/8323213490  本来是随便看一看,  结果想了一早上加一中午  。 ......
  • HD-G2L-IOT V2.0核心板MPU压力测试
    1. 测试对象 HD-G2L-IOT基于HD-G2L-CORE V2.0工业级核心板设计,双路千兆网口、双路CAN-bus、2路RS-232、2路RS-485、DSI、LCD、4G/5G、WiFi、CSI摄像头接口等,接口丰富,......
  • mormot2压力测试
    mormot2压力测试测试环境:inteli5-8400+8G内存+win115000个连接发出1千万次请求。   ......
  • 5款软件压力测试工具分享,上海专业的软件测评中心安利
    一、什么是软件压力测试?软件压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分。软件压力测试的基本思路很简单:不是在常规条件下运行手动或自动......
  • 接口测试工具-Jmeter压力测试使用
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • 负载与压力测试的阶梯式与波浪式场景设计详解
    一、阶梯式场景(负载测试)该场景主要应用在负载测试里面,通过设定一定的并发线程数,给定加压规则,遵循“缓起步,快结束”的原则,不断地增加并发用户来找到系统的性能瓶颈,进而......
  • CentOS 中安装 Web 压力测试工具 ApacheBench (ab)
    ab命令会创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的,因此,既可以用来测试Apache的负载压力,也可以测试nginx、lighthttp、tom......
  • http压力测试
    一、http_load程序非常小,解压后也不到100Khttp_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载。但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一......
  • 性能测试-压力测试(最大用户数的20%或者80%)-查看结果数保存到文件(jtl格式)-生成测试报告
    1、压力测试阶梯性能场景(负载)得到最大并发用户数,然后压力测试用,最大用户数的20%或者80%持续运行一段时间,比如1个小时,10个小时,1天等时间可以用普通线程组,也能用阶梯线程组......
  • 多级缓存降低高并发压力
    多级缓存简介1.传统缓存传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图:存在下面的问题:•由于redis的承受能力大于tomcat,所以请求要经......