首页 > 其他分享 >CSP 日照集训考试 Day2

CSP 日照集训考试 Day2

时间:2022-10-23 23:03:28浏览次数:38  
标签:填满 int res Day2 mid 集训 lst 儿子 CSP

考的并不好。主要整理整理错因,并不是为了写题解。

T1



很简单的题,让我搞成了 70 pts

考场上想的是预处理出第 i 位之后 j 出现的次数,然后枚举两个位置,求一下 gcd ,找一下后面出现的次数。

然后粗略的算了一下复杂度,嗯。大概是 \(O(n^2 log~n)\) 左右的,然后看了眼数据范围。行了,应该能过,然后就没再管它。

五分钟码完了。

可以发现,常数不小,已经超过 1e8 了。

所以我挂了,丢了 30 pts

考虑一下,可以优化掉预处理,在计算的时候第二个位置倒着枚举就好了。

赛时代码

map <pair <int, int>, int> vis;
int a[3007];
int main () {
	int n; cin >> n;
	for (int i = 1; i <= n; ++ i) cin >> a[i];
	for (int i = 1; i <= n; ++ i) {
		for (int j = i + 1; j <= n; ++ j) {
			vis[make_pair (i, a[j])] ++;
		}
	}
	int ans = 0;
	for (int i = 1; i <= n; ++ i) {
		for (int j = i + 1; j <= n; ++ j) {
			int Gcd = gcd (a[i], a[j]);
			if (vis[make_pair (j, Gcd)]) ans += vis[make_pair (j, Gcd)];
		}
	}
	cout << ans;
}

T2



可以想到 dp ,以 i 位结尾,最长的满足条件的子序列。

因为要算一个最小的 k ,使得子序列相邻两位之间的差值要小于等于这个 k ,并且能使这个子序列能够达到 m 的长度。

我们不好直接算 k 。

所以考虑二分答案,因为如果较小的长度能够满足的话,更长的长度就一定能满足,所以满足单调性,可以二分。

二分后,\(O(n^2)\) 的 dp ,算一下最长的子序列能不能达到 m 的长度即可。

# include <bits/stdc++.h>
using namespace std;
#define ll long long
const int D = 1007;
int n, m;
ll a[D];
int f[D];
bool check (ll mid) {
	int res = 0;
	if (n >= 1) res = 1;
	for (int i = 1; i <= n; ++ i) f[i] = 1;
	for (int i = 1; i <= n; ++ i) {
		for (int j = i + 1; j <= n; ++ j) {
			if (abs (a[i] - a[j]) > mid) continue;
			f[j] = max (f[j], f[i] + 1);
			res = max (res, f[j]);
		}
	}
	if (res >= m) return 1;
	return 0;
}
int main () {
	cin >> n >> m;
	for (int i = 1; i <= n; ++ i) cin >> a[i];
	ll l = 0, r = LONG_LONG_MAX, ans;
	while (l <= r) {
		ll mid = l + r >> 1;
		if (check (mid)) r = mid - 1, ans = mid;
		else l = mid + 1;
	}
	cout << ans;
	return 0;
}

T3

考试的时候以为能做出来呢。两个半小时浪费在这十分上了。

顺一下自己想到什么程度了吧。

读完了题,就有一个简单的思路:

就是如果某个节点只有一个子节点的话,那将他填满只需要让这一个儿子填满;如果有多个儿子的话,就要将所有儿子填满,看起来挺废话

如果前面一个儿子填满了,因为这个填满了的儿子的子节点与父亲怎么填没有关系了,那就可以将前一个儿子的所有儿子的石头都拿过来,给这个儿子用。

以此类推,将所有儿子填满。

刚开始觉得这样就能做出来。

十分钟把这个 dp 打出来了,大样例过不去。

于是我手造数据,造了一个不能说没用,但是倒不如说成了我这次考试累赘的一个例子,因为造的不太特殊,导致我只发现,算子节点的时候,放石头的顺序不同,那花费石头的个数就不同。

然后我,使劲对着这个例子拖拉,扒拉了半天,手膜了半天,看出来是需要排序才能做出来的一道题。

具体的蒙不出来。

然后只剩了十分钟了。

交了一个假的 dp 。

# include <bits/stdc++.h>
using namespace std;
const int D = 1e6 + 7;
int n, cnt;
int head[D], f[D], ason[D];
struct edge {
	int nxt, to;
}line[D << 1];
int a[D];
void add (int u, int v) {
	line[++ cnt].nxt = head[u];
	line[cnt].to = v;
	head[u] = cnt;
}
vector <int> tmp[D], g[D], p[D];
void dfs (int x, int fa) {
	bool bz = 0;
	int lst = 0;
	for (int i = head[x]; i; i = line[i].nxt) {
		int y = line[i].to;
		if (y == fa) continue;
		bz = 1;
		dfs (y, x);
		g[x].push_back (f[y]);
		tmp[x].push_back (ason[y]);
		p[x].push_back (y);
	}
	if (!bz) {
		f[x] = a[x];
		return;
	}
//	if (x == 2) cout << f[x]<<" " <<lst << "|\n";
	for (int i = 0; i < g[x].size (); ++ i) {
		if (g[x][i] > lst) {
			f[x] += g[x][i] - lst;
			lst = tmp[x][i];
		}
		else lst -= a[p[x][i]];
//		if (x == 1) cout << f[x] << " " << lst << "\n";
	}
	if (lst < a[x]) f[x] += a[x] - lst;
}
void getson (int x, int fa) {
	for (int i = head[x]; i; i = line[i].nxt) {
		int y = line[i].to;
		if (y == fa) continue;
		getson (y, x);
		ason[x] += a[y];
	}
}
int main () {
	freopen ("ttt.in","r",stdin);
	freopen ("ttt.out","w",stdout);
	cin >> n;
	for (int i = 1; i < n; ++ i) {
		int x; cin >> x;
		add (i + 1, x);
		add (x, i + 1);
	}
	for (int i = 1; i <= n; ++ i) cin >> a[i];
	getson (1, 0);
	dfs (1, 0);
	for (int i = 1; i <= n; ++ i) {
		cout << f[i] << " ";
	}
}

