Codeforces Round #697 (Div. 3)
A - Odd Divisor
int main() {
IOS;
for (cin >> _; _; --_) {
ll n; cin >> n;
while (n % 2 == 0) n /= 2;
cout << (n > 1 && (n & 1) ? "YES
" : "NO
");
}
return 0;
}
B - New Year's Number
int main() {
IOS;
for (cin >> _; _; --_) {
cin >> n;
int c = n / 2020; n %= 2020;
cout << (n <= c ? "YES
" : "NO
");
}
return 0;
}
C - Ball in Berland
计数, 去重
int main() {
IOS;
for (cin >> _; _; --_) {
cin >> n >> m >> k; vector<PII> a(k); VI x(n + 1), y(m + 1);
rep (i, 0, k - 1) cin >> a[i].fi;
rep (i, 0, k - 1) cin >> a[i].se;
sort(all(a)); a.erase(unique(all(a)), a.end());
for (auto &i : a) ++x[i.fi], ++y[i.se];
ll ans = 0;
rep (i, 0, a.size() - 1) {
--x[a[i].fi], --y[a[i].se];
ans += a.size() - i - 1 - x[a[i].fi] - y[a[i].se];
}
cout << ans << '
';
}
return 0;
}
D - Cleaning the Phone
按内存从大到小排序, 然后选择0~k-1 应用卸载, 并将0~k-1中的价值为2的选出来, 把剩下的价值为1的选出来
不断选择剩下最大内存的1去替换选中的2, 不断取价值最小值就行
int main() {
IOS;
for (cin >> _; _; --_) {
cin >> n >> m; vector<PLL> a(n); multiset<PLL> st, y;
rep(i, 0, n - 1) cin >> a[i].fi;
rep(i, 0, n - 1) cin >> a[i].se;
sort(all(a), greater<PLL>());
ll k = 0, cur = 0, g = 0, mi;
while (k < n && cur < m) {
cur += a[k].fi, g += a[k].se;
if (a[k].se == 2) st.insert(a[k]);
++k;
}
if (cur < m) { cout << "-1
"; continue; } mi = g;
for (int i = k; i < n && cur; ++i) if (a[i].se == 1) y.insert(a[i]);
while (!st.empty()) {
auto it = st.begin();
cur -= it->fi, g -= it->se; st.erase(it);
while (!y.empty() && cur < m) {
auto mx = *y.rbegin();
cur += mx.fi, g += mx.se;
y.erase(y.find(mx));
}
if (cur < m) break;
umin(mi, g);
}
cout << mi << '
';
}
return 0;
}
E - Advertising Agency
求个组合数学
ll inv[N], fac[N], facinv[N];
int C(int m, int n) {
return fac[n] * facinv[m] % mod * facinv[n - m] % mod;
}
void init() {
inv[0] = inv[1] = fac[0] = fac[1] = facinv[0] = facinv[1] = 1;
rep (i, 2, 2e5) {
fac[i] = fac[i - 1] * i % mod;
inv[i] = (mod - mod / i) * inv[mod % i] % mod;
facinv[i] = facinv[i - 1] * inv[i] % mod;
}
}
int main() {
IOS; init();
for (cin >> _; _; --_) {
cin >> n >> k; VI a(n);
for (auto &i : a) cin >> i;
sort(all(a), greater<int>());
int x = 0, y = 0;
for (int i = k - 1; (~i) && a[k - 1] == a[i]; --i) ++x;
for (int i = k; i < n && a[i] == a[k - 1]; ++i) ++y;
cout << C(x, x + y) << '
';
}
return 0;
}
F - Unusual Matrix
跟开关控制上下左右的题一样,
枚举第一行用不用异或1次, 之后, 第一行的数只能通过或列异或改变, 其他行的数只能通过行异或, 能选择的方式唯一, 判断是否可行即可
char a[N][N], b[N][N], d[N][N];
bool check() {
rep (i, 2, n) {
bool f = d[i][1] ^ b[i][1];
rep (j, 2, n) if (d[i][j] ^ b[i][j] ^ f) return 0;
}
return 1;
}
int main() {
IOS;
for (cin >> _; _; --_) {
cin >> n; bool f = 0;
rep (i, 1, n) cin >> a[i] + 1;
rep (i, 1, n) cin >> b[i] + 1;
memcpy(d, a, sizeof a);
rep (i, 1, n) if (d[1][i] != b[1][i]) rep (j, 1, n) d[j][i] = d[j][i] == '1' ? '0' : '1';
f = check();
memcpy(d, a, sizeof a); rep (i, 1, n) d[1][i] = d[1][i] == '1' ? '0' : '1';
rep (i, 1, n) if (d[1][i] != b[1][i]) rep (j, 1, n) d[j][i] = d[j][i] == '1' ? '0' : '1';
f = f | check();
cout << (f ? "YES
" : "NO
");
}
return 0;
}
G - Strange Beauty
枚举倍数就好了, nlogn, t <= 10, 总复杂度(O(tnlogn))
int main() {
IOS;
for (cin >> _; _; --_) {
cin >> n; VI a(2e5 + 1, 0), c(2e5 + 1, 0);
for (int i = 0; i < n; ++i) cin >> m, ++c[m];
for (int i = 1; i <= 2e5; ++i) if (c[i]) {
a[i] += c[i];
for (int j = i * 2; j <= 2e5; j += i) if (c[j]) umax(a[j], a[i]);
}
cout << n - (*max_element(all(a))) << '
';
}
return 0;
}