using node = struct { int l, r, b, id; }; vector<node> a(n); for (int i = 0; i < n; ++i) { cin >> a[i].l >> a[i].b; a[i].id = i; } sort(a.begin(), a.end(), [&](node a, node b) { return a.l == b.l ? a.b < b.b : a.l < b.l; });
vector<int> num(n), lst(n, -1); for (int i = 0; i < n; ++i) { num[a[i].b] = i; if (a[i].b) lst[i] = num[a[i].b - 1]; }
bool ok = 1; vector<vector<int>> vec(n + 1); for (int i = n - 1; i >= 0; --i) { if (!vec[a[i].b].empty() && a[vec[a[i].b].back()].l == a[i].l) ok = 0; vec[a[i].b].push_back(i); }
int noww = 1e6; for (auto& j : vec[0]) { a[j].r = noww--; if (a[j].l > a[j].r) ok = 0; }
for (int i = 1; i <= n; ++i) { int noww = 1e6; for (auto& j : vec[i]) { if (lst[j] == -1) ok = 0; noww = min(noww, a[lst[j]].r); a[j].r = noww--; if (a[j].r == a[lst[j]].r && a[j].l == a[lst[j]].l) { a[j].r = noww--; } if (a[j].l > a[j].r) ok = 0; } }
sort(a.begin(), a.end(), [&](node a, node b) { return a.id < b.id; });
if (!ok) printf("-1\n"); elsefor (int i = 0; i < n; ++i) { printf("%d\n", a[i].r); }
#include<cstdio> using ll = longlong; constexprint N = 5e5 + 8; inline ll read(){ ll S = 0, C = 0; char Y = getchar(); while (Y > 57 || Y < 48) C |= Y == 45, Y = getchar(); while (Y <= 57 && Y >= 48) S = (S << 3) + (S << 1) + Y - 48, Y = getchar(); return C ? -S : S; }
int a[N];
voideachT(){ int n = read(), m = read(); int t = n - m;
if (t == 2) { printf("-1\n"); return; }
if (t == 3) { a[1] = 3; a[2] = 2; a[3] = 1; } elseif (t % 3) { int now = t; for (int i = 1; i <= t; i += 3) a[i] = now--; for (int i = 2; i <= t; i += 3) a[i] = now--; for (int i = 3; i <= t; i += 3) a[i] = now--; } else { int now = t; for (int i = 1; i <= t; i += 3) a[i] = now--; a[t] = now--; for (int i = 2; i <= t - 2; i += 3) a[i] = now--; for (int i = 3; i <= t - 2; i += 3) a[i] = now--; a[t - 1] = now--; }
for (int i = n; i > t; --i) { printf("%d ", i); } for (int i = 1; i <= t; ++i) { printf("%d ", a[i]); } printf("\n"); }
intmain(){ for (int T = read(); T--; eachT()); return0; }
#include<iostream> #include<cmath> #include<algorithm> #include<cstring> usingnamespace std; using ll = longlong; constint N = 1000; char a[N][N];
intmain(){ int t; cin >> t; while (t--) { int n, m, k, x, y; char op; cin >> n >> m >> k; cin >> x >> y >> op; int ans = m + n; int flag = ((x & 1) ^ (y & 1));
// 初始为ABAB for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (((i & 1) ^ (j & 1)) == flag) { a[i][j] = op; } else { a[i][j] = 'A' + 'B' - op; } } }
// 从最大值开始 for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (ans == k) { a[i][j] = op; } elseif (a[i - 1][j - 1] == 'A' && a[i - 1][j] == 'B' && a[i][j - 1] == 'B' && a[i][j] == 'A') { ans++; } } }
if (ans == k) { cout << "Yes" << endl; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cout << a[i][j]; } cout << endl; } } else cout << "No" << endl; } return0; }
A. 如果某个元素是 1,那至少给它增加 1,我们只需要看非 1 的元素减少的量够不够给它增加 1,也就是它们的总和是否大于 n,再特判 n=1 的情形即可。
1 2 3 4 5 6
ll n = read(), sum = 0; for (int i = 0; i < n; ++i) { int x = read(); if (x > 1) sum += x; } printf("%s\n", n > 1 && sum >= n ? "Yes" : "No");
另一种(或许更容易理解的)思路是:分别计算当前总和以及所需的最小和 wt。
1 2 3 4 5 6 7 8
ll n = read(), sum = 0, wt = 0; for (int i = 0; i < n; ++i) { int x = read(); sum += x; if (x > 1) wt += 1; else wt += 2; } printf("%s\n", n > 1 && sum >= wt ? "Yes" : "No");
vector<int> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; }
vector<int> pre(n), suf(n); vector<int> mp(n); int x = 0; for (int i = 0; i < n; i++) { mp[a[i]]++; while (mp[x]) { x++; } pre[i] = x; } x = 0; mp.assign(n, 0); for (int i = n - 1; i > 0; i--) { mp[a[i]]++; while (mp[x]) { x++; } suf[i] = x; }
int ans = 0; for (int i = 1; i < n; ++i) { if (pre[i - 1] == suf[i]) { ans = i; } }
if (!ans) { cout << "-1\n"; } else { cout << "2\n1 " << ans << "\n" << ans + 1 << " " << n << "\n"; } }
int n = read(), k = read(); int bit = 0; while ((1ll << bit) <= k) ++bit; --bit; vector<int> ans; for (int i = 0; i < bit; ++i) ans.push_back(1ll << i); if (k - (1ll << bit)) ans.push_back(k - (1ll << bit)); if (k + 1 <= n) ans.push_back(k + 1); if (2 * k + 1 <= n) ans.push_back(2 * k + 1); if (3 * k + 1 <= n) ans.push_back(3 * k + 1); for (int x = 6 * k + 2; x <= n; x <<= 1) ans.push_back(x); print(ans);