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

5.1模拟赛

时间:2024-08-11 18:24:09浏览次数:14  
标签:5.1 int cin add maxn ans 模拟 dis

这次,很失败,知识点都学过,打不出来。

A

ABC340C Divide and Divide

找规律,很简单,也是我唯一做过的题。
每次是2的幂时,它就会加一。

复杂度是 log ⁡ \log log 级别的。

#include <bits/stdc++.h>
#define int long long

using namespace std;

int n;
int s[1001];

signed main() {
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cin >> n;
	if (n == 1) cout << 0;
	else {
		int res = 1, c = 2, ans = 0;
		while (res * 2 < n) {
			ans += res * c;
			res *= 2;
			c++;
		}
		cout << ans + c * (n - res);
	}
}

B

ABC350D New Friends

并查集,没想到。

合并是朋友的两个点。
最后统计每一个完全连通分量的大小,即其边数,这些边所连接的点就是 z z z。

#include <bits/stdc++.h>
#define int long long

using namespace std;
const int maxn = 2e5 + 10;

int n, m, ans;
int fa[maxn], s[maxn];
int find(int x) {return (x == fa[x] ? x : fa[x] = find(fa[x]));}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n>> m;
	for (int i = 1; i <= n; ++i) fa[i] = i;
	for (int i = 1, x, y; i <= m; ++i) {
		cin >> x >> y;
		int fx = find(x), fy = find(y);
		fa[fx] = fy;
	}
	for (int i = 1; i <= n; ++i) s[find(i)] ++;
	for (int i = 1; i <= n; ++i) if (s[i]) ans += s[i] * (s[i] - 1) / 2;
	cout << ans - m << '\n';
}

C

USACO06NOV Corn Fields G

状压 d p dp dp,可以说是炮兵阵地的简化版。一个十字中只有一只奶牛。

状压 d p dp dp 需要注意:将原来的状态转化为每一行一个只包括 1 , 0 1,0 1,0 数字表示状态,判断上下左右是否有牛(check)。详情见代码。

#include <bits/stdc++.h>

using namespace std;
const int maxn = 5e3 + 10, mod = 1e8;

// 没有相邻草地即一个十字只有一只奶牛 
int n, m, ans;
int f[13][maxn];
// f[i][j] 表示第 i 行状态为 j 的方案数 
int a[13];

int ck(int x, int y){// 判断上下左右是否有奶牛 
	if((x & a[y]) != x) return 0;
	if((x & (x << 1))) return 0;
	return 1;
}
signed main() {
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= n; ++i)
		for (int j = 1, x; j <= m; ++j) {
			cin >> x; 
			a[i] = a[i] * 2 + x;
		}
	for (int i = 0; i < (1 << m); ++i) if(ck(i, 1)) f[1][i] = 1;
	for (int i = 2; i <= n; ++i) {
		for (int j = 0; j < (1 << m); ++j) { // 枚举这一行的状态 
			if (!ck(j, i)) continue;
			for (int k = 0; k < (1 << m); ++k) { // 上一行的状态 
				if (!ck(k, i - 1)) continue;
				if (j & k) continue;
				f[i][j] = (f[i][j] + f[i - 1][k]) % mod;
			}
		}
	}
	for (int i = 0; i < (1 << m); ++i) ans = (ans + f[n][i]) % mod;
	cout << ans << '\n';
}

D

USACO09FEB Revamping Trails G

分层图,跑最短路。主要是想到分层图不太容易。

当起始两点都在第 i i i 层上时,表示已经使用了 i i i 条免费道路,并且当前道路不是免费道路。

若起始点在第 i i i 层且终点在第 i + 1 i+1 i+1 层上时,表示已经使用了 i i i 条免费道路,并且当前道路是免费道路。

#include <bits/stdc++.h>

using namespace std;
const int maxn = 2e6 + 10;

int n, m, k;

struct node {int v, w;};
vector<node> e[maxn];
void add(int u, int v, int w) {e[u].push_back({v, w});}

struct edge {
	int to, dis;
	bool operator < (const edge &o) const {return dis > o.dis;}
};

int dis[maxn];
bool vis[maxn];

void dijkstra(int s) {
	memset(dis, 0x3f, sizeof dis);
	priority_queue<edge> q;
	q.push({s, 0});
	dis[s] = 0;
	while (!q.empty()) {
		int u = q.top().to;
		q.pop();
		if (vis[u]) continue;
		vis[u] = 1;
		for (auto ed: e[u]) {
			int v = ed.v, w = ed.w;
			if (dis[v] > dis[u] + w) {
				dis[v] = dis[u] + w;
				q.push({v, dis[v]});
			}
		}
	}
}

