首页 > 其他分享 >20240330 专项训练

20240330 专项训练

时间:2024-04-14 15:11:07浏览次数:11  
标签:专项 le 训练 ll dfn low 区间 20240330 100

Tajan / 序列问题专项

save

原题链接
煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处。于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后,其他挖煤点的工人都有一条道路通向救援出口。

请写一个程序,用来计算至少需要设置几个救援出口,以及不同最少救援出口的设置方案总数。

对于 \(50\%\) 的数据,\(n \le 100\)

对于 \(100\%\) 的数据,\(n \le 500\)

保证输出不会超过 \(10^{18}\)

100 pts 做法

考虑 Tarjan 点双缩点后的图。注意记录每个点双的割点数。

  • 若无割点:随意选择两个点建立出口;

  • 一个割点:在非割点的点中建立一个出口;

  • 两个以上:无须建立割点。

分类及证明比较显然。

#include<bits/stdc++.h>
#define ll long long
const int N = 1005;
using namespace std;
ll T, n, m, ind;
ll dfn[N], low[N], anc;
ll cnt, num[N];
ll cut[N];
bool flag[N];
vector < ll > G[N], vDCC[N];
stack < ll > st;
void tarjan(int u){
	dfn[u] = low[u] = ++ind;
	int son = 0; st.push(u);
	for(int i = 0; i < G[u].size(); i++){
		int v = G[u][i];
		if(!dfn[v]){
			son++; tarjan(v);
			low[u] = min(low[u], low[v]);
			if((low[v] >= dfn[u] && u != anc) || (son >= 2 && u == anc))
			  flag[u] = true;
			if(low[v] >= dfn[u]){
				cnt++;
				while(st.top() != v){
					vDCC[cnt].push_back(st.top());
					st.pop();
				}
				vDCC[cnt].push_back(v); st.pop();
				vDCC[cnt].push_back(u);
			}
		} else low[u] = min(low[u], dfn[v]);
	}
	return;
}
void work(){
	memset(dfn, 0, sizeof dfn);
	memset(low, 0, sizeof low);
	memset(flag, 0, sizeof flag);
	memset(cut, 0, sizeof cut);
	ll u, v; vector < ll > tt;
	for(int i = 1; i <= n; i++) G[i] = tt, vDCC[i] = tt;
	n = 0; cnt = 0;
	for(int i = 1; i <= m; i++){
		scanf("%d %d", &u, &v);
		G[u].push_back(v); G[v].push_back(u);
		n = max(n, v); n = max(n, v);
	}
	for(int i = 1; i <= n; i++)
	  if(!dfn[i]) anc = i, tarjan(i);
	for(int i = 1; i <= cnt; i++){
		num[i] = vDCC[i].size(); 
		for(int j = 0; j < num[i]; j++)
		  cut[i] += flag[vDCC[i][j]];
	}
	ll ans1 = 0, ans2 = 1;
	for(int i = 1; i <= cnt; i++){
		if(cut[i] == 0)
		  ans1 += 2, ans2 *= num[i] * (num[i] - 1) / 2;
		else if(cut[i] == 1)
		  ans1 ++, ans2 *= num[i] - 1;
	}
	printf("Case %d: %lld %lld\n", ++T, ans1, ans2);
}
int main(){
	freopen("save.in", "r", stdin);
	freopen("save.out", "w", stdout);
	while(scanf("%d", &m) && m) work();
	return 0;
}

chocolate

你面前的巧克力礼盒中共有 \(n\) 块有序的巧克力,其中一部分是黑巧克力,一部分是白巧克力。

你希望找到一些有序三元组 \((i, j, k)\),满足:

  • \(i < j < k\);

  • 第 \(i\) 块和第 \(k\) 块巧克力是黑巧克力,第 \(j\) 块巧克力是白巧克力。

你需要求出共有多少个满足条件的有序三元组 \((i, j, k)\),答案对 \(10^9 + 7\) 取模。

对于 \(100\%\) 的数据,\(3 \le n \le 10^6\),保证 \(s\) 中只包含 \(\texttt{B}\) 和 \(\texttt{W}\)。

range

所有人,都有一段支离破碎的过去。

你有 \(n\) 段过去的经历,有时顺利,有时不顺,于是你用一个评价值 \(a_i\) 来描述你的第 \(i\) 段经历,它们构成了长度 \(n\) 为的序列 \(a\) 。你决定对过去进行反思总结,反思深度为 \(d\)。如果 \(d \ge 1\),那你就要算出 \(a\) 的所有子区间的和之和;如果 \(d \ge 2\),那你还要算出 \(a\) 的所有子区间的极差之和;如果 \(d \ge 3\),那你也要算出 \(a\) 的所有子区间的平均值之和。

