Codeforces Round 911 (Div. 2)
A
有大于3的区间就可以无限取水,答案为2,其他的按照个数
#include <bits/stdc++.h>using namespace std;void solve()
{int n, k = 0;cin >> n;string s, t = "...";cin >> s;auto it = search(s.begin(), s.end(), t.begin(), t.end());if (it != s.end())cout << "2\n";else cout << count(s.begin() , s.end() , '.') << endl;
}int main()
{int T;cin >> T;while (T--){solve();}
}
B
对一个值考虑另外两个值发现另外两个的和只会-2或-0因此必须被2才成立
#include <bits/stdc++.h>using namespace std;void solve()
{int a , b , c;cin >> a >> b >> c;if((b+c)%2)cout << "0 ";else cout << "1 ";if((a+c)%2)cout << "0 ";else cout << "1 ";if((b+a)%2)cout << "0 ";else cout << "1 ";cout << endl;
}int main()
{int T;cin >> T;while (T--){solve();}
}
C
树形DP,dfs(u)表示从u开始走到树叶的最小值
#include <bits/stdc++.h>using namespace std;
const int N = 3e5 + 10;
int l[N], r[N];
char s[N];
int n;int dfs(int u)
{if (l[u] == 0 && r[u] == 0)return 0;int left = dfs(l[u]), right = dfs(r[u]);if (s[u] == 'L'){right++;if (l[u] == 0)return right;else if (r[u] == 0)return left;return min(left, right);}else if (s[u] == 'R'){left++;if (l[u] == 0)return right;else if (r[u] == 0)return left;return min(left, right);}left++;right++;if (l[u] == 0)return right;else if (r[u] == 0)return left;return min(left, right);
}void solve()
{cin >> n;for (int i = 1; i <= n; i++)cin >> s[i];for (int i = 1; i <= n; i++)cin >> l[i] >> r[i];cout << dfs(1) << endl;
}int main()
{int T;cin >> T;while (T--){solve();}
}