首页 > 其他分享 >模拟赛总结

模拟赛总结

时间:2024-06-12 18:32:35浏览次数:8  
标签:总结 子树内 int max rg 模拟 dp define

T1:小奇挖矿2

因为只能走4步或7步,可以发现,当步数差\(\ge18\)时,一定能到达。而当步数差\(<18\)时,枚举出所有能到达的情况即可。

#include<bits/stdc++.h>
#define rg register
#define qwq 0
#define int long long
using namespace std;
const int N = 1e5 + 3;
int n, m;
struct node {
	int a, b;
} c[N];
inline bool cmp(node x, node y) {
	return x.b < y.b;
}
int dp[N], f[N];
bool vis[N];
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin >> n >> m;
	for (rg int i = 1; i <= n; i++) {
		cin >> c[i].a >> c[i].b;
	}
	sort(c + 1, c + n + 1, cmp);
	vis[0] = true;
	rg int ans = 0;
	for (rg int i = 1; i <= n; i++) {
		for (rg int j = i; j >= 0; j--) {
			if (c[i].b - c[j].b >= 18) {
				dp[i] = max(dp[i], f[j] + c[i].a);
				break;
			}
			if (vis[j]) {
				if (c[i].b - c[j].b == 0) dp[i] = max(dp[i], dp[j] + c[i].a);
				if (c[i].b - c[j].b == 4) dp[i] = max(dp[i], dp[j] + c[i].a);
				if (c[i].b - c[j].b == 7) dp[i] = max(dp[i], dp[j] + c[i].a);
				if (c[i].b - c[j].b == 8) dp[i] = max(dp[i], dp[j] + c[i].a);
				if (c[i].b - c[j].b == 11) dp[i] = max(dp[i], dp[j] + c[i].a);
				if (c[i].b - c[j].b == 12) dp[i] = max(dp[i], dp[j] + c[i].a);
				if (c[i].b - c[j].b == 14) dp[i] = max(dp[i], dp[j] + c[i].a);
				if (c[i].b - c[j].b == 15) dp[i] = max(dp[i], dp[j] + c[i].a);
				if (c[i].b - c[j].b == 16) dp[i] = max(dp[i], dp[j] + c[i].a);
			}
		}
		if (dp[i] != 0) vis[i] = true;
		f[i] = max(f[i - 1], dp[i]);
	}
	cout << f[n] << "\n";
	return qwq;
}

T2:小奇的矩阵(matrix)

容易推出,\(V = (n+m-1)\times pfh-sum^2\),其中pfh为选的数的平方的和,sum为选的数的和。
令\(f[i][j][k]\)表示当前坐标\((i,j)\),总值为k的最小值。

#include<bits/stdc++.h>
#define rg register
#define qwq 0
using namespace std;
const int N = 33;
int T, n, m;
int a[N][N];
int f[N][N][2005];
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin >> T;
	while (T--) {
		memset(f, -1, sizeof(f));
		cin >> n >> m;
		rg int len = n + m - 1;
		for (rg int i = 1; i <= n; i++) {
			for (rg int j = 1; j <= m; j++) {
				cin >> a[i][j];
			}
		}
		f[1][1][a[1][1]] = a[1][1] * a[1][1];
		for (rg int i = 1; i <= n; i++) {
			for (rg int j = 1; j <= m; j++) {
				for (rg int k = a[i][j]; k <= 1500; k++) {
					if (i == 1 && j == 1) continue ;
					if (f[i - 1][j][k - a[i][j]] != -1) {
						f[i][j][k] = f[i - 1][j][k - a[i][j]] + a[i][j] * a[i][j];
					}
					if (f[i][j - 1][k - a[i][j]] != -1) {
						if (f[i][j][k] == -1) f[i][j][k] = f[i][j - 1][k - a[i][j]] + a[i][j] * a[i][j];
						else f[i][j][k] = min(f[i][j][k], f[i][j - 1][k - a[i][j]] + a[i][j] * a[i][j]);
					}
				}
			}
		}
		rg int ans = 2e9;
		for (rg int i = 0; i <= 1500; i++) {
			if (f[n][m][i] == -1) continue ;
			ans = min(ans, f[n][m][i] * len - i * i);
		}
		cout << ans << "\n";
	}
	return qwq;
}

