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