A
如果会达到爆炸态,向后交换以推迟即可。
#include <bits/stdc++.h>
#define sc(x) scanf("%lld", &(x))
#define pr(x) printf("%lld ", (x))
#define rep(i, l, r) for (int i = l; i <= r; ++i)
using namespace std;
typedef long long ll;
const int N = 1e5 + 7;
const int mod = 1e9 + 7;
int main() {
ll T, n, x, d;
sc(T);
while (T--) {
sc(n), sc(x);
ll s = 0;
vector<ll> a;
rep(i, 1, n) sc(d), a.push_back(d), s += d;
if (s == x)
puts("NO");
else {
puts("YES");
ll sum = 0;
for (int i = 0; i < a.size(); ++i) {
sum += a[i];
if (sum == x)
if (i != a.size() - 1)
sum += a[i + 1] - a[i], swap(a[i], a[i + 1]);
}
for (ll val : a) pr(val);
puts("");
}
}
return 0;
} B
最小的方形(微元)只有2种状态:
- 两个三角的斜边拼接
- 4个三角的直角边拼接
故只需要n/2或者n/4是完全平方数即可
#include <bits/stdc++.h>
#define sc(x) scanf("%lld", &(x))
#define pr(x) printf("%lld\n", (x))
#define rep(i, l, r) for (int i = l; i <= r; ++i)
using namespace std;
typedef long long ll;
const int N = 1e5 + 7;
const int mod = 1e9 + 7;
bool isSqrt(ll n) {
ll x = sqrt(n);
return x * x == n;
}
int main() {
int T;
scanf("%d", &T);
ll n;
while (T--) {
scanf("%lld", &n);
if (n % 2 == 0 and isSqrt(n / 2))
puts("YES");
else if (n % 4 == 0 and isSqrt(n / 4))
puts("YES");
else
puts("NO");
}
return 0;
} C
优先选择当前最矮的栈去放方块。
#include <bits/stdc++.h>
#define sc(x) scanf("%lld", &(x))
#define pr(x) printf("%d ", (x))
#define rep(i, l, r) for (int i = l; i <= r; ++i)
using namespace std;
typedef long long ll;
const int N = 1e5 + 7;
const int mod = 1e9 + 7;
struct node {
ll val;
int id;
int to;
} a[N];
int T, n, m, x;
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d%d%d", &n, &m, &x);
rep(i, 1, n) {
sc(a[i].val);
a[i].id = i;
}
if (n < m) {
puts("NO");
continue;
}
sort(a + 1, a + 1 + n, [&](node x, node y) { return x.val > y.val; });
int p = 0, f = 1;
multimap<ll, int> mp;
rep(i, 1, m) {
mp.insert(make_pair(a[i].val, i));
a[i].to = i;
}
rep(i, m + 1, n) {
pair<ll, int> top = *mp.begin();
top.first += a[i].val;
mp.erase(mp.begin());
a[i].to = top.second;
mp.insert(top);
}
ll mn = (*mp.begin()).first, mx = mn;
for (auto v : mp) mx = max(v.first, mx);
if (mx - mn > x) {
puts("NO");
continue;
}
puts("YES");
sort(a + 1, a + 1 + n, [&](node x, node y) { return x.id < y.id; });
rep(i, 1, n) pr(a[i].to);
putchar(10);
}
return 0;
} D
- 先把能凑的左右凑出来
- 再把多的一边里面,能通过换边,凑出一对的,换边。直到左右两边数目一致
- 调整单边颜色即可
#include <bits/stdc++.h>
#define sc(x) scanf("%d", &(x))
#define pr(x) printf("%lld\n", (x))
#define rep(i, l, r) for (int i = l; i <= r; ++i)
using namespace std;
typedef long long ll;
const int N = 2e5 + 7;
const int mod = 1e9 + 7;
int a[N];
int main() {
int T, n, left, right;
sc(T);
while (T--) {
sc(n), sc(left), sc(right);
rep(i, 1, n) sc(a[i]);
map<int, int> l, r;
rep(i, 1, left) l[a[i]] += 1;
rep(i, left + 1, n) { // 去重
if (l.count(a[i])) {
l[a[i]] -= 1;
left -= 1, right -= 1;
if (l[a[i]] == 0) l.erase(a[i]);
} else
r[a[i]] += 1;
}
// for (auto p : l) cout << "L " << p.first << ' ' << p.second << '\n';
// for (auto p : r) cout << "R " << p.first << ' ' << p.second << '\n';
ll cost = 0;
// 自我消除
if (left > right)
for (map<int, int>::iterator i = l.begin(); i != l.end(); ++i) {
int &cnt = (*i).second;
if (cnt >= 2) {
if (left - (cnt - cnt % 2) >= right) {
left -= cnt - cnt % 2;
cost += cnt / 2;
cnt %= 2;
} else {
ll d = left - right;
cost += d / 2;
left -= d;
cnt -= d * 2;
break;
}
}
if (left == right) break;
}
else if (right > left)
for (map<int, int>::iterator i = r.begin(); i != r.end(); ++i) {
int &cnt = (*i).second;
if (cnt >= 2) {
if (right - (cnt - cnt % 2) >= left) {
right -= cnt - cnt % 2;
cost += cnt / 2;
cnt %= 2;
} else {
ll d = right - left;
cost += d / 2;
right -= d;
cnt -= d * 2;
break;
}
}
if (left == right) break;
}
ll lcnt = 0, rcnt = 0;
for (auto p : l) lcnt += p.second;
for (auto p : r) rcnt += p.second;
cerr << lcnt << ' ' << rcnt << '\n';
cost += min(lcnt, rcnt);
ll d = abs(lcnt - rcnt);
cost += d;
pr(cost);
}
return 0;
} E
#include <bits/stdc++.h>
#define sc(x) scanf("%lld", &(x))
#define pr(x) printf("%lld\n", (x))
#define rep(i, l, r) for (int i = l; i <= r; ++i)
using namespace std;
typedef long long ll;
const int N = 1e5 + 7;
int n, mod;
ll pow2[401], dp[401][401], comb[401][401];
signed main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n >> mod;
pow2[0] = 1;
rep(i, 1, n) pow2[i] = pow2[i - 1] * 2 % mod;
rep(i, 0, n) { // Pascal三角组合数
comb[i][0] = comb[i][i] = 1;
for (int j = 1; j < i; j++)
comb[i][j] = (comb[i - 1][j] + comb[i - 1][j - 1]) % mod;
}
rep(i, 1, n) {
dp[i][i] = pow2[i - 1];
for (int j = i / 2 + 1; j < i; ++j) {
for (int k = i - 1; k > 1 && j - i + k > 0; --k) {
dp[i][j] = (dp[i][j] + dp[k - 1][j - i + k] * comb[j][i - k] %
mod * pow2[i - k - 1]) %
mod;
}
}
}
ll ans = 0;
for (int i = 1; i <= n; i++) ans = (ans + dp[n][i]) % mod;
cout << ans;
} 
京公网安备 11010502036488号