ll ans; char s[N]; int _T, n, m; int top, sta[N]; int tot, blo[N], deg[N]; int idx, low[N], dfn[N]; int cnt, head[N]; structedge {int v, w, next;} e[N << 2]; vector<pII> G[N];
voidaddedge(int u, int v, int w){ e[++cnt] = {v, w, head[u]}; head[u] = cnt; e[++cnt] = {u, w, head[v]}; head[v] = cnt; }
voidinit(){ ans = top = tot = idx = cnt = 0; for (int i = 0; i < N; ++i) { G[i].clear(); deg[i] = low[i] = dfn[i] = head[i] = 0; } }
voiddfs(int u, int fa){ sta[++top] = u; low[u] = dfn[u] = ++idx; for (int i = head[u]; i; i = e[i].next) { int v = e[i].v; if (!low[v]) { dfs(v, u); low[u] = min(low[u], low[v]); } elseif (v != fa) { low[u] = min(low[u], dfn[v]); } } if (dfn[u] == low[u]) { ++tot; int k; do { k = sta[top--]; blo[k] = tot; } while (k != u); } }
voidtarjan(){ for (int i = 1; i <= n; ++i) if (!low[i]) dfs(i, 0); for (int u = 1; u <= n; ++u) { for (int i = head[u]; i; i = e[i].next) { int v = e[i].v, w = e[i].w; if (blo[u] == blo[v]) continue; G[blo[u]].push_back({blo[v], w}); } } }
intsolve(int u, int fa){ int num = deg[u]; for (auto pii : G[u]) { int v = pii.fi, w = pii.se; if (v == fa) continue; int k = solve(v, u); num += k; ans += ll(abs(k)) * w; } return num; }
voidrun(){ init (); scanf("%d%d%s", &n, &m, s + 1); for (int i = 1; i <= m; ++i) { int u, v, w; scanf("%d%d%d", &u, &v, &w); addedge(u, v, w); } tarjan(); for (int i = 1; i <= n; ++i) { if (s[i] == 'A') deg[blo[i]]--; if (s[i] == 'H') deg[blo[i]]++; } solve(1, 0); printf("%lld\n", ans); }
intmain(){ scanf("%d", &_T); while (_T--) run(); return0; }
inlineintrd(){ int s = 0, w = 1; char ch = getchar(); while(ch < '0' || ch > '9'){if(ch == '-') w = -1; ch = getchar();} while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar(); return s * w; }
typedeflonglong ll; constint inf = 0x3f3f3f3f; constint maxn = 1e5 + 10; int n, m, q, mp[maxn], l, r, k;
structNode{ int v, r; Node () {} Node (int v, int r = 0) : v(v), r(r) {} booloperator < (const Node & a)const { return v < a.v; } };
set<Node> st;
voidgao(){ S_IT it; for(int i = m; i >= 1; i--){ if(mp[i] == 0) { int v = 0; int r = i; while (mp[i] == 0 && i >= 1) { v++; i--; } i++; it = st.lower_bound(Node(v)); if (it == st.end()) { st.insert(Node(v, r)); } } } }
voidrun(){ st.clear(); scanf("%d%d%d", &n, &m, &q); for(int i = 1; i <= m; i++){ mp[i] = 0; } while(n--){ scanf("%d%d", &l, &r); for(int i = l; i <= r; i++) mp[i] = 1; } gao(); while(q--){ scanf("%d", &k); S_IT it = st.lower_bound(Node(k)); if (it == st.end()) { printf("-1 -1\n"); } elseprintf("%d %d\n", it->r - k + 1, it->r); } }
intmain(){ int _T; _T = rd(); while (_T--) run(); return0; }
C - Large GCD
solved by Tryna. 0:38(+)
题解: 找一下规律发现n或m为偶数时答案为2,其余情况为12
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include<bits/stdc++.h> usingnamespacestd; int t, n, m; voidrun(){ scanf("%d", &t); while(t--){ scanf("%d%d", &n, &m); if(n % 2 == 0 || m % 2 == 0) puts("2"); elseputs("12"); } } intmain(){ run(); return0; }
int _T, n, m; string a, b, c; voidrun(){ map<char, int> mp; cin >> n >> m >> a >> b >> c; for (int i = 0; i < n; i++) { if (mp[a[i]]) mp[a[i]] = min(mp[a[i]], b[i] - '0' + 1); else mp[a[i]] = b[i] - '0' + 1; // 不确定值是否会有0的情况,索性都加上1避免 } int ans = 0; for (int i = 0; i < m; i++) { if (mp[c[i]] == 0) { ans = -1; break; } ans += mp[c[i]] - 1; } cout << ans << endl; }
intmain(){ cin >> _T; while (_T--) run(); return0; }
#define endl "\n" #define _for(i, a, b) for(int i = (a); i <= (b); ++i) #define dbg(x...) do { cout << #x << " -> "; err(x); } while (0) voiderr(){ cout << endl;} template <classT, class... Ts> voiderr(const T& arg, const Ts&... args){ cout << arg << ' '; err(args...);}
inlineintrd(){ int s = 0, w = 1; char ch = getchar(); while(ch < '0' || ch > '9'){if(ch == '-') w = -1; ch = getchar();} while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar(); return s * w; }
typedeflonglong ll; constint inf = 0x3f3f3f3f; constint maxn = 1e4 + 7; int n, k; int a[maxn], f; int minn, sum; voidrun(){ n = rd(); k = rd(); f = 0; minn = inf; sum = 0; int t; for (int i = 1; i <= n; ++i) { t = rd(); if (t < 0) { a[++f] = t; } else sum += t; minn = min(minn, abs(t)); } sort(a + 1, a + 1 + f); if (f == 0) { if (k & 1) sum -= minn * 2; } elseif (f >= k) { for (int i = 1; i <= k; ++i) { sum -= a[i]; } for (int i = k + 1; i <= f; ++i) { sum += a[i]; } } else { for (int i = 1; i <= f; ++i) { sum -= a[i]; } k -= f; if (k & 1) sum -= minn * 2; } printf("%d\n", sum); }
intmain(){ int _T; _T = rd(); while (_T--) run(); return0; }
#include<bits/stdc++.h> usingnamespacestd; inlineintrd(){ int s = 0, w = 1; char ch = getchar(); while(ch < '0' || ch > '9'){if(ch == '-') w = -1; ch = getchar();} while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar(); return s * w; }
constint N = 1e3 + 10; map<int, int> mp[N]; voidrun(){ for (int i = 0; i < N; i++) mp[i].clear(); int ans = 0; int n = rd(), m = rd(); for (int i = 1; i <= n; i++) { for (int j = 0; j < m; j++) { int x = rd(); mp[i][x]++; if (mp[i - 1][x]) { mp[i - 1][x]--; ans++; } } } printf("%d\n", ans); }
intmain(){ int _T = rd(); while (_T--) run(); return0; }
#define endl "\n" typedeflonglong ll; constint maxn = 1e3 + 7; int n, m, h, w; int a[maxn][maxn], pre[maxn][maxn];
boolin(int i, int j, int x, int y){ if (i >= x && i - h < x && j >= y && j - w < y) returntrue; returnfalse; }
boolcheck(int v){ int x, y; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { if (a[i][j] > v) pre[i][j] = 1; else pre[i][j] = 0; pre[i][j] += pre[i - 1][j] + pre[i][j - 1] - pre[i - 1][j - 1]; if (a[i][j] == v) x = i, y = j; } } for (int i = h; i <= n; ++i) { for (int j = w; j <= m; j++) { int tmp = pre[i][j] - pre[i - h][j] - pre[i][j - w] + pre[i - h][j - w]; if (!in(i, j, x, y)) { if (tmp == h * w / 2) returnfalse; } if (tmp < h * w / 2) { returnfalse; } } } returntrue; } voidsolve(){ cin >> n >> m >> h >> w; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { cin >> a[i][j]; } } int ans; int l = 1, r = 1000000, mid; while (l <= r) { mid = l + r >> 1; if (check(mid)) { ans = mid; l = mid + 1; } else r = mid - 1; } cout << ans << endl; }
intmain(){ ios::sync_with_stdio(false); cin.tie(nullptr);cout.tie(nullptr); int _T = 1; // cin >> _T; while (_T--) solve(); }