首页 > 其他分享 >3.14 CF Round 933 (Div. 3)

3.14 CF Round 933 (Div. 3)

时间:2024-03-14 17:12:08浏览次数:26  
标签:typedef int FASTWRITE 3.14 long operator 933 Div FASTREAD

(1) CF1941B Rudolf and 121

给定一个长度为 \(n\) 的序列 \(a\)。求最少进行多少次操作后所有 \(a_i = 0\):

  • 选择一个 \(2 \le i < n\),并让 \(a_i \gets a_i - 2, a_{i - 1} \gets a_{i - 1} - 1, a_{i + 1} \gets a_{i + 1} - 1\)。

我们记选择 \(i = x\) 时的操作为 \(\operatorname{opt}(x)\)。

发现 \(a_1\) 只有 \(\operatorname{opt}(2)\) 才会发生变化。也就是说我们只能通过若干次 \(\operatorname{opt}(2)\) 才能使 \(a_1 = 0\)。所以 \(\operatorname{opt}(2)\) 需要做 \(a_1\) 次。

此时 \(a_1 = 0\)。

同理,对于 \(a_2\),显然我们不能选择 \(\operatorname{opt}(1)\) 或 \(\operatorname{opt}(2)\)。因为这两种操作都会使 \(a_1\) 变小。所以此时能影响到 \(a_2\) 的只有 \(\operatorname{opt}(3)\)。

同理依次操作 \(\operatorname{opt}(i), i = (2, 3, 4, \dots, n - 1)\)。然后判断所有元素是否均为 \(0\) 即可。

时间复杂度 \(\Theta(n)\)。

代码
#include <bits/stdc++.h>

using namespace std;

//#define int long long
typedef long long ll;
typedef unsigned long long LL;
typedef pair<int, int> PII;

struct FASTREAD {
	template <typename T>
	FASTREAD& operator >>(T& x) {
		x = 0; bool flg = false; char c = getchar();
		while (c < '0' || c > '9') flg |= (c == '-'), c = getchar();
		while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0', c = getchar();
		if (flg) x = -x; return *this;
	}
	template <typename T>
	FASTREAD& operator >>(vector<T>& x) {
		for (auto it = x.begin(); it != x.end(); ++ it ) (*this) >> *it;
		return *this;
	}
}fin;

struct FASTWRITE {
	template <typename T>
	FASTWRITE& operator <<(T x) {
		if (x < 0) x = -x, putchar('-');
		static int buf[35]; int top = 0;
		do buf[top ++ ] = x % 10, x /= 10; while (x);
		while (top) putchar(buf[ -- top] + '0');
		return *this;
	}
	FASTWRITE& operator <<(char x) {
		putchar(x); return *this;
	}
	template <typename T>
	FASTWRITE& operator <<(vector<T> x) {
		for (auto it = x.begin(); it != x.end(); ++ it ) (*this) << *it, putchar(' ');
		putchar('\n');
		return *this;
	}
}fout;

const int N = 1e6 + 10;
const int P = 998244353;

void Luogu_UID_748509() {
	int n; fin >> n;
	vector<int> a(n);
	fin >> a;
	for (int i = 0; i + 2 < n; ++ i ) {
		if (a[i] < 0) {
			puts("NO");
			return;
		}
		a[i + 1] -= a[i] * 2;
		a[i + 2] -= a[i];
		a[i] = 0;
	}
	puts(a[n - 2] || a[n - 1] ? "NO" : "YES");
}

signed main() {
	int Testcases = 1;
	fin >> Testcases;
	while (Testcases -- ) Luogu_UID_748509();
	return 0;
}

(2) CF1941D Rudolf and the Ball Game

有 \(n\) 个人围成一圈。最开始第 \(x\) 个人拿着一个球。

接下来会发生 \(m\) 个事件,每个事件形如 \((r_i, c_i)\),其中:

  • \(c_i = \texttt 0\) 表示当前手中有球的人将球顺时针传给第 \(x_i\) 个人。
  • \(c_i = \texttt 1\) 表示当前手中有球的人将球逆时针传给第 \(x_i\) 个人。
  • \(c_i = \texttt ?\) 表示这个事件不清楚,当前手中有球的人将球顺时针逆时针传给第 \(x_i\) 个人。

