Codeforces Round 933 (Div. 3)賽後總結

拍手称快發表於2024-03-14

Codeforces Round 933 (Div. 3)

B

從邊緣開始計算,因為邊緣肯定只能一個一個減,就可以遍歷得到答案.
程式碼

C

只要對mapie特判,然後判斷map和pie的個數就是答案了。

D(記憶化搜尋)

可以透過二維陣列來標記搜尋狀態,將已經出現過的狀態直接返回,極大減少時間。

#include <bits/stdc++.h>
#define sz(X) (int)(X).size()
#define all1(X) (X).begin()+1,(X).end()
#define all(X) (X).begin(),(X).end()
#define debug1(X) std::cout << #X << ": " << X <<'\n'
#define debug2(X) std::cout << #X << ": " << X <<' '
using i64 = long long;
 
void close_sync() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cout.tie(nullptr);
}
int r[2000];
char s[2000];
int vis[1010][1010];
int n, m, x;
std::set<int>a;
 
void dfs(int y, int num) {
	if (num > m) {
		a.insert(y);
		return ;
	}
    if(vis[y][num]){
        return ;
    }else{
        vis[y][num]=1;
    }
//	debug1(num);
//	debug1(y);
	if (s[num] == '0') {
		if (y + r[num] > n) {
			y -= n;
		}
 
		dfs(y + r[num], num + 1);
	} else if (s[num] == '1') {
		if (y - r[num] <= 0) {
			y += n;
		}
		dfs(y - r[num], num + 1);
	} else {
		int y1 = y, y2 = y;
		if (y + r[num] > n) {
			y1 -= n;
		}
		if (y - r[num] <= 0) {
			y2 += n;
		}
		if(y1+r[num]==y2-r[num]){
			dfs(y1+r[num],num+1);
			return ;
		}
		dfs(y1 + r[num], num + 1);
		dfs(y2 - r[num], num + 1);
	}
 
}
 
void solve() {
    memset(vis,0,sizeof(vis));
	std::cin >> n >> m >> x;
	for (int i = 1; i <= m; i++) {
		std::cin >> r[i] >> s[i];
	}
	dfs(x, 1);
	std::cout << a.size() << "\n";
	for (std::set<int>::iterator i = a.begin(); i != a.end(); i++)
		std::cout << *i << " ";
	std::cout << "\n";
	a.clear();
}
 
int main() {
	close_sync();
 
	int _;
	std::cin >> _;
	while (_--)
		solve();
	return 0;
}

相關文章