首页 > 其他分享 >[赛记] 暑假集训CSP提高模拟7, 8

[赛记] 暑假集训CSP提高模拟7, 8

时间:2024-07-26 20:50:55浏览次数:13  
标签:cnt 赛记 赛时 int 1000005 集训 include CSP dis

学长出题规律:T1签到题,T2套路题(但没见过),T3神奇题(赛时想的做法几乎都是错的),T4peppapig题

学长:今天T3防AK

peppapig:今天比赛防爆零

A. Permutations & Primes 20pts

签到题,可惜没有签到;

显然,我们要让经过1的区间最多,所以将1放在序列中间;

除了1,就是2和3,所以我们把2和3放在两边,这样就可以保证中间及不同时覆盖两边且覆盖到1的区间都是合法的;

然后随便填,就完了;

赛时将1和2放在了一块,导致20pts;

其实也可以将合数放中间,1放最中间,质数放两边,这样也是最大的,就是需要筛一下;

点击查看代码
#include <iostream>
#include <cstdio>
using namespace std;
int t;
int n;
int a[500005];
bool pri[500005];
bool vis[500005];
void w(int x) {
	for (int i = 2; i <= x; i++) {
		if (!vis[i]) {
			vis[i] = true;
			pri[i] = true;
			for (int j = 2; i * j <= x; j++) {
				vis[i * j] = true;
			}
		}
	}
}
int main() {
	cin >> t;
	w(300005);
	while(t--) {
		cin >> n;
		if (n == 1) {
			cout << 1 << endl;
			continue;
		}
		if (n == 2) {
			cout << 2 << ' ' << 1 << endl;
			continue;
		}
		a[n / 2 + 1] = 1;
		a[1] = 2;
		a[n] = 3;
		int x = 4;
		for (int i = 2; i <= n / 2; i++) {
			a[i] = x;
			x++;
		}
		for (int i = n / 2 + 2; i <= n - 1; i++) {
			a[i] = x;
			x++;
		}
		for (int i = 1; i <= n; i++) {
			cout << a[i] << ' ';
		}
		cout << endl;
	}
	return 0;
}

B. 树上游戏 47pts

原题:$ ARC116E $;

貌似又是套路题。。。

我们可以贪心的来考虑,假设现在我们所允许的不满意度(危险度)为 $ dis $,那么从叶子节点开始向上 $ dis $ 个长度需要有一个,然后这颗子树我们就可以删去不考虑了;

发现:如果知道答案,那么验证这个答案的合法性就变得比较容易;

做法:二分答案;

具体的,我们进行 $ dfs $,统计每个节点的危险度 $ f[x] $ 和它距离它的没有删去的儿子的最长距离 $ g[x] $,遍历完这个节点的所有儿子后统计答案即可;

最后判断当前选的点数与 $ k $ 的大小关系完成 $ check $;

赛时居然想到用找重心的方法去做,很显然是错的(新知识没掌握导致的,总是会乱想是不是刚学的)。又乱搞推出了一个看起来不太对的“通式”,整了47pts;

看来现在赛时想出正解确实不容易啊。。。

点击查看代码
#include <iostream>
#include <cstdio>
using namespace std;
int n, k;
struct sss{
	int t, ne;
}e[1000005];
int h[1000005], cnt;
void add(int u, int v) {
	e[++cnt].ne = h[u];
	h[u] = cnt;
	e[cnt].t = v;
}
int f[1000005], g[1000005];
int dfs(int x, int fa, int dis) {
	int res = 0;
	bool vis = false;
	f[x] = 0x3f3f3f3f;
	g[x] = -0x3f3f3f3f;
	for (int i = h[x]; i; i = e[i].ne) {
		int u = e[i].t;
		if (u == fa) continue;
		vis = true;
		res += dfs(u, x, dis);
		f[x] = min(f[x], f[u] + 1);
		g[x] = max(g[x], g[u] + 1);
	}
	if (f[x] + g[x] <= dis) { //最大的危险程度可以接受,直接删除这棵子树;
		g[x] = -0x3f3f3f3f;
	}
	if (!vis) { //是叶子节点;
		g[x] = 0;
	}
	if (f[x] > dis) g[x] = max(g[x], 0); //危险程度太高,需要等祖先设立;
	if (g[x] == dis) { //此时必须设立,要不后代就不满足要求了;
		res++;
		f[x] = 0;
		g[x] = -0x3f3f3f3f; //删除这棵子树;
	}
	return res;
}
bool ck(int x) {
	return (dfs(1, 0, x) + (g[1] >= 0)) <= k; //根节点需不需要设立;
}
int main() {
	cin >> n >> k;
	int x, y;
	for (int i = 1; i <= n - 1; i++) {
		cin >> x >> y;
		add(x, y);
		add(y, x);
	}
	int l = 1;
	int r = n;
	int ans;
	while(l <= r) {
		int mid = (l + r) >> 1;
		if (ck(mid)) {
			r = mid - 1;
			ans = mid;
		} else {
			l = mid + 1;
		}
	}
	cout << ans;
	return 0;
}