/*

9
1 1 1 1 2 3 4 5
4 3 2 1 5 7 10 13 6

19 10 12 14 11 7 10 13 6


*/

依稀可见调试的痕迹。

T4

看了一眼,感觉很像三色二叉树那个题,码上了,过了样例,然后发现了不对劲,题目里有数量限制…

一般来说我应该知道要怎么设状态的阿……不知道为啥没想出来,大概是受 T3 的影响。

然后我就打着侥幸的心理,在某些 sub 上用了这个算法去求解,虽然没得分吧。然后游离到了 T3 。

到最后看见了剩的时间不多了,开始打这个题的暴力。

当时差不多是五点五十了,眼看着 T3 就像是想不出来的样子了,开始打 T4 暴力。老师当时都说要交卷了……我五分钟打完了,编译一下,然后过样例了……离谱

题解明天上午整理。

总结一下,感觉收获不少的。

首先不能再大意了,我有时候经常就是,没读完题,就开始做,过于心急,导致很多代码都是白打的,时间都在这些上面浪费了。再就是这次是真知道了不能死磕一道题,会死的很惨,不会就是不会,我甘拜下风,别人的头脑就是灵活,我没必要跟人家拼那个脑子。既然思维不够,那基础的一定要拿到,比如第三题我赛后看见,出题人真的给了好多的部分分,这感觉就像去年似的,只喜欢打正解,特看不起部分分,导致去年的我多次倒数。至今我倒是又回去了?幸好不是 CSP ,以后能注意的。

以下是明天的工作了。

题解:

标签:填满,int,res,Day2,mid,集训,lst,儿子,CSP
From: https://www.cnblogs.com/zcxxxxx-blog/p/16819932.html

相关文章

  • day2.1
    流程控制用户交互Scanner对象Scanners=newScanner(System.in);next():一定要读取有效字符才结束;有效字符之前的空格,next()方法会自动去掉;只有输入有效字符后才将后......
  • P7911 CSP J 2021 T3 纯模拟 无map 代码
    目录申明前置知识sscanf与sprintf应用字符串常用函数代码后记申明解释在注释里注释掉的不用管写错的代码可借鉴原题:洛谷P7911前置知识sscanf与sprintf/*sscanf......
  • csp前最后一次模拟(?)
    非常抽象的题目,第一次体验一次考试题目出现一个致命错误和一个小小错误(四道题错两道)第一题按理来说30min就已经打完了,但是题目上没写要mod一个大指数,但是大样例又mod了那......
  • P5683 [CSP-J2019 江西] 道路拆除
    简要题意给你一个\(m\)条边\(n\)个点的无向图。你需要去掉一些边,使得\(1\tos_1,1\tos_2\)连通,且\(1\tos_1\)的最短路径长度小于\(t_1\),\(1\tos_2\)的最......
  • P7914 [CSP-S 2021] 括号序列
    简要题意给定\(k\),定义“超级括号序列”(简称括号序列,下同)字符串为:仅由()*三种字符组成。下面令\(S\)为不超过\(k\)个\(\ast\)字符拼接而成的字符串(\(S\)......
  • 2022/10/22 CSP赛前隔离时的模拟赛 1/3
    T1T2使用一种类似于摩尔投票法的东西(Keven_He说像,我不太觉得):将所有人分为两队,设第一队的总攻击力为\(a\),第二队的总攻击力为\(b\)。不妨设\(a\leb\),求\(\min(b-......
  • CSP-S模拟20
    T1.归隐签到题吧算是。看到数据范围直接来推结论。先把对数去掉,就变成了指数项的加法。容易发现\(a_i=3a_{i-1}+1\),除了两侧的数,其它的贡献都翻了一倍放在中间。然后用等......
  • CSP 2022备战 STL
    只要不上网课,大概是最后一篇?一.vectorvector,中文名容器,它可以容纳许多数据类型头文件:#include<vector>定义:vector<数据类型>变量名;也可以vector<数据类型>变量名(数......
  • 第二十三章 CSP Session 管理 - 身份验证共享策略
    第二十三章CSPSession管理-身份验证共享策略本节介绍如何通过两种方式创建一组应用程序以作为一个组工作:共享认证:如果应用程序不共享认证,用户必须分别登录到被另一......
  • 作者解读ICML接收论文:如何使用不止一个数据集训练神经网络模型?
    作者:欧明锋,浙江大学导读:在实际的深度学习项目中,难免遇到多个相似数据集,这时一次仅用单个数据集训练模型,难免造成局限。是否存在利用多个数据集训练的可能性?本文带来解读。01......