求最终哪些人可能有球。


我们设 bool 状态 \(f_{i, j}\) 表示第 \(i\) 个事件结束后,第 \(j\) 个人是否有可能拿着球。开始 \(f_{0, x} = \text{true}\)。

转移极易,我们令 \(F(x, y)\) 表示从 \(x\) 顺时针第 \(y\) 个人的编号,\(G(x, y)\) 表示从 \(x\) 逆时针第 \(y\) 个人的编号。那么有

\[f_{i + 1, F(j, r_i)} = f_{i +1 , G(j, r_i)} = f_{i, j} \]

最后看哪些 \(j\) 满足 \(f_{n, j} = \text{true}\) 即可。

时空复杂度均 \(\Theta(nm)\)。当然可以滚动数组将空间复杂度优化成 \(\Theta(m)\)。

代码
#include <bits/stdc++.h>

using namespace std;

//#define int long long
typedef long long ll;
typedef unsigned long long LL;
typedef pair<int, int> PII;

struct FASTREAD {
	template <typename T>
	FASTREAD& operator >>(T& x) {
		x = 0; bool flg = false; char c = getchar();
		while (c < '0' || c > '9') flg |= (c == '-'), c = getchar();
		while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0', c = getchar();
		if (flg) x = -x; return *this;
	}
	template <typename T>
	FASTREAD& operator >>(vector<T>& x) {
		for (auto it = x.begin(); it != x.end(); ++ it ) (*this) >> *it;
		return *this;
	}
}fin;

struct FASTWRITE {
	template <typename T>
	FASTWRITE& operator <<(T x) {
		if (x < 0) x = -x, putchar('-');
		static int buf[35]; int top = 0;
		do buf[top ++ ] = x % 10, x /= 10; while (x);
		while (top) putchar(buf[ -- top] + '0');
		return *this;
	}
	FASTWRITE& operator <<(char x) {
		putchar(x); return *this;
	}
	template <typename T>
	FASTWRITE& operator <<(vector<T> x) {
		for (auto it = x.begin(); it != x.end(); ++ it ) (*this) << *it, putchar(' ');
		putchar('\n');
		return *this;
	}
}fout;

const int N = 1e6 + 10;
const int P = 998244353;

int n, m, x;
int dis;
char op;
bool st[110][N];

int F(int a, int b) {
	return ((a + b) % n + n) % n;
}

void Luogu_UID_748509() {
	fin >> n >> m >> x;
//	for (int j = 0; j <= m; ++ j )
		for (int i = 0; i < n; ++ i )
			st[0][i] = st[1][i] = 0;
	
	st[0][x - 1] = true;
	for (int j = 1; j <= m; ++ j ) {
		cin >> dis >> op;
		for (int i = 0; i < n; ++ i )
			if (st[j - 1 & 1][i]) {
				if (op != '1') st[j & 1][F(i, dis)] = true;
				if (op != '0') st[j & 1][F(i, -dis)] = true;
				st[j - 1 & 1][i] = 0;	
			}
	}
	
	int res = 0;
	for (int i = 0; i < n; ++ i ) res += st[m & 1][i];
	fout << res << '\n';
	for (int i = 0; i < n; ++ i ) if (st[m & 1][i]) fout << i + 1 << ' ';
	puts("");
}

signed main() {
	int Testcases = 1;
	fin >> Testcases;
	while (Testcases -- ) Luogu_UID_748509();
	return 0;
}

(3) CF1941E Rudolf and k Bridges

有一条 \(n \times m\) 的河。第 \(i\) 行第 \(j\) 列的深度为 \(a_{i, j}\)。保证 \(a_{i, 1} = a_{i, m} = 0\)。

如果在第 \(i\) 行第 \(j\) 列安置桥墩,所需代价为 \(a_{i, j} + 1\)。

