牛客周赛 Round 34
A
void solve()
{
string a, b;
cin >> a >> b;
set<string> s;
s.insert(a);
s.insert(b);
s.insert(a + b);
s.insert(b + a);
cout << s.size() << endl;
for (auto i : s)
cout << i << endl;
}
B
void solve()
{
int n;
cin >> n;
vector<int> a(n + 1);
set<int> s;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
if (a[i] <= n && a[i] >= 1)
s.insert(a[i]);
}
if (s.size() != n)
cout << "0" << endl;
else
{
cout<<1<<endl;
cout<<"1 100000000"<<endl;
}
}
C
注意sort的比较函数要满足严格偏序
bool cmp(string a, string b)
{
if (a.size() != b.size())
return a.size() < b.size();
for (int i = 0; i < a.size(); i++)
{
if (a[i] != b[i])
return (a[i] - '0') < (b[i] - '0');
}
return false;
}
void solve()
{
string s, res = "";
res.clear();
vector<string> ans;
cin >> s;
for (auto i : s)
{
res += i;
if (res.back() == '0' || res.back() == '2' || res.back() == '4' || res.back() == '6' || res.back() == '8')
ans.push_back(res), res.clear();
}
sort(ans.begin(), ans.end(), cmp);
for (auto i : ans)
cout << i << endl;
}
D
分类讨论
特判全是0的情况
void solve()
{
int n;
cin >> n;
vector<ll> a(n + 1, 0);
for (int i = 1; i <= n; i++)
cin >> a[i];
auto cal = [&]() -> ll
{
ll s = 0;
for (int i = 2; i <= n; i++)
s += abs(a[i] - a[i - 1]);
return s;
};
if (a[1])
{
for (int i = 2; i < n; i++)
if (!a[i])
a[i] = a[i - 1];
if (!a[n])
{
if (a[n - 1] != a[1])
a[n] = a[n - 1];
else
a[n] = a[n - 1] + 1;
}
}
else if (a[n])
{
for (int i = n - 1; i >= 2; i--)
if (!a[i])
a[i] = a[i + 1];
if (!a[1])
{
if (a[2] != a[n])
a[1] = a[2];
else
a[1] = a[2] + 1;
}
}
else
{
for (int i = 2; i <= n; i++)
if (!a[i])
a[i] = a[i - 1];
for (int i = 1; i <= n; i++)
if (a[i])
{
if (a[i] == a[n])
{
for (int j = 1; j < i; j++)
a[j] = a[i] + 1;
}
else
{
for (int j = 1; j < i; j++)
a[j] = a[i];
}
break;
}
}
int cnt = 0;
for (int i = 1; i <= n; i++)
if (!a[i])
cnt++;
if (cnt == n)
{
a[1] = 1;
for (int i = 2; i <= n; i++)
a[i] = 2;
}
if (cal() == 1)
{
for (int i = 1; i <= n; i++)
cout << a[i] << " ";
cout << endl;
}
else
cout << "-1" << endl;
}
E
void solve()
{
int n;
cin >> n;
vector<vector<int>> e(n + 1);
vector<char> c(n + 1);
for (int i = 1; i <= n; i++)
cin >> c[i];
for (int i = 1; i < n; i++)
{
int u, v;
cin >> u >> v;
e[u].push_back(v), e[v].push_back(u);
}
vector<vector<int>> f(n + 1, vector<int>(2, 0));
auto dfs = [&](auto dfs, int u, int fa) -> void
{
if (c[u] == '?')
f[u][1] = f[u][0] = 1;
if (c[u] == 'd')
f[u][1] = 1;
if (c[u] == 'p')
f[u][0] = 1;
for (auto to : e[u])
if (to != fa)
{
dfs(dfs, to, u);
if (f[to][0] && !f[to][1])
f[u][0] = 0;
if (!f[to][0] && f[to][1])
f[u][1] = 0;
if (!f[to][0] && !f[to][1])
f[u][1] = f[u][0] = 0;
}
};
dfs(dfs, 1, 0);
auto draw = [&](auto draw, int u, int fa, int t) -> void
{
if (c[u] == '?')
c[u] = (t ? 'd' : 'p');
for (auto to : e[u])
if (to != fa)
draw(draw, to, u, 1 - t);
};
if (f[1][0] || f[1][1])
{
if (f[1][0])
draw(draw, 1, 0, 0);
else if (f[1][1])
draw(draw, 1, 0, 1);
for (int i = 1; i <= n; i++)
cout << c[i];
cout << endl;
}
else
cout << "-1" << endl;
}
F
首先注意到可以构造一个2*2的矩形,把x平均放入,这样就解决了x%4==0
剩下的x%4==2
011
101
110
void solve()
{
int n, m, x;
cin >> n >> m >> x;
vector<vector<int>> ans(n + 1, vector<int>(m + 1, 0));
if (x == 2)
{
cout << "-1" << endl;
return;
}
if (x % 4 == 0)
{
for (int i = 1; i <= 2; i++)
for (int j = 1; j <= 2; j++)
ans[i][j] = x / 4;
}
else
{
x -= 6;
for (int i = 1; i <= 2; i++)
for (int j = 1; j <= 2; j++)
ans[i][j] = x / 4;
ans[2][3]++, ans[2][4]++, ans[3][4]++;
ans[3][2]++, ans[4][2]++, ans[4][3]++;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
cout << ans[i][j] << " ";
cout << endl;
}
}
G
如果没有颜色限制,就是置换环板子
但是有了颜色限制后,纯色环就无法操作了,需要先把纯色环变成混色环
按照优先级考虑:
1.红环+白环
2.红环+混环/白环+混环
特殊的,如果环的大小为1,是不需要成为混环的,但是可以帮助别的纯色环变成混环,按照贪心尽量往后放
void solve()
{
int n, ans = 0;
cin >> n;
vector<int> a(n + 1), vis(n + 1, 0);
vector<char> c(n + 1);
vector<pii> r, w, h;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++)
cin >> c[i];
for (int i = 1; i <= n; i++)
{
if (vis[i])
continue;
int cntr = 0, cntw = 0, u = i, sz = 0;
while (!vis[u])
{
vis[u] = 1, sz++;
if (c[u] == 'W')
cntw = u;
else
cntr = u;
u = a[u];
}
if (cntr && !cntw)
r.push_back({sz, cntr});
else if (!cntr && cntw)
w.push_back({sz, cntw});
else
h.push_back({cntr, cntw});
}
sort(r.begin(), r.end()), sort(w.begin(), w.end());
while (w.size() && r.size())
{
auto [nw, pw] = w.back();
auto [nr, pr] = r.back();
w.pop_back(), r.pop_back();
if (nw == 1 && nr == 1)
continue;
swap(a[pw], a[pr]);
h.push_back({pw, pr});
ans++;
}
while (w.size() && h.size())
{
auto [nw, pw] = w.back();
auto [posr, posw] = h.back();
w.pop_back();
if (nw == 1)
continue;
swap(a[pw], a[posr]);
h.push_back({posr, pw});
ans++;
}
while (r.size() && h.size())
{
auto [nr, pr] = r.back();
auto [posr, posw] = h.back();
r.pop_back();
if (nr == 1)
continue;
swap(a[pr], a[posw]);
h.push_back({pr, posw});
ans++;
}
int szr = r.size(), szw = w.size();
for (auto i : r)
szr -= (i.x == 1);
for (auto i : w)
szw -= (i.x == 1);
if (szr || szw)
{
cout << "-1" << endl;
return;
}
for (int i = 1; i <= n; i++)
vis[i] = 0;
for (int i = 1; i <= n; i++)
if (!vis[i])
{
int u = i, sz = 0;
while (!vis[u])
vis[u] = 1, sz++, u = a[u];
ans += sz - 1;
}
cout << ans << endl;
}