首页 > 其他分享 >20240930模拟赛

20240930模拟赛

时间:2024-09-30 15:49:57浏览次数:9  
标签:cnt 联通 边双 int ++ 20240930 low 模拟

T1连珠风暴
(necklace.pas/c/cpp)
问题描述:

  • 给定M种颜色的珠子,每种颜色珠子的个数均不限,将这些珠子做成长度为N的项链。
    问能做成多少种不重复的项链.
    并且两条项链相同,当且仅当两条项链通过旋转或是翻转后能重合在一起,且对应珠子的颜色相同。

样例输入:

  • 2 5

样例输出:

  • 8

下图是样例解释:

数据范围:

  • 30%: n,m<=4
  • 60%: n,m<=5
  • 100%: nm<=32

由于范围非常小,所以我们只需要暴力枚举,复杂度是\(O(n^m n ^2)\)

code

#include <bits/stdc++.h>
using namespace std;
#define int long long

int m, n, ans, tot;
int f[40], d[40];

map <int, bool> mp;

bool check()
{
	tot = 0;
	for(int k = 0;k < n;k++)
	{
		int cnt = 0;
		for(int i = 0 + k;i < n + k;i++)
		{
			int j = i % n;
			cnt = cnt * m + f[j];
		}
		if(mp[cnt] == 1) return 0;
		d[++tot] = cnt;
	}
	reverse(f, f + n);
	for(int k = 0;k < n;k++)
	{
		int cnt = 0;
		for(int i = 0 + k;i < n + k;i++)
		{
			int j = i % n;
			cnt = cnt * m + f[j];
		}
		if(mp[cnt] == 1) return 0;
		d[++tot] = cnt;
	}
	for(int i = 1;i <= tot;i++) mp[d[i]] = 1;
	reverse(f, f + n);
	return 1;
}

void dg(int dep)
{
	if(dep == n)
	{
		if(check()) 
		{
			ans++;
		}
		return;
	}
	else
	{
		for(int i = 0;i < m;i++)
		{
			f[dep] = i; 
			dg(dep + 1);
		}
	}
}

signed main()
{
	freopen("necklace.in", "r", stdin);
	freopen("necklace.out", "w", stdout);
	cin >> m >> n;
	if(m == 1)
	{
		cout<<1<<"\n";
		return 0;
	}
	if(n == 1)
	{
		cout<<m<<"\n";
		return 0;
	}
	dg(0);
	cout<<ans<<"\n";
	return 0;
}

T2道路修建
问题描述:

  • 为了保护放牧环境,避免牲畜过度啃咬同一个地方的草皮,牧场主决定利用不断迁移牲畜进行喂养的方法去保护牧草。然而牲畜在迁移过程中也会啃食路上的牧草,所以如果每次迁移都用同一条道路,那么该条道路同样会被啃咬过度而遭受破坏。
    现在牧场主拥有F个农场,已知这些农场至少有一条路径连接起来(不一定是直接相连),但从某些农场去另外一些农场,至少有一条路可通行。为了保护道路上的牧草,农场主希望再建造若干条道路,使得每次迁移牲畜时,至少有2种迁移途径,避免重复走上次迁移的道路。已知当前有的R条道路,问农场主至少要新建造几条道路,才能满足要求?
    输入描述
    第一行2个正整数,分别为n和m
    以下m行,每行2个数,表示连接的编号
    输出描述:
    一行一个数,表示至少新建的道路数目。
    样例输入:
    *7 7
    1 2
    2 3
    3 4
    2 5
    4 5
    5 6
    5 7
    样例输出:
    *2

数据范围:

  • 30%:n<=10 m<=20
  • 60%: n<=100 m<=2000
  • 100%: n<=100000 m<=500000

此题是边双联通分量模版,但我不会。
边双联通分量的定义是在一张连通的无向图中,对于两个点\([u]\)和\([v]\),如果无论删去哪条边(只能删去一条)都不能使它们不连通,我们就说 \([u]\)和\([v]\)边双连通。所以此题转化为至少需要添加几条边使之变为边双联通图。
由于我对图论中的联通性问题一窍不通,所以先引入割点的概念,再介绍tarjan算法。
割点

  • 对于一个无向图,如果把一个点删除后这个图的极大连通分量数增加了,那么这个点就是这个图的割点(又称割顶)
  • 朴素的想法,暴力删除每一个点,再用dfs判断是否联通,复杂度\(O(n(n + m))\),复杂度过高,考虑tarjan。
  1. 我们按照dfs序给每个点打上时间戳。
    2.定义num[u],记录DFS对每个点的访问顺序, low[v],记录v和v的后代能连回的祖先num。如果low[v] >= num[u], 就说明在v这条支路上, 没有回退边连回u的祖先。

边双

  • 在DFS的过程中,low值相同的点在一个边双联通分量,再把每一个边双联通分量缩成一个点,问题转化为至少在树上增加几条边能使这棵树变为一个边双联通分量。
  • 易推导ans = (度为1的点数 + 1) \(/\) 2。
    code
#include <bits/stdc++.h>
using namespace std;
#define int long long

const int N = 100005;

int n, m, low[N], dfn;
vector <int> g[N];