可能把 $ g $ 数组设为 $ -INF $ 以删除子树这种操作也是一种常见套路吧;

C. Ball Collector 0pts

用到了一种数据结构,叫可撤销并查集;

其实这种题又有一种常见套路:将 $ a_i $ 与 $ b_i $ 连边;

其实赛时想出来了,不过是将 $ a_i $ 与 $ b_i $ 的反面连边,然后跑 $ 2-SAT $,结果最后发现只能输出一种可行方案,不能输出最大值,这些专题确实赶得太紧了,没掌握

标签:cnt,赛记,赛时,int,1000005,集训,include,CSP,dis
From: https://www.cnblogs.com/PeppaEvenPig/p/18326228

相关文章

  • 2024暑假集训测试12
    前言比赛链接。T2其实和货车运输这题差不多但是由于给定图为树的部分分都没想出来压根没想到重构树,感觉不太应该,思路还是不清晰,赛时没有拿到那个部分分的,因为拿到的都顺着推出正解了;T3是道黑,赛时\(A,B\)循环输出能拿到\(40\)分,赛后重测了;T4题都看不懂。没挂分因为根......
  • 暑假集训CSP提高模拟8
    T1点击查看代码#include<bits/stdc++.h>#definelllonglongusingnamespacestd;lla[5];intmain(){ cin>>a[1]>>a[2]>>a[3]; sort(a+1,a+3+1); llans=(a[3]-a[1])/2+(a[3]-a[2])/2; a[1]+=(a[3]-a[1])/2*2;a[2]+=(a[3]-a[2])/2*2; if(a......
  • 『模拟赛』暑假集训CSP提高模拟8
    Rank诶好像把7咕了,那就咕吧。膜拜博弈论带我上Rank1。A.基础的生成函数练习题(gf)原[ABC093C]SameIntegers先给\(a\),\(b\),\(c\)按升序排个序,求出相邻两数之差。若较小的两数之差(\(a\)和\(b\))为奇数,先操作\(\lfloor{\frac{b-a}{2}}\rfloor\)次使\(a=b-1\),再操......
  • joke 学长出题比赛记录
    早上吃饭呢路上Qyun:gtm学长旁边那个穿黑衣服的好像joke学长啊。几分钟后坐电梯:哇哦,还真是,joke学长来了。(我们为什么能认出来joke呢,见本篇博客最下方)7:30开赛,看见题目列表:,爆炸!随后整个机房充满了各种声音。显然,出题人的目的达到了。哇,joke学长以为要坐牢了,想着没事......
  • 暑假集训CSP提高模拟8
    暑假集训CSP提高模拟8\(T1\)P155.基础的生成函数练习题(gf)\(100pts\)原题:[ABC093C]SameIntegers设通过操作\(a,b,c\)所能达到的最小整数为\(x\)。观察到对同两个数进行操作\(2\)等价于分别对这两个数各进行操作\(1\),在\(a,b,c\)达到\(x\)的过程中优先......
  • 【题解】「CSP模拟赛」雨天 rain
    雨天rain考场上打了一个动态开点线段树,但是被卡空间了......
  • VP CSP-J2019 江西
    不是很理解为什么江西CSP单列一年,题目难度吊打CSP-J2024T1P5681[CSP-J2019江西]面积签到题,但需要注意面积相等情况#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;lla,b,c;intmain(){ cin>>a>>b>>c; if(a*a>b*c){ cout<<"Alice......
  • 暑假集训CSP提高模拟7
    这个T1的\(n^{3}\)的SPJ效率还是太慢了,膜拜SPJ大神学长,还会画画A.Permutations&Primes这题感觉挺水的但是感觉有不是那么水,主要还是因为我赛时没想出正解,在打的表里找了一组好看的规律,打上了然后就过了.对偶数来说,我的规律正好是正解的特化,但是对奇数来说,我的规律就......
  • 「模拟赛」暑期集训CSP提高模拟6(7.23)
    \(140pts,Rank23\)题目列表A.花间叔祖B.合并rC.回收波特D.斗篷花间叔祖\(98pts\)题意:给定一个数组,选择一个大于等于2的模数,然后把数组中的数变成\(mod\)该模数后的数。只能操作一次,问操作后最少有几种不同的数。赛事分析:开始5分钟想到了算\(a_i\)中所有......
  • 2024暑假集训测试11
    前言比赛链接。这次好多外校的参加\(60\)多个人,反正至少没怎么挂分。确切的说赛时我只能冲T1、T2,T3可撤销或可持久化并查集都不会,赛后现学的,T4更抽象,可惜T2打假了。T3最后五分钟才开始看,没想直接打暴力了。但是T3数据太水了,加了捆绑还是水,赛后安排了重测。T1Pe......