intmain(){ int T; scanf("%d", &T); while (T--) { LL n; int k; scanf("%lld%d", &n, &k); while (k) { n = f(n); k--; if (1 <= n && n <= 3) break; if (n == 4 || n == 5) { if (k & 1) n ^= 1; break; } } printf("%lld\n", n); } return0; }
T2
题目描述
小北写了一份 thoypn 语言代码。
thoypn 语言代码里只有两种语句:输出语句和循环语句。
而且 thoypn 语言类似 python 语言,用缩进来决定语法:
每一行只能写一条语句。
如果某条循环语句前面有 n 个 tab 的缩进,那么他后面至少一行要有大于等于 n + 1 个 tab 的缩进,这些行就是这条循环语句的循环体。而且他后面一行必须恰好有 n + 1个 tab 的缩进,不能多不能少。
inlinevoidupd(int o, int l, int r){ if (l == r) msgv[o] = Msg(A[l]); else { int mid = (l + r) / 2; msgv[o] = Merge(msgv[o << 1], msgv[o << 1 | 1], B[mid]); } }
voidBuild(int o, int l, int r){ if (l == r) A[l] = false; else { int mid = (l + r) / 2; B[mid] = false; Build(o << 1, l, mid); Build(o << 1 | 1, mid + 1, r); } upd(o, l, r); }
voidModifyA(int o, int l, int r, int x, bool a){ if (l > x || r < x) return; if (l == r) A[l] = a; else { int mid = (l + r) / 2; ModifyA(o << 1, l, mid, x, a); ModifyA(o << 1 | 1, mid + 1, r, x, a); } upd(o, l, r); }
voidModifyB(int o, int l, int r, int x, bool b){ if (l > x || r <= x) return; int mid = (l + r) / 2; ModifyB(o << 1, l, mid, x, b); ModifyB(o << 1 | 1, mid + 1, r, x, b); if (mid == x) B[mid] = b; upd(o, l, r); }
int n, V[N];
structTeam { int ty, i, v; // 0 : A, 1 : B Team() {} Team(int ty, int i) : ty(ty), i(i) { v = V[i] + ty * V[i + 1]; } booloperator<(const Team &r) const { return v < r.v; } } T[N * 2];
intmain(){ scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d", &V[i]); int m = 0; for (int i = 1; i <= n; ++i) T[m++] = Team(0, i); for (int i = 1; i < n; ++i) T[m++] = Team(1, i); Build(1, 1, n); std::sort(T, T + m); int ans = 0x7fffffff; for (int i = 0, j = 0; i < m; ++i) { while (!msgv[1].f[0][0] && j < m) { (T[j].ty ? ModifyB : ModifyA)(1, 1, n, T[j].i, true); ++j; } if (!msgv[1].f[0][0]) break; if (T[j - 1].v - T[i].v < ans) ans = T[j - 1].v - T[i].v; (T[i].ty ? ModifyB : ModifyA)(1, 1, n, T[i].i, false); } printf("%d\n", ans); }
inlineboolcmp(int x, int y){ return f[x] > f[y]; }
voiddfs(int x, int fa){ for (int y : T[x]) if (y != fa) dfs(y, x); std::sort(T[x].begin(), T[x].end(), cmp); if (fa) T[x].pop_back(); int l = T[x].size(), S = 0, u = 0; for (int i = 0; i < k - 1 && i < l; ++i) S += f[T[x][i]]; f[x] = S + A[x]; g[x] = 0; if (k - 1 < l) u = f[T[x][k - 1]]; for (int i = 0; i < k - 1 && i < l; ++i) g[x] = std::max(g[x], S - f[T[x][i]] + g[T[x][i]] + u); for (int i = k - 1; i < l; ++i) g[x] = std::max(g[x], S + g[T[x][i]]); g[x] += A[x]; }
intmain(){ scanf("%d%d", &n, &k); for (int i = 1; i <= n; ++i) scanf("%d", &A[i]); for (int i = 1, x, y; i < n; ++i) { scanf("%d%d", &x, &y); T[x].push_back(y); T[y].push_back(x); } dfs(1, 0); printf("%d\n", std::max(f[1], g[1])); return0; }