T3:小奇的仓库(warehouse)

换根DP。
若\(M=0\)很简单,但异或M不好处理。观察到M最大为15,最多只会对一个数的最后四位造成影响,于是将最后四位单独处理。
令\(f[i]\)表示以i为根的子树内的节点到i的距离之和(减去后四位),\(siz[i]\)表示此时距离以j为后缀的共有几个。
每一次向根节点方向转移时会加上一条边的长度,此时不同距离的后缀会发生相应的改变,然后更新父亲相应后缀的siz值。
f中统计的距离总和是抹掉所有后缀后的总和,等到最后根节点统计答案时再考虑每个后缀的贡献。
还有一点,因为\(0 xor M\)值为M,因此最后答案要减去M。

#include<bits/stdc++.h>
#define rg register
#define qwq 0
using namespace std;
const int N = 1e5 + 3;
int siz[N][17], fn[N], f[N];
int n, m;
struct edge {
	int to, val;
};
vector<edge> e[N];
inline void dfs1(int u, int fath) {
	siz[u][0] = 1;
	for (rg int i = 0; i < e[u].size(); i++) {
		rg int v = e[u][i].to, w = e[u][i].val;
		if (v == fath) continue ;
		dfs1(v, u);
		f[u] += f[v];
		for (rg int j = 0; j <= 15; j++) {
			rg int ret = j + w;
			rg int res = ret & 15;
			siz[u][res] += siz[v][j];
			f[u] += siz[v][j] * (ret - res);  //剔除后缀 
		}
	}
}
int sizn[N][17];
inline void dfs2(int u, int fath) {
	fn[u] = f[u];
	for (rg int i = 0; i <= 15; i++) {
		fn[u] += (i ^ m) * siz[u][i];
	}
	for (rg int i = 0; i <= 15; i++) {
		sizn[u][i] = siz[u][i];
	}
	rg int bf = f[u];
	for (rg int i = 0; i < e[u].size(); i++) {
		rg int v = e[u][i].to, w = e[u][i].val;
		if (v == fath) continue ;
		rg int ret, res;
		for (rg int j = 0; j <= 15; j++) {
			ret = j + w;
			res = ret & 15;
			siz[u][res] -= siz[v][j];
			f[u] -= siz[v][j] * (ret - res);
		}
		f[v] = f[u];
		for (rg int j = 0; j <= 15; j++) {
			ret = j + w;
			res = ret & 15;
			siz[v][res] += siz[u][j];
			f[v] += siz[u][j] * (ret - res);
		}
		dfs2(v, u);
		f[u] = bf;
		for (rg int j = 0; j <= 15; j++) {
			siz[u][j] = sizn[u][j];
		}
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin >> n >> m;
	for (rg int i = 1; i < n; i++) {
		rg int x, y, z;
		cin >> x >> y >> z;
		e[x].push_back({y, z});
		e[y].push_back({x, z});
	}
	dfs1(1, 0);
	dfs2(1, 0);
	for (rg int i = 1; i <= n; i++) {
		cout << fn[i] - m << "\n";
	}
	return qwq;
}

T4:[COCI2014-2015#1] Kamp

令\(siz[i]\)表示i子树内关键点数量,\(f[i]\)表示i子树内完成任务并回到i的花费,\(g[i]\)表示i子树外完成任务并回到i的花费,\(dis[i][0]\)表示i子树内的最长链,\(dis[i][1]\)表示i子树内的次长链,\(up[i]\)表示i子树内的最长链。

标签:总结,子树内,int,max,rg,模拟,dp,define
From: https://www.cnblogs.com/Baiyj/p/18244509

相关文章

  • 苹果WWDC24一文总结,携手OpenAi,开启Ai新篇章
    北京时间6月11日凌晨1点,苹果2024年全球开发者大会(WWDC)正式开幕。按照往年惯例,每年的WWDC大会,苹果都会将重心放在对新版系统的介绍上,本次也不例外,苹果发布了包括iOS18、iPadOS18、macOS15以及visionOS2等在内的一系列软件更新。除了例行的系统更新,发布会的最重头大戏就是AI......
  • Java集合总结
    JAVA中常见的集合总结使用集合的好处:可以动态的保存任意多个对象,使用比较方便提供了一些列方便的操作对象的方法:add,remove,set,get等使用集合添加,删除元素的示意代码简洁明了集合主要分为两种:单列集合:集合中存放的是单个对象双列集合:集合中存放的是键值对对象C......
  • 打造独特模拟面试服务,用ChatmoneyAI轻松赚取额外收入!
    引言想要跟上时代潮流,那就利用ChatmoneyAI在模拟面试行业赚钱吧!通过智能机器人提供个性化的面试辅导服务,帮助他人事半功倍地备战面试,同时也实现自己的财务自由。这个创新的商机不仅切合时代需求,还让你在激烈的市场竞争中脱颖而出。心动了吗?赶紧了解如何在这个领域实现赚钱梦想吧!......
  • 2024.06.04《个人总结》
      (大二下)课程总结——软件工程 1)回顾你的课程计划(第一周的计划),你完成的程度如何?请列出具体数据和实际例子。  1.你在这门课的计划是什么?参考一些学校的教学,你对这个课程有什么期待?你打算怎样度过这个课程?    计划就是尽力跟上建民老师的节奏同时,还能主动学习......
  • 二分法的总结
    一、前言最初始版的二分法是力扣704.BinarySearch,而后面的二分法都是在这个基础上进行的变化classSolution{public:intsearch(vector<int>&nums,inttarget){intleft=0;intright=nums.size()-1;while(left<=right){//在这里选择......
  • redis知识点总结
    redis知识点什么是redisredis是一个基于内存的数据库,对数据的读写都在内存中完成,因此读写速度非常快,常用于缓存,消息队列,分布式锁等场景。除此之外,redis还支持事务,持久化,Lua脚本,多种集群方案,哨兵模式,切片集群,主从复制模式,发布/订阅模式,内存淘汰机制,过期删除机制。redis......
  • 个人总结
    在本学期的软件工程课程中,我经历了丰富的学习和成长。在课程开始时,我设定了学习目标,包括掌握Android开发等技能。尽管遇到了一些挑战,但我成功地掌握了Android开发的基本知识和技能。通过课堂学习、实践项目以及课后自主学习,我学会了使用AndroidStudio等开发工具,掌握了UI设计、用......
  • 软件工程课程 结组项目 事后总结分析报告
    从结果来看,我们完成的还是挺不错的,Web端,Android端,服务端,正常的使用流程,还算不错的界面,蹭了一些时兴的技术,按照截止日期交活。实际上这个项目是一堆大问题,我负主要责任吧,虽然不是组长,但它确实从选题,分工,开发,都主要是我一个人操办和完成的。最主要的疏忽,我想是对其他人的进度的监督......
  • 2024.6.12(个人总结)
    所学时间:2小时代码行数:110博客园数:1篇所学知识:  在第一周的课程计划中,我着重安排了学习安卓端的开发应用、掌握javaweb框架的应用、以及开始熟悉数据库的增删改查操作。下面是我在这些方面的具体进展:安卓端的开发应用,学习并掌握了安卓应用的基本结构,包括活动(Activity)、布......
  • Exness官网注册开户模拟全面指南
    Exness是一家享有盛誉的在线外汇和差价合约(CFD)经纪商,因其卓越的交易条件和多样化的金融工具而备受全球投资者的青睐。对于新手和经验丰富的交易者来说,了解如何在Exness平台注册开户是至关重要的。本文将详细介绍Exness注册开户的步骤及注意事项,帮助您顺利开启交易之旅。第一步......