你需要选择连续的 \(k\) 行,每行都要架起若干个桥墩,并满足以下条件:

  1. 每行的第 \(1\) 列必须架桥墩;
  2. 每行的第 \(m\) 列必须架桥墩;
  3. 每行的相邻两个桥墩的距离不超过 \(d\)。其中 \((i, j_1)\) 和 \((i, j_2)\) 之间的距离为 \(|j_1 - j_2| - 1\)。

求最小代价和。


行与行之间架桥墩并无关系。我们可以求出第 \(i\) 行所需的最小代价 \(g(i)\),那么 \(\min_{i=1}^{n-k+1}\sum_{j=i}^{i+k-1}g(j)\) 即为答案。

对于每一行分别 DP,当前是第 \(r\) 行。设状态 \(f(i)\) 表示若只考虑前 \(i\) 列,且第 \(i\) 列一定架桥,所需的最小代价和。转移枚举上一个桥墩的位置,即:

\[f(i) = a_{r, i} + 1 + \min_{j=i-k-1}^{i - 1} f(j) \]

发现后面的 \(\min_{j=i-k-1}^{i - 1} f(j)\) 可以非常容易地用数据结构维护,例如单调队列或线段树。

总时间复杂度为 \(\Theta(nm\log m)\),用线段树实现的。

代码
#include <bits/stdc++.h>

using namespace std;

#define int long long
typedef long long ll;
typedef unsigned long long LL;
typedef pair<int, int> PII;

struct FASTREAD {
	template <typename T>
	FASTREAD& operator >>(T& x) {
		x = 0; bool flg = false; char c = getchar();
		while (c < '0' || c > '9') flg |= (c == '-'), c = getchar();
		while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0', c = getchar();
		if (flg) x = -x; return *this;
	}
	template <typename T>
	FASTREAD& operator >>(vector<T>& x) {
		for (auto it = x.begin(); it != x.end(); ++ it ) (*this) >> *it;
		return *this;
	}
}fin;

struct FASTWRITE {
	template <typename T>
	FASTWRITE& operator <<(T x) {
		if (x < 0) x = -x, putchar('-');
		static int buf[35]; int top = 0;
		do buf[top ++ ] = x % 10, x /= 10; while (x);
		while (top) putchar(buf[ -- top] + '0');
		return *this;
	}
	FASTWRITE& operator <<(char x) {
		putchar(x); return *this;
	}
	template <typename T>
	FASTWRITE& operator <<(vector<T> x) {
		for (auto it = x.begin(); it != x.end(); ++ it ) (*this) << *it, putchar(' ');
		putchar('\n');
		return *this;
	}
}fout;

const int N = 110, M = 2e5 + 10;
const int P = 998244353;

int n, m, k, d;
int a[N][M];
int sum[N];
int f[M];

struct Tree {
	int l, r, v;
}tr[M << 2];

void pushup(int u) {
	tr[u].v = min(tr[u << 1].v, tr[u << 1 | 1].v);
}

void build(int u, int l, int r) {
	tr[u] = {l, r, 0};
	if (l == r) tr[u].v = 0;
	else {
		int mid = l + r >> 1;
		build(u << 1, l, mid);
		build(u << 1 | 1, mid + 1, r);
	}
}

void modify(int u, int x, int d) {
	if (tr[u].l == tr[u].r) tr[u].v += d;
	else {
		int mid = tr[u].l + tr[u].r >> 1;
		if (x <= mid) modify(u << 1, x, d);
		else modify(u << 1 | 1, x, d);
		pushup(u);
	}
}

int query(int u, int l, int r) {
	if (tr[u].l >= l && tr[u].r <= r) return tr[u].v;
	int mid = tr[u].l + tr[u].r >> 1, res = 1e18;
	if (l <= mid) res = query(u << 1, l, r);
	if (r > mid) res = min(res, query(u << 1 | 1, l, r));
	return res;
}