signed main() {
	cin >> n >> m >> k;
	for (int i = 1, u, v, w; i <= m; ++i) {
		scanf("%d%d%d", &u, &v, &w); 
		add(u, v, w);
		add(v, u, w);
		for (int j = 1; j <= k; ++j) {
			add(u + j * n, v + j * n, w);
			add(v + j * n, u + j * n, w);
			add(u + (j - 1) * n, v + j * n, 0);
			add(v + (j - 1) * n, u + j * n, 0);
		}
	}
	dijkstra(1);
	int ans = dis[n];
	for (int i = 1; i <= k; ++i) {
		ans = min(ans, dis[i * n + n]);
	}
	cout << ans << '\n';
}

标签:5.1,int,cin,add,maxn,ans,模拟,dis
From: https://blog.csdn.net/fanchengyou/article/details/141109348

相关文章

  • 『模拟赛』暑假集训CSP提高模拟18
    Rank致敬传奇不挂分Rank5模拟赛A.Mortis原[ABC302G]Sortfrom1to4签,致敬传奇abc_g作签到题。虽然但是还是想了1h,好在最后成功切了。具体解释看看题解,求个赞。点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintRatio=0;constintN=2......
  • 暑假集训CSP提高模拟18
    \[暑假集训CSP提高模拟\1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1\]Verygoodproblem,thismakemynewsrotate.A.Mortis考虑到应该先写个假的暴力.对于暴力思路,可以想到,假如我们每次都将一个不在它位置上的数字移到它应该在的地方的时候,另一个数字也刚好移到正确的位置,这......
  • 模拟赛全集
    模拟赛全集嘉然登场挺不错的题,发现对于每个数,都有固定的数可以与其相邻,而且排序之后是整个序列的一段后缀首先我们发现当序列有解的时候一定有数可以和任何一个数相邻,丢进去就完事了那么我们考虑对于每个值,让能放到它旁边的值全扔进去,之后直接暴力插入任意一个缝隙就好了,注意......
  • Amber24安装教程 Amber24远程安装 生物分子模拟 Amber GPU加速版安装 Amber24 和 Ambe
    文章引言:关于Amber24安装详情放到了第6点,可直接目录跳转哦目录文章引言:安装有关的放到第6点,请往下看哦1.性能的飞跃:显著提升的计算效率2.炼金术模拟的创新:自由能计算的全新高度3.更多模拟选项:灵活而强大的工具集4.独有的功能:Amber24带来的新技术5.与Amber22的......
  • 基于模拟退火算法求解旅行商(TSP)问题(附word文档)
    基于模拟退火算法求解旅行商(TSP)问题(附word文档)......
  • [赛记] 暑假集训CSP提高模拟17
    符号化方法初探100pts签到题?做了得有1.5h+;考虑全是正数或全是负数的情况,那么我们可以对其做一次类似于前缀和或后缀和的操作,需要$n-1$次;所以我们只需将数列中的数全部转化成正数或负数即可,具体地,找出所有正数的和和所有负数的和,如果前者比后者要大,那么就将所有正数加起......
  • 【STM32】ADC模拟数字转换-规则组单通道
    本篇博客重点在于标准库函数的理解与使用,搭建一个框架便于快速开发 目录 ADC简介ADC时钟配置引脚模拟输入模式规则组通道选择ADC初始化 工作模式数据对齐 触发转换方式连续与单次转换模式扫描模式组内的通道个数ADC初始化框架ADC上电ADC校验 获取转换数......
  • [考试记录] 2024.8.10 csp-s 模拟赛18
    80+20+0+70=170第三题应该有10分暴力的,但我没打。T1星际旅行题面翻译总共有n个节点,m条路径,要求其中m-2条路径走两遍,剩下2条路径仅走一遍,问不同的路径总数有多少,如果仅走一遍的两条边不同则将这两条路径视为不同。样例#1样例输入#15412131415样例输......
  • NOIP 模拟赛
    Round11.1得分105。rk倒1。1.2BB键盘上下左右和回车回格都坏的,只能用屏幕键盘。也一定程度影响了心态,导致不想打暴力甚至。但是题感觉真没那么难,破防了一会过后觉得自己不能继续颓了。把基础打牢。套路积累已经够了,回来卷一些基础的东西吧。比如CF前面的题。1.3So......
  • 【无人艇】模拟退火算法红蓝无人水面艇舰队对抗演练和攻防【含Matlab源码 6808期】
    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信或扫描文章底部QQ二维码。......