对于数组 b 的第 i 位,其取值在 [ai−1+1,ai)∪(ai,ai+1−1] 内,共 fi=ai+1−ai−1−2 个。对于区间 [l,r],能生成的不同的数组 b 共有 l≤i≤r∑fi=ar+1+ar−al−al−1−2∗(r−l+1) 个,其中规定 ar+1=k+1,al−1=0。
Code
Replace and Keep Sorted
1 2 3 4 5 6 7 8 9 10 11 12 13
constint MAXN = 1E5 + 5; int n, q, k, a[MAXN]; voidsolve(){ cin >> n >> q >> k; for (int i = 1; i <= n; i++) cin >> a[i]; a[0] = 0, a[n + 1] = k + 1; for (int i = 1; i <= q; i++) { int l, r; cin >> l >> r; cout << k + 1 + a[r] - a[l] - 2 * (r - l + 1) << endl; } }
设 a=kb+r,由 ⌊ba⌋=amodb 解得 k=r,即 a=k(b+1),且 b>k。因为 k2≤kb+k≤x, 故 k≤x。又由于 1≤kb+k≤x,故有 k<b≤kx−1。我们在 x 内枚举 k,对每一个 k 容易求出满足条件的 b 的个数。
Code
Floor and Mod
1 2 3 4 5 6 7
voidsolve(int testNum){ int x, y; cin >> x >> y; LL ans = 0; for (int k = 1; k <= sqrt(x); k++) ans += max(0, min(y, x / k - 1) - k); cout << ans << endl; }
constint MAXN = 2E5 + 5; constint MOD = 1E9 + 7; int n, m, d, dp[MAXN], a[MAXN], mxSonVal[MAXN], fa[MAXN]; int pre[MAXN], pos[MAXN]; vector<int> G[MAXN]; vector<pair<int, int> > v[MAXN];
voiddfs1(int now, int f, int level){ v[level].push_back(make_pair(a[now], now)); fa[now] = f; d = max(d, level); for (auto& to : G[now]) if (to != f) dfs1(to, now, level + 1); }
voidlevelDp(){ for (int level = d; level >= 0; level--) { int cnt = v[level].size(); for (int i = 0; i < cnt; i++) { int node = v[level][i].second; dp[node] = max(dp[node], mxSonVal[node] + max(a[node] - v[level][0].first, v[level][cnt - 1].first - a[node])); } for (int i = 0; i < cnt; i++) { int node = v[level][i].second; if (i == 0) pre[i] = -a[node] + mxSonVal[node]; else pre[i] = max(pre[i - 1], -a[node] + mxSonVal[node]); } for (int i = cnt - 1; i >= 0; i--) { int node = v[level][i].second; if (i == cnt - 1) pos[i] = a[node] + mxSonVal[node]; else pos[i] = max(pos[i + 1], a[node] + mxSonVal[node]); } for (int i = 0; i < cnt; i++) { int res = 0; int node = v[level][i].second; res = max({res, pre[i] + a[node], pos[i] - a[node]}); dp[node] = max(dp[node], res); mxSonVal[fa[node]] = max(mxSonVal[fa[node]], dp[node]); } } }
voidsolve(int caseNum){ read(n); for (int i = 2; i <= n; i++) { int v; read(v); G[i].push_back(v); G[v].push_back(i); } for (int i = 2; i <= n; i++) read(a[i]); dfs1(1, 1, 0); for (int i = 1; i <= n; i++) sort(v[i].begin(), v[i].end()); levelDp(); printf("%lld\n", dp[1]); for (int i = 0; i <= n; i++) { G[i].clear(), v[i].clear(); dp[i] = 0, mxSonVal[i] = 0; } d = 0; }
signedmain(){ int testCase = 1; read(testCase); for (int i = 1; i <= testCase; i++) solve(i); return0; }