void dfs(int u, int fa)
{
	low[u] = ++dfn;
	for(int i = 0;i < g[u].size();i++)
	{
		int v = g[u][i];
		if(v == fa) continue;
		if(!low[v]) dfs(v, u);
		low[u] = min(low[u], low[v]);
	}
}

int tarjan(){
	int degree[N];
	memset(degree, 0, sizeof degree);
	for(int i = 1;i <= n;i++)
		for(int j = 0;j < g[i].size(); j++)
			if(low[i] != low[g[i][j]])
				degree[low[i]]++;
	int res = 0;
	for(int i = 1;i <= n;i++)
		if(degree[i] == 1) res++;
	return res;
}

signed main()
{
	freopen("road.in", "r", stdin);
	freopen("road.out", "w", stdout);
	cin >> n >> m;
	for(int i = 1;i <= m;i++)
	{
		int a, b;
		cin >> a >> b;
		g[a].push_back(b);
		g[b].push_back(a);
	}
	dfn = 0;
	dfs(1, -1);
	int ans = tarjan();
	cout<<(ans + 1) / 2<<"\n";
	return 0;
}

标签:cnt,联通,边双,int,++,20240930,low,模拟
From: https://www.cnblogs.com/zhaoziye/p/18441992

相关文章

  • 如何选择合适的量化交易策略,回测与模拟交易的实战演练
    炒股自动化:申请官方API接口,散户也可以python炒股自动化(0),申请券商API接口python炒股自动化(1),量化交易接口区别Python炒股自动化(2):获取股票实时数据和历史数据Python炒股自动化(3):分析取回的实时数据和历史数据Python炒股自动化(4):通过接口向交易所发送订单Python炒股自动化(5):......
  • 开源免费Switch模拟器 Ryujinx v1.1.1400 中文免费版
    下载地址:https://pan.quark.cn/s/590ac8551aa7介绍Ryujinx是一款免费、开源的NintendoSwitch模拟器,它可以在电脑上模拟NintendoSwitch游戏机的运行环境,让玩家们能够在PC上畅玩Switch游戏。Ryujinx支持大部分NintendoSwitch游戏,包括TheLegendofZelda:Breath......
  • NZOJ 模拟赛3
    T1地理geo奶牛们刚学习完地理课,知道地球是个球。他们非常震惊,满脑子都是球形。他们试图把地球表面看成一个NxN(1<=N<=100)的方格,但是顶端连接着底部、左边连接到右边。格子用坐标表示,左下角坐标为(1,1)。例如:N=5时,牛从(1,3)位置向下走会到(5,3);从(2,5)向右走会到(2,1)位......
  • 深入解析四舍五入:类型、原理与实战指南20240930
    深入解析四舍五入:类型、原理与实战指南引言在软件开发中,四舍五入是一个常见且重要的操作,广泛应用于数值计算、数据处理和金融分析等领域。然而,四舍五入并非只有一种方式,不同的舍入方法可能会对计算结果产生显著影响。本文将深入探讨四舍五入的常见类型、其背后的原理以及......
  • 【题解】【模拟,字符串】—— [NOIP2011 普及组] 统计单词数
    【题解】【字符串】——[NOIP2011普及组]统计单词数[NOIP2011普及组]统计单词数题目描述输入格式输出格式输入输出样例输入#1输出#1输入#2输出#2提示1.思路解析2.AC代码[NOIP2011普及组]统计单词数通往洛谷的传送门题目描述一般的文本编辑器都有查找......
  • 95th 2024/8/20 模拟赛总结59
    本次爆炸场,也是习惯了赛时:冲T3正解,但是pushdown......OUT!真的得细心,复制第一句时忘记修改第二句了,离谱的是小样例全过了还有pushdown的位置,应注意,防止在叶子节点爆4N空间,比赛时一开始打出了假的T3算法,也是因为当时想了想直接就开打了,没多过脑子,应该多想几下,不然没RP又打假......
  • CSP模拟6
    T1一般图最小匹配点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=5000+107;intn,m,a[N];intread(){ intf=1,s=0;charch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=ge......
  • NOIP 模拟赛小丑记录
    太小丑了。\(8.17\)排名:1/23小周模拟赛,\(\rmT4\)乱写了一个东西过了,赛后发现好像正确性是对的,但是复杂度有点寄。估分:\(100+100+100+?=300+?\)。实际得分:\(100+100+100+100=400\)。\(8.24\)排名:8/25紊莫模拟赛,赛时四个题都会做,但是\(\rmT4\)没写完,只写了前三个,还挂了......
  • CSP模拟5
    T1光我们来考虑一个格加\(4\)或者减\(4\),这样有一个比较好的性质,它能提供\(4,2,2,1\)的贡献还不会溢出,这样我们就有一个比较好的思路,我们枚举\(4,2,2,1\)所无法造成的贡献,很明显只有\(16\)种,然后我们就可以再枚举\(4,2,2,1\)来算贡献.点击查看代码#include<bits/......
  • CSP 模拟 36
    A一般图最小匹配首先排完序后肯定选连续两个。直接DP,\(f_{i,j}\)就是表面意思,\(f_{i,j}=min(f_{i-1,j},f_{i-2,j-1}+a_i-a_i-2)\)。差分后发现问题转化成了选择的数不能相邻,这时候也可以直接考虑DP,但是这是一个经典的反悔贪心。记下\(pre\)和\(nex\),直接扔到堆里,选择一......