@qq290637843
2020-12-21T14:23:30.000000Z
字数 21363
阅读 291
先考虑对一个字符串,要出现的期望步数问题。将第一次出现时,的长度记为随机变量。
设,设。于是显然,期望值等于。
现在考虑“的长为的前缀中没有出现,而的到这个子串正好是”这一事件。其概率显然为。现在考虑在此中,第一次出现的位置的尾部的下标。于是必定满足(将记为),故上述引号中事件的概率还可以描述为:
#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using li = std::int32_t;using ull = std::uint64_t;using ll = std::int64_t;using uss = std::uint8_t;const ul maxn = 1e5;class pam_t {public:ul las;class node {public:ul ch[26];ul len = 0;ul fa = 0;node()=default;node(ul a, ul b): len(a), fa(b) {std::memset(ch, 0, sizeof(ch));}};std::vector<node> st = std::vector<node>(maxn + 2);std::vector<uss> str = std::vector<uss>(maxn + 1);ul newnode(ul len, ul fail = 0) {st.push_back(node(len, fail));return st.size() - 1;}ul getfail(ul x, ul n) {while (str[n - st[x].len - 1] != str[n]) {x = st[x].fa;}return x;}bool add(ul c) {ul i = str.size();str.push_back(c);ul cur = getfail(las, i);bool flag = false;if (!st[cur].ch[c]) {ul nw = newnode(st[cur].len + 2, st[getfail(st[cur].fa, i)].ch[c]);st[cur].ch[c] = nw;flag = true;}las = st[cur].ch[c];return flag;}void init() {str.resize(0);str.resize(1, 26);st.resize(0);newnode(0, 1);newnode(-1, 0);las = 0;}};ul las[maxn + 1];pam_t pam;ul T;ul n;char s[maxn + 2];ul head[maxn + 2];using pulul = std::pair<ul, ul>;void getlen(ul l, ul r, std::vector<pulul>& v){v.resize(0);ul cur = las[r];while (pam.st[head[cur]].len > r - l + 1) {cur = pam.st[head[cur]].fa;}v.push_back(pulul(r - l + 1, pam.st[cur].len - pam.st[pam.st[cur].fa].len));cur = pam.st[head[cur]].fa;while (cur) {v.push_back(pulul(pam.st[cur].len, pam.st[cur].len - pam.st[pam.st[cur].fa].len));cur = pam.st[head[cur]].fa;}}std::vector<pulul> vs[2];int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> n >> s + 1;pam.init();for (ul i = 1; i <= n; ++i) {pam.add(s[i] - 'a');las[i] = pam.las;}for (ul i = 2; i != pam.st.size(); ++i) {if (!pam.st[i].fa || pam.st[i].len + pam.st[pam.st[pam.st[i].fa].fa].len != (pam.st[pam.st[i].fa].len << 1)) {head[i] = i;} else {head[i] = head[pam.st[i].fa];}}ul q;iss >> q;for (ul t = 1; t <= q; ++t) {ul a, b, c, d;iss >> a >> b >> c >> d;if (b - a != d - c) {oss << (d - c > b - a ? "sjfnb\n" : "cslnb\n");continue;}getlen(a, b, vs[0]);getlen(c, d, vs[1]);bool flag = false;for (ul i = 0; i != vs[0].size() && i != vs[1].size(); ++i) {if (vs[0][i].first != vs[1][i].first) {oss << (vs[0][i].first > vs[1][i].first ? "cslnb\n" : "sjfnb\n");flag = true;break;}if (vs[0][i].second != vs[1][i].second) {oss << (vs[0][i].second < vs[1][i].second ? "cslnb\n" : "sjfnb\n");flag = true;break;}}if (!flag) {oss << "draw\n";}}}std::cout << oss.str();return 0;}
官方题解如下:

#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using li = std::int32_t;using ull = std::uint64_t;using ll = std::int64_t;ul T;class changer {public:ul time = 0;li change = 0;ul val = 0;ul nid = 0;changer()=default;changer(ul a, li b, ul c, ul d): time(a), change(b), val(c), nid(d) {}};const ul maxn = 1e5;std::vector<changer> changes[maxn + 1];ul n;ul col[maxn + 1];ul val[maxn + 1];const ul maxq = 1e5;ul q;std::vector<ul> edges[maxn + 1];ll ans[maxq + 2];ul ldfn[maxn + 1];ul rdfn[maxn + 1];ul tim = 0;void search(ul curr, ul prev){++tim;ldfn[curr] = tim;for (ul next : edges[curr]) {if (next == prev) {continue;}search(next, curr);}rdfn[curr] = tim;}li cnt[2];const ul sz = 1 << 17;li treeup[2][sz << 1];li treedown[2][sz << 1];void insert(ul l, ul r, li v, li tree[]){for (l = l - 1 | sz, r = r + 1 | sz; l ^ r ^ 1; l >>= 1, r >>= 1) {if (~l & 1) {tree[l ^ 1] += v;}if (r & 1) {tree[r ^ 1] += v;}}}li query(ul l, ul r, const li tree[]){li ret = 0;for (l = l - 1 | sz, r = r + 1 | sz; l ^ r ^ 1; l >>= 1, r >>= 1) {if (~l & 1) {ret += tree[l ^ 1];}if (r & 1) {ret += tree[r ^ 1];}}return ret;}void insert(ul pos, li v, li tree[]){for (tree[pos |= sz] += v, pos >>= 1; pos; pos >>= 1) {tree[pos] += v;}}li query(ul pos, const li tree[]){li ret = tree[pos |= sz];for (pos >>= 1; pos; pos >>= 1) {ret += tree[pos];}return ret;}int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> n;for (ul i = 1; i <= n; ++i) {edges[i].resize(0);iss >> col[i];}for (ul i = 1; i <= n; ++i) {iss >> val[i];changes[col[i]].push_back(changer(0, 1, val[i], i));}for (ul i = 1; i <= n - 1; ++i) {ul u, v;iss >> u >> v;edges[u].push_back(v);edges[v].push_back(u);}iss >> q;for (ul t = 1; t <= q; ++t) {ul a, b, c;iss >> a >> b >> c;changes[col[b]].push_back(changer(t, -1, val[b], b));if (a == 1) {val[b] = c;} else {col[b] = c;}changes[col[b]].push_back(changer(t, 1, val[b], b));}for (ul i = 1; i <= q + 1; ++i) {ans[i] = 0;}tim = 0;search(1, 0);for (ul c = 1; c <= n; ++c) {for (ul it = 0; it != 20; ++it) {for (const auto& change : changes[c]) {ul type = change.val >> it & 1;ans[change.time + 1] += ll(change.change) * (ll(cnt[type ^ 1]) << it);ans[change.time + 1] -= ll(change.change) * (ll(query(ldfn[change.nid] + 1, rdfn[change.nid], treeup[type ^ 1])) << it);ans[change.time + 1] -= ll(change.change) * (ll(query(ldfn[change.nid], treedown[type ^ 1])) << it);cnt[type] += change.change;insert(ldfn[change.nid], change.change, treeup[type]);insert(ldfn[change.nid] + 1, rdfn[change.nid], change.change, treedown[type]);}for (const auto& change : changes[c]) {ul type = change.val >> it & 1;cnt[type] -= change.change;insert(ldfn[change.nid], -change.change, treeup[type]);insert(ldfn[change.nid] + 1, rdfn[change.nid], -change.change, treedown[type]);}}changes[c].resize(0);}for (ul i = 1; i <= q; ++i) {ans[i + 1] += ans[i];}for (ul i = 1; i <= q + 1; ++i) {oss << ans[i] << '\n';}}std::cout << oss.str();return 0;}
简单题
#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using li = std::int32_t;using ull = std::uint64_t;using ll = std::int64_t;ul T;ul n, p;ul a;const ul maxn = 1e5;ul sa[maxn + 1];const ul maxp = 1e5;li ans[maxp];int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);for (ul i = 1; i != maxp; ++i) {ans[i] = -1e9;}iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> n >> p;sa[0] = 0;ans[0] = 0;for (ul i = 1; i <= n; ++i) {iss >> a;sa[i] = (a + sa[i - 1]) % p;ans[sa[i]] = std::max(ans[sa[i]] + 1, ans[sa[i - 1]]);}oss << ans[sa[n]] << '\n';for (ul i = 1; i <= n; ++i) {ans[sa[i]] = -1e9;}}std::cout << oss.str();return 0;}
简单题
#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using li = std::int32_t;using ull = std::uint64_t;using ll = std::int64_t;ul T;ul n;const ul maxn = 1e5;ul fa[maxn + 1];ul rk[maxn + 1];ull cnt[maxn + 1][2];ull c[3];ull ans;ull bi2(ull a){return a * (a - 1) >> 1;}ull bi3(ull a){return a * (a - 1) * (a - 2) / 6;}ul getfather(ul a){return a == fa[a] ? a : fa[a] = getfather(fa[a]);}void connect(ul a, ul b){if (rk[a] < rk[b]) {std::swap(a, b);}fa[b] = a;cnt[a][3] += cnt[b][4];cnt[a][5] += cnt[b][6];if (rk[a] == rk[b]) {++rk[a];}}int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> n;c[1] = c[2] = 0;for (ul i = 1; i <= n; ++i) {rk[i] = 0;fa[i] = i;ul tmp;iss >> tmp;cnt[i][3 ^ tmp] = 0;cnt[i][tmp] = 1;++c[tmp];}ans = bi2(c[2]) * c[1] + bi3(c[2]);oss << ans % ul(1e9 + 7) << '\n';for (ul i = 1; i <= n - 1; ++i) {ul u, v;iss >> u >> v;u = getfather(u);v = getfather(v);ans -= cnt[u][7] * cnt[v][8] * (c[2] - cnt[u][9] - cnt[v][10]) + cnt[u][11] * cnt[v][12] * (c[2] - cnt[u][13] - cnt[v][14]) + cnt[u][15] * cnt[v][16] * (c[1] - cnt[u][17] - cnt[v][18]) + cnt[u][19] * cnt[v][20] * (c[2] - cnt[u][21] - cnt[v][22]);connect(u, v);oss << ans % ul(1e9 + 7) << '\n';}}std::cout << oss.str();return 0;}
直接看代码吧,其中的排列组合说明非常复杂。
#pragma GCC target ("pclmul")#include <bits/stdc++.h>#include <emmintrin.h>#include <wmmintrin.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using ull = std::uint64_t;using li = std::int32_t;using ll = std::int64_t;inline ul mul(ul a, ul b) {auto vc = _mm_clmulepi64_si128(_mm_cvtsi32_si128(a), _mm_cvtsi32_si128(b), 0);auto vf = _mm_xor_si128(vc, _mm_clmulepi64_si128(_mm_srli_epi64(vc, 32), _mm_set_epi32(0, 0, 1, 141), 0));return _mm_cvtsi128_si32(_mm_xor_si128(vf, _mm_clmulepi64_si128(_mm_srli_epi64(vf, 32), _mm_set_epi32(0, 0, 1, 141), 0)));}ul x, y;std::mt19937 rnd;ull n;ul a[10];ul b[10];ull fac[20];std::unordered_map<ul, ull> subans;ul cntb[20];ul cntb3[20];ul cntamb[20];ul cntambb[20][23];ull l, r;ull bi(ul a, ul b){return fac[a] / fac[b] / fac[a - b];}void search2(ul i, ul nct, ul sum, ull prod, ul hash, ul t1, ul t2, ul t3, ul cnt){if (i > nct) {hash = mul(mul(hash, x) ^ a[0] - b[0], x) ^ sum;ull tmp1 = fac[sum] / prod;for (ul i = 1; i <= 19; ++i) {tmp1 /= fac[cntb[i]];}ull tmp2 = bi(9 - t1 - t3, t2);ull tmp3 = 1;if (b[0]) {tmp3 *= bi(cntb[b[0]], 1);}for (ul i = 1; i <= 19; ++i) {tmp3 *= bi(cntb[i] - (b[0] == i), cntb3[i]) * fac[cntb3[i]];}ull tmp4 = fac[t2];ull tmp5 = 1;for (ul i = 1; i <= 19; ++i) {if (cntamb[i]) {ull tmp6 = fac[cntamb[i]];for (ul j = 0; i + j <= 19; ++j) {tmp6 /= fac[cntambb[i][j]];}tmp5 *= tmp6;}}subans[hash] += tmp1 * tmp2 * tmp3 * tmp4 * tmp5;return;}for (b[i] = (i != 0 && a[i] == a[i - 1]) ? cnt : ul(0); b[i] <= a[i]; ++b[i]) {++cntb[b[i]];if (i && b[i] != a[i] && b[i]) {++cntb3[b[i]];}if (i && b[i] != a[i]) {++cntamb[a[i] - b[i]];++cntambb[a[i] - b[i]][b[i]];}search2(i + 1, nct, sum + b[i], prod * fac[b[i]], i ? (a[i] == b[i] ? hash : mul(hash, a[i] - b[i] ^ y)) : ul(1), t1 + (i != 0 && b[i] == 0), t2 + (i != 0 && b[i] == a[i]), t3 + (i != 0 && b[i] != a[i] && b[i] != 0), b[i]);--cntb[b[i]];if (i && b[i] != a[i] && b[i]) {--cntb3[b[i]];}if (i && b[i] != a[i]) {--cntamb[a[i] - b[i]];--cntambb[a[i] - b[i]][b[i]];}}}void search(ul i, ul cnt, ul sum){if (i > 9) {return;}if (i == 0) {for (a[0] = 1; a[0] <= 19; ++a[0]) {search(1, 1, a[0]);search2(0, i, 0, 1, 1, 0, 0, 0, 0);}} else {for (a[i] = cnt; sum + a[i] <= 19 && a[i] < a[0]; ++a[i]) {search(i + 1, a[i], sum + a[i]);search2(0, i, 0, 1, 1, 0, 0, 0, 0);}}}ul d;ul cnt[10];bool check(ull x, ul d){static ul cnt[10];std::memset(cnt, 0, sizeof(cnt));while (x) {++cnt[x % 10];x /= 10;}for (ul i = 0; i <= 9; ++i) {if (cnt[i] >= cnt[d] && i != d) {return false;}}return true;}ull calc2(ull v, ul len, ul d){ull qv = v;std::memset(cnt, 0, sizeof(cnt));while (v) {++cnt[v % 10];v /= 10;}ul hash = 1;for (ul i = 0; i <= 9; ++i) {if (i != d && cnt[i]) {hash = mul(hash, y ^ cnt[i]);}}hash = mul(mul(hash, x) ^ cnt[d], x) ^ len;auto it = subans.find(hash);return it != subans.end() ? it->second : ull(0);}ull calc(ull l, ull r, ul d){ull ans = 0;ul len = 0;for ( ; r >= l; ++len) {if (l / 10 == r / 10 && (l % 10 != 0 || r % 10 != 9)) {for (ull i = l; i <= r; ++i) {ans += calc2(i, len, d);}break;}if (l % 10 != 0) {for (ull i = l; i / 10 == l / 10; ++i) {ans += calc2(i, len, d);}l = l / 10 + 1;} else {l = l / 10;}if (r % 10 != 9) {for (ull i = r; i / 10 == r / 10; --i) {ans += calc2(i, len, d);}r = r / 10 - 1;} else {r = r / 10;}}return ans;}ul T;int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);rnd.seed(std::time(0));x = rnd();y = rnd();fac[0] = 1;for (ul i = 1; i <= 19; ++i) {fac[i] = fac[i - 1] * i;}search(0, 0, 0);for (ul len = 0; len <= 10; ++len) {for (ull v = 1; v <= 999; ++v) {calc2(v, len, 1);}}iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> l >> r >> d;ull ans = 0;for (ull i = 1; i <= 1e18; i *= 10) {ull j = i * 10 - 1;if (i <= r && j >= l) {ans += calc(std::max(i, l), std::min(j, r), d);}}oss << ans << '\n';}std::cout << oss.str();return 0;}
官方题解如下:

#pragma GCC target ("pclmul")#include <bits/stdc++.h>#include <emmintrin.h>#include <wmmintrin.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using ull = std::uint64_t;using li = std::int32_t;using ll = std::int64_t;ul T;ul n, k;const ul maxn = 50;ul edge[maxn + 1][maxn + 1];ul dis1[6][maxn + 1];ul disn[6][maxn + 1];ul ans = 0;bool ban[maxn + 1][maxn + 1];ul tim;ul vis[maxn + 1];void search(ul cnt){for (ul i = 1; i <= n; ++i) {dis1[cnt][i] = 1e9;disn[cnt][i] = 1e9;}dis1[cnt][25] = 0;++tim;while (true) {ul tmp = 0;for (ul i = 1; i <= n; ++i) {if (vis[i] != tim) {if (!tmp || dis1[cnt][tmp] > dis1[cnt][i]) {tmp = i;}}}if (!tmp) {break;}vis[tmp] = tim;for (ul i = 1; i <= n; ++i) {if (!ban[tmp][i]) {dis1[cnt][i] = std::min(dis1[cnt][i], dis1[cnt][tmp] + edge[tmp][i]);}}}disn[cnt][n] = 0;++tim;while (true) {ul tmp = 0;for (ul i = 1; i <= n; ++i) {if (vis[i] != tim) {if (!tmp || disn[cnt][tmp] > disn[cnt][i]) {tmp = i;}}}if (!tmp) {break;}vis[tmp] = tim;for (ul i = 1; i <= n; ++i) {if (!ban[tmp][i]) {disn[cnt][i] = std::min(disn[cnt][i], disn[cnt][tmp] + edge[tmp][i]);}}}if (cnt == k) {ans = std::max(dis1[cnt][n], ans);} else {for (ul a = 1; a + 1 <= n; ++a) {for (ul b = a + 1; b <= n; ++b) {if (ban[a][b]) {continue;}if (dis1[cnt][a] + edge[a][b] + disn[cnt][b] == dis1[cnt][n] || dis1[cnt][b] + edge[b][a] + disn[cnt][a] == dis1[cnt][n]) {ban[a][b] = ban[b][a] = true;search(cnt + 1);ban[a][b] = ban[b][a] = false;}}}}}int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> n >> k;for (ul i = 1; i + 1 <= n; ++i) {for (ul j = i + 1; j <= n; ++j) {ul u, v, w;iss >> u >> v >> w;edge[v][u] = edge[u][v] = w;}}ans = 0;search(0);oss << ans << '\n';}std::cout << oss.str();return 0;}
简单题
#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using li = std::int32_t;using ull = std::uint64_t;using ll = std::int64_t;using lf = double;class vec {public:lf x = 0;lf y = 0;vec()=default;vec(lf a, lf b): x(a), y(b) {}};vec operator+(const vec& a, const vec& b){return vec(a.x + b.x, a.y + b.y);}vec operator-(const vec& a, const vec& b){return vec(a.x - b.x, a.y - b.y);}vec operator*(lf a, const vec& b){return vec(a * b.x, a * b.y);}lf operator*(const vec& a, const vec& b){return a.x * b.x + a.y * b.y;}ull cnt(lf a, lf b){return ll(std::floor(std::max(a, b))) - ll(std::ceil(std::min(a, b))) + 1;}lf l;const lf s3 = std::sqrt(lf(3));ull query(const vec& s, const vec& t){ull ret = 0;ret += cnt(s * vec(0, 1) / s3 / l * lf(2), t * vec(0, 1) / s3 / l * lf(2));ret += cnt(s * vec(s3 * lf(0.5), 0.5) / s3 / l * lf(2), t * vec(s3 * lf(0.5), 0.5) / s3 / l * lf(2));ret += cnt(s * vec(-s3 * lf(0.5), 0.5) / s3 / l * lf(2), t * vec(-s3 * lf(0.5), 0.5) / s3 / l * lf(2));return ret;}ul T;const lf eps = 1e-4;int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);iss >> T;for (ul Case = 1; Case <= T; ++Case) {vec s, v;ul k;iss >> l >> s.x >> s.y >> v.x >> v.y >> k;lf a = 0, b = k * l;while (b - a > std::max(a, lf(1)) * eps) {lf mid = (a + b) * lf(0.5);vec t = mid * v + s;ull cnt = query(s + vec(l * lf(0.5), 0), t + vec(l * lf(0.5), 0));if (cnt >= k) {b = mid;} else {a = mid;}}oss << std::fixed << std::setprecision(6) << (a + b) * lf(0.5) << '\n';}std::cout << oss.str();return 0;}
官方题解如下:

#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using li = std::int32_t;using ull = std::uint64_t;using ll = std::int64_t;ul T;const ul maxn = 1e5;char s[maxn + 2];char s2[maxn + 2];int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> s + 1;ul n = std::strlen(s + 1);li cntstar = 0;li pm = 0;for (ul i = 1; i <= n; ++i) {if (s[i] == '(') {++pm;} else if (s[i] == ')') {--pm;} else {++cntstar;}}if (pm - cntstar > 0 || pm + cntstar < 0) {oss << "No solution!\n";continue;}if (pm < 0) {for (ul i = 1; i <= n && pm; ++i) {if (s[i] == '*') {++pm;--cntstar;s[i] = '(';}}}if (pm > 0) {for (ul i = n; i >= 1 && pm; --i) {if (s[i] == '*') {--pm;--cntstar;s[i] = ')';}}}li l = -1, r = (cntstar >> 1) + 1;while (l + 1 != r) {li mid = l + (r - l >> 1);std::memcpy(s2 + 1, s + 1, sizeof(char) * n);li cnt = mid;for (ul i = 1; i <= n && cnt; ++i) {if (s[i] == '*') {--cnt;s2[i] = '(';}}cnt = mid;for (ul i = n; i >= 1 && cnt; --i) {if (s[i] == '*') {--cnt;s2[i] = ')';}}li state = 0;for (ul i = 1; i <= n; ++i) {if (s2[i] == '(') {++state;} else if (s2[i] == ')') {--state;if (state < 0) {break;}}}if (state == 0) {r = mid;} else {l = mid;}}if (r == (cntstar >> 1) + 1) {oss << "No solution!\n";} else {std::memcpy(s2 + 1, s + 1, sizeof(char) * n);li cnt = r;for (ul i = 1; i <= n && cnt; ++i) {if (s[i] == '*') {--cnt;s2[i] = '(';}}cnt = r;for (ul i = n; i >= 1 && cnt; --i) {if (s[i] == '*') {--cnt;s2[i] = ')';}}for (ul i = 1; i <= n; ++i) {if (s2[i] != '*') {oss << s2[i];}}oss << '\n';}}std::cout << oss.str();return 0;}
官方题解如下:
下方代码采用纯分治写法,不使用数据结构,故实际时间复杂度为。综合度很高的分治题。
#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using li = std::int32_t;using ull = std::uint64_t;using ll = std::int64_t;ul T;const li maxn = 1e5;li n;ll x[maxn + 1];ll y[maxn + 1];ll dis(ll a, ll b){return std::max(a, b) - std::min(a, b);}ll ans[maxn + 1];class node {public:li i = 0;bool query = false;bool insert = false;node()=default;node(li i, bool query, bool insert): i(i), query(query), insert(insert) {}ll xx() const {return x[i + query];}ll yy() const {return y[i + query];}};const ll inf = 1e17;void cdqy(li l, li r, const std::vector<node>& vx, ll xdir){ll mn = inf;for (li i = l; i <= r; ++i) {if (vx[i].insert) {mn = std::min(mn, ans[vx[i].i] - xdir * vx[i].xx() - vx[i].yy());} else {ans[vx[i].i] = std::min(ans[vx[i].i], mn + xdir * vx[i].xx() + vx[i].yy());}}mn = inf;for (li i = r; i >= l; --i) {if (vx[i].insert) {mn = std::min(mn, ans[vx[i].i] - xdir * vx[i].xx() + vx[i].yy());} else {ans[vx[i].i] = std::min(ans[vx[i].i], mn + xdir * vx[i].xx() - vx[i].yy());}}}void cdqx(li l, li r, const std::vector<node>& vi){if (l > r || l == r) {return;}static std::vector<node> v1;static std::vector<node> v2;li midl = l + r >> 1;li midr = midl + 1;v1.resize(0);v2.resize(0);ul v1flag = 0, v2flag = 0;for (li i = l; i <= midl; ++i) {if (vi[i].insert) {v1.push_back(vi[i]);v1flag |= 1;} else {v2.push_back(vi[i]);v2flag |= 2;}}for (li i = midr; i <= r; ++i) {if (vi[i].query) {v1.push_back(vi[i]);v1flag |= 2;} else {v2.push_back(vi[i]);v2flag |= 1;}}if (v1flag == 3) {std::sort(v1.begin(), v1.end(), [](const node& a, const node& b) {return a.yy() < b.yy();});cdqy(0, v1.size() - 1, v1, 1);}if (v2flag == 3) {std::sort(v2.begin(), v2.end(), [](const node& a, const node& b) {return a.yy() < b.yy();});cdqy(0, v2.size() - 1, v2, -1);}if (v1flag & v2flag >> 1 & 1) {cdqx(l, midl, vi);}if (v1flag >> 1 & v2flag & 1) {cdqx(midr, r, vi);}}void cdqi1(li l, li r){if (l == r) {if (l != n) {ans[l] = dis(x[l], x[l + 1]) + dis(y[l], y[l + 1]);}return;}static std::vector<node> v;li midl = l + r >> 1;li midr = midl + 1;cdqi1(l, midl);v.resize(0);for (li i = l; i <= midl; ++i) {v.push_back(node(i, true, false));}for (li i = midr; i <= r; ++i) {v.push_back(node(i, false, true));}std::sort(v.begin(), v.end(), [](const node& a, const node& b){return a.xx() < b.xx();});cdqx(0, v.size() - 1, v);cdqi1(midr, r);}void cdqi2(li l, li r){if (l > r) {return;}if (l == r) {if (l != n) {ans[l] -= dis(x[l], x[l + 1]) + dis(y[l], y[l + 1]);}return;}static std::vector<node> v;li midl = l + r >> 1;li midr = midl + 1;cdqi2(l, midl);v.resize(0);for (li i = l; i <= midl; ++i) {v.push_back(node(i, false, true));}for (li i = midr; i <= r; ++i) {v.push_back(node(i, true, false));}std::sort(v.begin(), v.end(), [](const node& a, const node& b){return a.xx() < b.xx();});cdqx(0, v.size() - 1, v);cdqi2(midr, r);}int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> n;ll sum = 0;for (li i = 1; i <= n; ++i) {iss >> x[i] >> y[i];if (i != 1) {sum += dis(x[i], x[i - 1]) + dis(y[i], y[i - 1]);}}std::memset(ans + 1, 0, sizeof(ll) * n);cdqi1(1, n);cdqi2(1, n - 1);ll out = inf;for (li i = 1; i <= n; ++i) {out = std::min(out, ans[i] + sum);}oss << out << '\n';}std::cout << oss.str();return 0;}
设被删除的时候是其第次被访问,于是显然是独立同分布的。且,官方题解如下:

#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using li = std::int32_t;using ull = std::uint64_t;using ll = std::int64_t;using vul = std::vector<ul>;const ul base = 998244353;ul plus(ul a, ul b){return a + b < base ? a + b : a + b - base;}ul minus(ul a, ul b){return a < b ? a + base - b : a - b;}ul mul(ul a, ul b){return ull(a) * ull(b) % base;}void exgcd(li a, li b, li& x, li& y){if (b) {exgcd(b, a % b, y, x);y -= x * (a / b);} else {x = 1;y = 0;}}ul inverse(ul a){li x, y;exgcd(a, base, x, y);return x < 0 ? x + li(base) : x;}ul pow(ul a, ul b){ul ret = 1;ul temp = a;while (b) {if (b & 1) {ret = mul(ret, temp);}temp = mul(temp, temp);b >>= 1;}return ret;}class polynomial : public vul {public:void clearzero() {while (size() && !back()) {pop_back();}}polynomial()=default;polynomial(const vul& a): vul(a) { }polynomial(vul&& a): vul(std::move(a)) { }ul degree() const {return size() - 1;}ul operator()(ul x) const {ul ret = 0;for (ul i = size() - 1; ~i; --i) {ret = mul(ret, x);ret = plus(ret, vul::operator[](i));}return ret;}};class ntt_t {public:static const ul lgsz = 21;static const ul sz = 1 << lgsz;static const ul g = 3;ul w[sz + 1];ul leninv[lgsz + 1];ntt_t() {ul wn = pow(g, (base - 1) >> lgsz);w[0] = 1;for (ul i = 1; i <= sz; ++i) {w[i] = mul(w[i - 1], wn);}leninv[lgsz] = inverse(sz);for (ul i = lgsz - 1; ~i; --i) {leninv[i] = plus(leninv[i + 1], leninv[i + 1]);}}void operator()(vul& v, ul& n, bool inv) {ul lgn = 0;while ((1 << lgn) < n) {++lgn;}n = 1 << lgn;v.resize(n, 0);for (ul i = 0, j = 0; i != n; ++i) {if (i < j) {std::swap(v[i], v[j]);}ul k = n >> 1;while (k & j) {j &= ~k;k >>= 1;}j |= k;}for (ul lgmid = 0; (1 << lgmid) != n; ++lgmid) {ul mid = 1 << lgmid;ul len = mid << 1;for (ul i = 0; i != n; i += len) {for (ul j = 0; j != mid; ++j) {ul t0 = v[i + j];ul t1 = mul(w[inv ? (len - j << lgsz - lgmid - 1) : (j << lgsz - lgmid - 1)], v[i + j + mid]);v[i + j] = plus(t0, t1);v[i + j + mid] = minus(t0, t1);}}}if (inv) {for (ul i = 0; i != n; ++i) {v[i] = mul(v[i], leninv[lgn]);}}}} ntt;polynomial& operator*=(polynomial& a, const polynomial& b){if (!b.size() || !a.size()) {a.resize(0);return a;}polynomial temp = b;ul npmp1 = a.size() + b.size() - 1;if (ull(a.size()) * ull(b.size()) <= ull(npmp1) * ull(50)) {temp.resize(0);temp.resize(npmp1, 0);for (ul i = 0; i != a.size(); ++i) {for (ul j = 0; j != b.size(); ++j) {temp[i + j] = plus(temp[i + j], mul(a[i], b[j]));}}a = temp;a.clearzero();return a;}ntt(a, npmp1, false);ntt(temp, npmp1, false);for (ul i = 0; i != npmp1; ++i) {a[i] = mul(a[i], temp[i]);}ntt(a, npmp1, true);a.clearzero();return a;}polynomial operator*(const polynomial& a, const polynomial& b){polynomial ret = a;return ret *= b;}ul T;ul n, a, b, c;const ul maxn = 1e6;ul fac[maxn + 1];ul fiv[maxn + 1];ul inv[maxn + 1];polynomial alpha, beta;ul f[maxn + 1];ul qpow[maxn + 1];int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);fac[0] = 1;for (ul i = 1; i <= maxn; ++i) {fac[i] = mul(fac[i - 1], i);}fiv[maxn] = inverse(fac[maxn]);for (ul i = maxn; i >= 1; --i) {fiv[i - 1] = mul(fiv[i], i);inv[i] = mul(fiv[i], fac[i - 1]);}iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> n >> a >> b >> c;ul p = mul(a, inverse(b));ul q = minus(1, p);f[0] = 1;f[1] = plus(mul(c - 1, q), n - c);for (ul i = 1; i + 1 <= n - 1; ++i) {f[i + 1] = mul(inv[i + 1], plus(mul(plus(mul(c - 1, q), minus(minus(n, c), mul(plus(q, 1), i))), f[i]), mul(mul(q, n - i), f[i - 1])));}alpha.resize(n);beta.resize(n);qpow[0] = 1;for (ul i = 1; i <= n; ++i) {qpow[i] = mul(qpow[i - 1], q);}for (ul i = 0; i <= n - 1; ++i) {alpha[i] = mul(mul(fac[n - 1 - i], f[n - 1 - i]), inverse(minus(1, qpow[n - i])));beta[i] = (i & 1) ? minus(0, fiv[i]) : fiv[i];}alpha *= beta;alpha.resize(n, 0);for (ul i = 0; i <= n - 1; ++i) {oss << mul(p, mul(alpha[i], fiv[n - 1 - i])) << '\n';}}std::cout << oss.str();return 0;}