void Luogu_UID_748509() {
	fin >> n >> m >> k >> d;
	for (int i = 1; i <= n; ++ i ) {
		for (int j = 1; j <= m; ++ j ) fin >> a[i][j];
		build(1, 1, m);
		f[1] = a[i][1] + 1;
		modify(1, 1, f[1]);
		for (int j = 2; j <= m; ++ j ) {
			f[j] = a[i][j] + 1 + query(1, max(1ll, j - d - 1), j - 1);
			modify(1, j, f[j]);
		}
		sum[i] = sum[i - 1] + f[m];
	}
	
	int res = 1e18;
	for (int l = 1, r = k; r <= n; ++ l, ++ r ) res = min(res, sum[r] - sum[l - 1]);
	fout << res << '\n';
	return;
}

signed main() {
	int Testcases = 1;
	fin >> Testcases;
	while (Testcases -- ) Luogu_UID_748509();
	return 0;
}

标签:typedef,int,FASTWRITE,3.14,long,operator,933,Div,FASTREAD
From: https://www.cnblogs.com/2huk/p/18073297

相关文章

  • 百度网盘(百度云)SVIP超级会员共享账号每日更新(2024.03.14)
    一、百度网盘SVIP超级会员共享账号可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答。我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免了U盘的物理载体,直接在网上就实现文件传输。百度网盘SVIP会员可以让自己百度账......
  • KubeSphere 社区双周报|2024.02.29-03.14
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2024.02.29-03.14。贡献者名单新晋KubeSpherecontribu......
  • dp 练习题 2024.3.14
    ARC070ENarrowRectangles题意:平面上有\(n\)个矩形,左下角点坐标为\((l_i,i-1)\),右上角点坐标为\((r_i,i)\)。每次把一个矩形沿着横轴方向移动一个长度单位,求移动多少次使得任意两个相邻矩形存在交点。\(1\len\le10^5,\space1\lel_i<r_i\le10^9\)考虑最简单的dp,设\(......
  • Codeforces Round 933 (Div. 3)赛后总结
    CodeforcesRound933(Div.3)B从边缘开始计算,因为边缘肯定只能一个一个减,就可以遍历得到答案.代码C只要对mapie特判,然后判断map和pie的个数就是答案了。D(记忆化搜索)可以通过二维数组来标记搜索状态,将已经出现过的状态直接返回,极大减少时间。#include<bits/stdc++.h>......
  • Codeforces Round 933 (Div. 3) A - G 题解
    CodeforcesRound933(Div.3)A-RudolfandtheTicketSolution因为\(n\)很小,直接枚举\(b_i+c_j\)所产生的所有数字Code#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn,m,k;cin>>n>>m>>k;intans=0;......
  • CF-933(已更新:B-D)
    CF-933当天晚上舍友在玩剧本杀,不得不说那剧情实在是太狗血了,想不通他们是怎么能玩得那么起劲的但也不能当作这次发挥不好的借口/_\A题最开始没看到数据范围(D也是),B一开始就想到了思路,但调了二十多分钟,甚至因为数组开小了白白多了一次RE……D题才是最难绷的,把题看懂后自己就用......
  • Codeforces Round 933 (Div. 3)
    CodeforcesRound933(Div.3)AA-RudolfandtheTicket暴力查看代码voidsolve(){intn,m,k;cin>>n>>m>>k;vector<int>b(n),c(m);for(inti=0;i<n;++i)cin>>b[i];for(inti=0;i<m;++i)cin>>c[i];......
  • Codeforces Round 933 (Div. 3)
    CodeforcesRound933(Div.3)A-RudolfandtheTicket解题思路:暴力。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingpiii=pair<ll,pair<ll,ll>&......
  • D. Divide by three, multiply by two
    https://codeforces.com/contest/977/problem/Dvoidsolve(){intn;cin>>n;vector<pair<int,longlong>>a(n);for(auto&[x,y]:a){cin>>y;x=0;longlongtemp=y;while(......
  • Codeforces Round 933 (Div. 3)
    A.RudolfandtheTicket#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;usingldb=longdouble;#defineinti64usingvi=vector<int>;usingpii=pair<int,int>;constintinf=1e9;co......