AtCoder Regular Contest 112
A.B = C
找规律,可以发现
①当
l
>
r
/
2
l > r / 2
l>r/2就一定为0个。
②
l
=
=
r
l == r
l==r的时候,除了0 0这一组是1,其他都是0。
③其余情况,写几个例子可以发现,其实就是一个
d
=
1
d=1
d=1的等差数列求和。
#define int long long
signed main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
IOS;
int T;
cin >> T;
while(T--)
{
int l,r;
cin >> l >> r;
if(l == r && l == 0) cout << 1 << endl;
else if(l > r / 2) cout << "0" << endl;
else
{
int t = r - l;
int n = t - l + 1;
cout << (1+n)*n/2 << endl;
}
}
}
B.-- - B
找规律,纯思维,想通就好写。
可以看看官方的
E
d
i
t
o
r
i
a
l
Editorial
Editorial.
分奇偶来看恰好花费C元的时候,能有多少个数字,然后最终答案就是恰好花费C元和恰好花费C-1元所能到达的数字的交集。
#include <bits/stdc++.h>
using namespace std;
pair<long, long> exact(const long &B, const long &C) {
const auto n = C / 2;
if (C % 2) {
return {-B - n, -B + n};
} else {
if (!C)
return {B, B};
return {B - n, B + n - 1};
}
}
int main() {
long B, C;
cin >> B >> C;
const auto [a, b] = exact(B, C);
const auto [c, d] = exact(B, C - 1);
cout << (b - a + 1) + (d - c + 1) - max(0l, min(b, d) - max(a, c) + 1)
<< endl;
return 0;
}
C. DFS
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> par(n - 1);
for (auto &v : par) {
cin >> v;
--v;
}
vector<vector<int>> g(n);
for (int v = 1; v < n; ++v) {
g[par[v - 1]].push_back(v);
}
vector<int> sz(n, 1);
vector<int> f(n, 1);
const auto rec = [&](auto &&rec, int v) -> void {
int sum = 0;
vector<int> seq;
for (const auto &w : g[v]) {
rec(rec, w);
sz[v] += sz[w];
if (sz[w] % 2) {
// case 3
seq.push_back(-f[w]);
} else {
if (f[w] < 0) {
// case 1
f[v] -= -f[w];
} else {
// case 2
sum += -f[w];
}
}
}
sort(seq.begin(), seq.end(), greater{});
seq.push_back(sum);
for (int i = 0; i < (int)seq.size(); ++i) {
if (i % 2) {
f[v] += seq[i];
} else {
f[v] -= seq[i];
}
}
};
rec(rec, 0);
cout << (n + f[0]) / 2 << endl;
return 0;
}
D.Skate
#include <atcoder/dsu>
#include <bits/stdc++.h>
using namespace std;
using namespace atcoder;
int main() {
int H, W;
cin >> H >> W;
vector<string> S(H);
for (auto &s : S)
cin >> s;
S[0][0] = S[0][W - 1] = S[H - 1][0] = S[H - 1][W - 1] = '#';
dsu d(H + W);
for (int r = 0; r < H; ++r)
for (int c = 0; c < W; ++c)
if (S[r][c] == '#')
d.merge(r, H + c);
unordered_set<int> row, col;
for (int r = 0; r < H; ++r)
row.insert(d.leader(r));
for (int c = 0; c < W; ++c)
col.insert(d.leader(H + c));
cout << min(row.size() - 1, col.size() - 1) << endl;
return 0;
}
E. Cigar Box Editorial
#include <atcoder/modint>
#include <bits/stdc++.h>
using namespace std;
using namespace atcoder;
using mint = modint998244353;
mint binom[3123][3123];
mint dp[3123][3123];
int main() {
int n, m;
cin >> n >> m;
vector<int> a(n);
for (auto &v : a)
cin >> v;
binom[0][0] = 1;
for (int i = 0; i <= n; ++i) {
for (int j = 0; j <= n; ++j) {
binom[i + 1][j] += binom[i][j];
binom[i + 1][j + 1] += binom[i][j];
}
}
dp[0][0] = 1;
for (int i = 0; i < m; ++i) {
for (int j = 0; j <= n; ++j) {
dp[i + 1][j] += dp[i][j] * 2 * j;
dp[i + 1][j + 1] += dp[i][j];
}
}
mint ans = 0;
for (int l = 0; l <= n; ++l) {
for (int r = n - l; r >= 0; --r) {
if (n - l - r >= 2 && a[n - r - 2] > a[n - r - 1])
break;
ans += dp[m][l + r] * binom[l + r][l];
}
}
cout << ans.val() << endl;
return 0;
}