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;
}