定义:子区间是指序列中连续的一段;区间和为区间所有数相加的和;区间极差为区间的最大值减去最小值;区间的平均值为区间和除以区间元素个数。

为了输出方便,输出平均值时请乘上 \(n!\),所有输出对 \(1336363663\) 取模。

对于 \(100\%\) 的数据,\(1 \le n \le 3\times 10^6\),\(0 \le d \le 3\),\(1 \le a_i \le 10^9\)

graph

给定一张 \(n\) 个点 \(m\) 条边的无向图,现在想要把这张图定向。

有 \(p\) 个限制条件,每个条件形如 \((x_i, y_i)\),表示在新的有向图当中,\(x_i\) 要能够沿着一些边走到 \(y_i\)。

现在请你求出,每条边的方向是否能够唯一确定。同时请给出这些能够唯一确定的边的方向。

对于 \(30\%\) 的数据,\(n,m \le 1000, p \le 100\)

对于 \(60\%\) 的数据,\(p \le 100\)

对于 \(100\%\) 的数据,\(n,m,p \le 100000\)

标签:专项,le,训练,ll,dfn,low,区间,20240330,100
From: https://www.cnblogs.com/hayzxjr/p/18106723

相关文章

  • 代码随想录算法训练营第8天 | 字符串 344.反转字符串 541. 反转字符串II 卡码网:54.
    leetcode344.反转字符串题目344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。解题思路实现代码......
  • 代码随想录算法训练营第9天 | 字符串(KMP算法) 28. 找出字符串中第一个匹配项的下标
    leetcode28.找出字符串中第一个匹配项的下标题目28.找出字符串中第一个匹配项的下标给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回-1。解题思路实现代......
  • 代码随想录算法训练营第7天 | 哈希表 454.四数相加II 383. 赎金信 15. 三数之和 18.
    leetcode454.四数相加II题目454.四数相加II解题思路实现代码leetcode383.赎金信题目383.赎金信解题思路实现代码leetcode15.三数之和题目15.三数之和解题思路实现代码leetcode454.四数相加II题目18.四数之和解题思路实现代码......
  • 25天【代码随想录算法训练营34期】第七章 回溯算法part02 ( ● 216.组合总和III ● 17
    **216.组合总和III**classSolution:defcombinationSum3(self,k:int,n:int)->List[List[int]]:result=[]self.backtracking(k,n,1,[],result,n)returnresultdefbacktracking(self,k,n,startingIndex,path,result,......
  • 24天【代码随想录算法训练营34期】第七章 回溯算法part01 ( ● 理论基础 ● 77. 组合
    **理论基础**voidbacktracking(参数){if(终止条件){存放结果;return;}for(选择:本层集合中元素(树中节点孩子的数量就是集合的大小)){处理节点;backtracking(路径,选择列表);//递归回溯,撤销处理结果}}......
  • PP-HumanSeg安装、运行、训练、测试
    参考paddleseg官网https://aistudio.baidu.com/projectdetail/2189481?channelType=0&channel=0零、准备工作1.用conda创建虚拟环境#1.查询conda环境下有哪些虚拟环境condainfo--envs#2.创建指定python版本的环境condacreate-nPaddleSeg_py_38python=3.8#3.......
  • dfs序专题训练
    DFS序专题NC13611https://ac.nowcoder.com/acm/problem/13611题意:要求树上任意两点相同颜色之间的路径上的点也是相同颜色,k种颜色,求方案数Solution:原问题等价于将树分割成若干连通块且相互之间颜色不同其实是道数论题。题意可以转化为将树分割为不超过\(k\)个连通块,每个连......
  • day2-Python训练营
    1.ClassOne1.如何正确关闭一个Vmware中的虚拟机2.为Ubuntu安装一些软件step1:openterminal或者快捷键ctrl+shift+T打开终端,然后ping一下,看网络是否连通。step2:sudoaptupdate,判断安装源(默认是美国的源,类似于软件商店)是否连通;step3:安装两个软件,ssh和vim,sudoaptin......
  • 蓝桥杯训练
    P8712[蓝桥杯2020省B1]整数拼接-洛谷|计算机科学教育新生态(luogu.com.cn)题解:这道题和牛客类似,我们换一个思路我们可以开一个二维数组  一位用来记录拼在后面数的长度,一个用来记录这个数乘上10的(后面数的长度)模10我们直接乘1到10,全部记录下来然后枚举右边的数,看......
  • 算法训练营Day08-LeetCode344. 反转字符串 && 541. 反转字符串 II && 151. 反转字符串
    344.反转字符串题目链接:LeetCode344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题思路:字符串首尾字符交换即可完成反转。定......