@qq290637843
2020-12-06T01:38:46.000000Z
字数 20827
阅读 239
首先,将球单位化。
采用球极投影(注意,球极投影之后,圆可能变成圆,也可能变成直线,为了避免出现特殊情况,将在一开始随机换一个新的正交标架),来给球面上的点赋予新的坐标:
#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;using llf = long double;using dt = llf;std::mt19937 gen;std::normal_distribution<dt> d(dt(0), dt(1) / std::sqrt(dt(3)));dt mat[4][4];dt fromv[4];dt tov[4];ul T;ul n;dt R;dt r0;const dt pi = std::acos(dt(-1));const ul maxn = 5e3;class circ {public:dt x = 0;dt y = 0;dt r = 0;bool clock = false;};circ cs[maxn + 1];dt sqr(dt a){return a * a;}dt dir(dt x, dt y){return x > 0 ? (y >= 0 ? std::atan(y / x) : pi + pi + std::atan(y / x)) : (x < 0 ? pi + std::atan(y / x) : (y > 0 ? pi * dt(0.5) : pi * dt(1.5)));}dt tracos(dt a2, dt b2, dt c2){return std::acos(std::min(dt(1), std::max(dt(-1), (b2 + c2 - a2) / std::sqrt(4.0 * b2 * c2))));}std::vector<std::pair<dt, char>> stack;void push(std::vector<std::pair<dt, char>>& v, dt alpha, dt beta){if (alpha <= beta) {while (beta > pi + pi) {alpha -= pi + pi;beta -= pi + pi;}if (alpha >= dt(0)) {v.push_back(std::pair<dt, char>(alpha, '('));v.push_back(std::pair<dt, char>(beta, ')'));} else {v.push_back(std::pair<dt, char>(alpha + pi + pi, '('));v.push_back(std::pair<dt, char>(pi + pi, ')'));v.push_back(std::pair<dt, char>(dt(0), '('));v.push_back(std::pair<dt, char>(beta, ')'));}} else {while (alpha > pi + pi) {alpha -= pi + pi;beta -= pi + pi;}if (beta >= dt(0)) {v.push_back(std::pair<dt, char>(alpha, '('));v.push_back(std::pair<dt, char>(beta, ')'));} else {v.push_back(std::pair<dt, char>(alpha, '('));v.push_back(std::pair<dt, char>(dt(0), ')'));v.push_back(std::pair<dt, char>(pi + pi, '('));v.push_back(std::pair<dt, char>(beta + pi + pi, ')'));}}}dt f(dt t, dt x0, dt y0, dt r){dt sqrt2 = std::sqrt(dt(2));dt sint = std::sin(t);dt cost = std::cos(t);dt r2 = r * r;dt x2py2 = x0 * x0 + y0 * y0;dt A = std::sqrt(r2 * r2 - 2 * r2 * (-4 + x2py2) + sqr(4 + x2py2));dt B = std::sqrt(8 + 2 * sqr(r * sint + y0));return t + 2 * (-4 + r2 - x2py2) * (std::atan((2 * r * y0 + (4 + r2 - 2 * r * x0 + x2py2) * std::tan(t / 2)) / A) + (t > pi ? pi : dt(0))) / A + 2 * sqrt2 * std::atan(sqrt2 * (x0 + r * cost) / B) * (y0 + r * sint) / B;}dt getans(dt x0, dt y0, dt r, dt a, dt b){if (a == b) {return 0;}return f(b, x0, y0, r) - f(a, x0, y0, r);}dt in(){lf tmp;iss >> tmp;return tmp;}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);gen.seed(std::time(0));iss >> T;for (ul Case = 1; Case <= T; ++Case) {for (ul i = 1; i <= 3; ++i) {for (ul j = 1; j <= 3; ++j) {mat[i][j] = d(gen);}for (ul j = 1; j < i; ++j) {dt s = 0;for (ul k = 1; k <= 3; ++k) {s += mat[i][k] * mat[j][k];}for (ul k = 1; k <= 3; ++k) {mat[i][k] -= mat[j][k] * s;}}dt s = 0;for (ul j = 1; j <= 3; ++j) {s += mat[i][j] * mat[i][j];}s = std::sqrt(s);for (ul j = 1; j <= 3; ++j) {mat[i][j] /= s;}}iss >> n;R = in();r0 = in();r0 /= R;for (ul i = 1; i <= n; ++i) {dt x, y, z, r;fromv[1] = in();fromv[2] = in();fromv[3] = in();r = in();for (ul i = 1; i <= 3; ++i) {tov[i] = 0;for (ul j = 1; j <= 3; ++j) {tov[i] += fromv[j] * mat[j][i];}}x = tov[1] / R;y = tov[2] / R;z = tov[3] / R;r /= R;x *= dt(2) / (dt(1) - z);y *= dt(2) / (dt(1) - z);dt rxy = std::sqrt(x * x + y * y);dt dis1 = dt(2) * std::atan(rxy * dt(0.5));dt dis2 = dis1 - r;dt dis3 = dis1 + r;if (dis3 > pi) {cs[i].clock = true;dis3 -= pi + pi;dis2 = dt(2) * std::tan(dis2 * dt(0.5));dis3 = dt(2) * std::tan(dis3 * dt(0.5));dis1 = (dis2 + dis3) * dt(0.5);cs[i].x = x * dis1 / rxy;cs[i].y = y * dis1 / rxy;cs[i].r = (dis2 - dis3) * dt(0.5);} else {cs[i].clock = false;dis2 = dt(2) * std::tan(dis2 * dt(0.5));dis3 = dt(2) * std::tan(dis3 * dt(0.5));dis1 = (dis2 + dis3) * dt(0.5);cs[i].x = x * dis1 / rxy;cs[i].y = y * dis1 / rxy;cs[i].r = (dis3 - dis2) * dt(0.5);}}dt ans = 0;bool flag = false;for (ul i = 1; i <= n; ++i) {if (cs[i].clock) {flag = true;}stack.resize(0);for (ul j = 1; j <= n; ++j) {if (i == j) {continue;}if (cs[i].x == cs[j].x && cs[i].y == cs[j].y && cs[i].r == cs[j].r) {if (i > j && !cs[i].clock) {push(stack, dt(0), pi + pi);break;}if (i > j && cs[i].clock) {push(stack, pi + pi, dt(0));break;}continue;}if (sqr(cs[i].x - cs[j].x) + sqr(cs[i].y - cs[j].y) >= sqr(cs[i].r + cs[j].r)) {if (!cs[i].clock && cs[j].clock) {push(stack, dt(0), pi + pi);break;}continue;}if (sqr(cs[i].x - cs[j].x) + sqr(cs[i].y - cs[j].y) <= sqr(cs[i].r - cs[j].r)) {if (cs[i].r <= cs[j].r && !cs[i].clock && !cs[j].clock) {push(stack, dt(0), pi + pi);break;}if (cs[i].r >= cs[j].r && cs[i].clock && cs[j].clock) {push(stack, pi + pi, dt(0));break;}continue;}dt gamma = dir(cs[j].x - cs[i].x, cs[j].y - cs[i].y);dt theta = tracos(sqr(cs[j].r), sqr(cs[i].r), sqr(cs[i].x - cs[j].x) + sqr(cs[i].y - cs[j].y));dt alpha = gamma - theta;dt beta = gamma + theta;if (!cs[i].clock) {if (!cs[j].clock) {push(stack, alpha, beta);} else {push(stack, beta, alpha + pi + pi);}} else {if (!cs[j].clock) {push(stack, beta, alpha);} else {push(stack, alpha + pi + pi, beta);}}}if (!cs[i].clock) {std::sort(stack.begin(), stack.end(), [](const std::pair<dt, char>& a, const std::pair<dt, char>& b){return a.first != b.first ? a.first < b.first : a.second < b.second;});} else {std::sort(stack.begin(), stack.end(), [](const std::pair<dt, char>& a, const std::pair<dt, char>& b){return a.first != b.first ? a.first > b.first : a.second < b.second;});}ul cnt = 0;dt prev;if (!cs[i].clock) {prev = 0;} else {prev = pi + pi;}for (const auto &p : stack) {if (cnt == 0) {ans += getans(cs[i].x, cs[i].y, cs[i].r, prev, p.first);}if (p.second == '(') {++cnt;} else {--cnt;}if (cnt == 0) {prev = p.first;}}if (!cs[i].clock) {ans += getans(cs[i].x, cs[i].y, cs[i].r, prev, pi + pi);} else {ans += getans(cs[i].x, cs[i].y, cs[i].r, prev, 0);}}if (flag) {ans += pi + pi + pi + pi;}ans = ans + (pi + pi + pi + pi - ans) * getans(0, 0, dt(2) * std::tan(r0 * dt(0.5)), 0, pi + pi) / (pi + pi + pi + pi);oss << std::fixed << std::setprecision(20) << lf(ans * R * R) << '\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;ul T, n;int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::freopen("B.in", "r", stdin);std::getline(std::cin, instr, char(0));iss.str(instr);iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> n;ul mn = 1e9;ul cnt = 0;for (ul i = 1; i <= n; ++i) {ul a, d;iss >> a >> d;ul v = ((100 + a - 1) / a - 1) * d;if (mn > v) {mn = v;cnt = 0;}if (mn == v) {++cnt;}}oss << std::fixed << std::setprecision(20) << lf(n + n - cnt) / lf(n << 1) << '\n';}std::freopen("out.txt", "w", stdout);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 plili = std::pair<li, li>;using lf = double;std::mt19937_64 rnd;const ul maxn = 1e3;const ul maxm = 1e3;const ul maxa = 1000 * std::sqrt(std::acos(lf(-1)) * (maxn + maxm)) + 1;ul a;ul n, m;plili v[maxn + maxm + 1];ll ans[maxa + maxa + 1];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));iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> n >> m;a = 1000 * std::sqrt(std::acos(lf(-1)) * (n + m)) + 1;for (ul i = 1; i <= n; ++i) {iss >> v[i].first >> v[i].second;}for (ul i = n + 1; i <= n + m; ++i) {iss >> v[i].first >> v[i].second;v[i].first = -v[i].first;}for (ul i = n + m; i >= 1; --i) {std::swap(v[i], v[rnd() % i + 1]);}for (ul i = 0; i <= a + a; ++i) {ans[i] = -1e15;}ans[a] = 0;for (ul i = 1; i <= n + m; ++i) {if (v[i].first > 0) {for (ul j = a + a; j >= v[i].first; --j) {ans[j] = std::max(ans[j], ans[j - v[i].first] + v[i].second);}} else {for (ul j = 0; j <= a + a + v[i].first; ++j) {ans[j] = std::max(ans[j], ans[j - v[i].first] + v[i].second);}}}oss << ans[a] << '\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;const ul maxn = 1e5;ul T;ul n, m, s, t, x;class edge_t {public:ul to = 0;ull len = 0;edge_t()=default;edge_t(ul a, ull b): to(a), len(b) {}};bool operator<(const edge_t& a, const edge_t& b){return a.len > b.len;}char type[maxn + 2];std::vector<edge_t> edge[maxn + maxn + 2 + 1];void connect2(ul a, ul b, ul d){edge[a].push_back(edge_t(b, d));edge[b].push_back(edge_t(a, d));}void connect(ul a, ul b, ul d){if (type[a] != 'R') {if (type[b] != 'R') {connect2(a, b, d);}if (type[b] != 'L') {connect2(a, b + n, d + x);}}if (type[a] != 'L') {if (type[b] != 'R') {connect2(a + n, b, d + x);}if (type[b] != 'L') {connect2(a + n, b + n, d);}}}std::priority_queue<edge_t> heap;ull dis[maxn + maxn + 2 + 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);iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> n >> m >> s >> t >> x >> type + 1;for (ul i = 1; i <= n + n + 2; ++i) {edge[i].resize(0);dis[i] = 1e18;}if (type[s] != 'R') {connect2(n + n + 1, s, 0);}if (type[s] != 'L') {connect2(n + n + 1, s + n, 0);}if (type[t] != 'R') {connect2(n + n + 2, t, 0);}if (type[t] != 'L') {connect2(n + n + 2, t + n, 0);}for (ul i = 1; i <= m; ++i) {ul a, b, d;iss >> a >> b >> d;connect(a, b, d);}while (heap.size()) {heap.pop();}heap.push(edge_t(n + n + 1, 0));dis[n + n + 1] = 0;while (true) {auto curr = heap.top();if (curr.to == n + n + 2) {oss << curr.len << '\n';break;}heap.pop();if (curr.len > dis[curr.to]) {continue;}for (const auto& next : edge[curr.to]) {if (next.len + curr.len < dis[next.to]) {dis[next.to] = next.len + curr.len;heap.push(edge_t(next.to, next.len + curr.len));}}}}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;std::string curr, next;ul n, T;const ul mod = 1e9 + 7;ul plus(ul a, ul b){return a + b < mod ? a + b : a + b - mod;}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;ul ansprev = 0;ul anscurr = 1;curr = "";for (ul i = 1; i <= n; ++i) {iss >> next;ul ansnext;if (curr != next) {ansnext = plus(ansprev, anscurr);} else {ansnext = anscurr;}std::swap(curr, next);ansprev = anscurr;anscurr = ansnext;}oss << anscurr << '\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;const ul mod = 43200 * 13 * 2;const ul halfmod = 43200 * 13;ul plus(ul a, ul b){return a + b < mod ? a + b : a + b - mod;}ul minus(ul a, ul b){return a < b ? a + mod - b : a - b;}ul T;ul n;std::vector<ul> hpos;std::vector<ul> mpos;std::vector<ul> ntch(43200 * 14);std::vector<ul> ntcm(43200 * 14);char s[10];ul minus(ul a, ul b, ul mod){return a < b ? a + mod - b : a - b;}ul plus(ul a, ul b, ul mod){return a + b < mod ? a + b : a + b - mod;}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);ntch.resize(0);ntcm.resize(0);for (ul i = 0; i != mod; ++i) {if (i % 13 == 0 || i % 2 == 0) {ntch.push_back(i);ntcm.push_back(12 * i % mod);}}iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> n;hpos.resize(0);mpos.resize(0);for (ul i = 1; i <= n; ++i) {iss >> s + 1;ul t = (((s[1] - '0') * 10 + s[2] - '0') * 60 + (s[4] - '0') * 10 + s[5] - '0') * 60 + (s[7] - '0') * 10 + s[8] - '0';hpos.push_back(plus(t % 43200 * 26, halfmod));mpos.push_back(plus(t * 12 % 43200 * 26, halfmod));}std::sort(hpos.begin(), hpos.end());hpos.resize(std::unique(hpos.begin(), hpos.end()) - hpos.begin());std::sort(mpos.begin(), mpos.end());mpos.resize(std::unique(mpos.begin(), mpos.end()) - mpos.begin());ul mx = 0;ul ith = 0;ul itm = 0;for (ul i = 0; i != ntch.size(); ++i) {mx = std::max(mx, std::min(std::min(minus(ntcm[i], mpos[minus(itm, 1, mpos.size())]), minus(mpos[itm], ntcm[i])), std::min(minus(ntch[i], hpos[minus(ith, 1, hpos.size())]), minus(hpos[ith], ntch[i]))));if (ntch[i] == hpos[ith]) {ith = plus(ith, 1, hpos.size());}if (ntcm[i] == mpos[itm]) {itm = plus(itm, 1, mpos.size());}}oss << std::fixed << ' ' << std::setprecision(20) << lf(360 * (halfmod - mx)) / lf(mod) << '\n';}std::cout << oss.str();return 0;}
二分图最大匹配,HK算法,直接把下文当模板即可。
#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;const ul maxn = 1e5;ul T;ul n;li t, x;std::pair<li, li> ee[maxn + 1];li as[maxn + 1];li bs[maxn + 1];ul acnt, bcnt;std::vector<ul> edges[maxn + maxn + 1];ul match[maxn + maxn + 1];std::deque<ul> queue;ul dis[maxn + maxn + 1];const ul inf = 1e9;ul al[maxn + maxn + 1];ul altim;bool search(ul curr){al[curr] = altim;if (dis[curr] == 1) {return true;}if (curr <= acnt) {ul next = match[curr];if (altim == al[next] || dis[next] != dis[curr] - 1) {return false;}if (search(next)) {return true;}} else {for (ul next : edges[curr]) {if (altim == al[next] || dis[next] != dis[curr] - 1) {continue;}if (search(next)) {match[next] = curr;match[curr] = next;return true;}}}return 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;for (ul i = 1; i <= n; ++i) {iss >> t >> x;ee[i].first = as[i] = t - x;ee[i].second = bs[i] = t + x;}std::sort(as + 1, as + n + 1);std::sort(bs + 1, bs + n + 1);acnt = std::unique(as + 1, as + n + 1) - as - 1;bcnt = std::unique(bs + 1, bs + n + 1) - bs - 1;for (ul i = 1; i <= acnt + bcnt; ++i) {edges[i].resize(0);match[i] = 0;}for (ul i = 1; i <= n; ++i) {ul a = std::lower_bound(as + 1, as + acnt + 1, ee[i].first) - as;ul b = std::lower_bound(bs + 1, bs + bcnt + 1, ee[i].second) - bs;edges[a].push_back(b + acnt);edges[b + acnt].push_back(a);}ul ans = 0;while (true) {assert(queue.empty());ul k = inf;for (ul i = 1; i <= acnt; ++i) {if (!match[i]) {queue.push_back(i);dis[i] = 1;} else {dis[i] = inf;}}for (ul i = acnt + 1; i <= acnt + bcnt; ++i) {dis[i] = inf;}while (queue.size()) {ul curr = queue.front();queue.pop_front();if (dis[curr] == k) {continue;}if (curr <= acnt) {for (ul next : edges[curr]) {if (dis[next] != inf) {continue;}if (!match[next]) {if (k == inf) {k = dis[curr] + 1;}}dis[next] = dis[curr] + 1;queue.push_back(next);}} else {ul next = match[curr];if (dis[next] != inf) {continue;}dis[next] = dis[curr] + 1;queue.push_back(next);}}if (k == inf) {break;}++altim;for (ul i = acnt + 1; i <= acnt + bcnt; ++i) {if (!match[i] && dis[i] == k) {ans += search(i);}}}oss << ans << '\n';}std::cout << oss.str();return 0;}
随机几棵生成树,然后检查是否可行即可。
#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using li = std::int32_t;using ul = std::uint32_t;using plili = std::pair<li, li>;using ppliliplili = std::pair<plili, plili>;using pulul = std::pair<ul, ul>;using pulpulul = std::pair<ul, pulul>;const ul maxn = 6;const ul maxm = 6;ul fa[maxn * maxm + 1];ul rk[maxn * maxm + 1];ul getfather(ul x){return x == fa[x] ? x : fa[x] = getfather(fa[x]);}bool connect(ul x, ul y){x = getfather(x);y = getfather(y);if (x == y) {return false;}if (rk[x] < rk[y]) {fa[x] = y;} else if (rk[x] > rk[y]) {fa[y] = x;} else {fa[x] = y;++rk[y];}return true;}class vec {public:li x = 0;li y = 0;li z = 0;vec()=default;vec(li a, li b , li c): x(a), y(b), z(c) {}};vec operator+(const vec& a, const vec& b){return vec(a.x + b.x, a.y + b.y, a.z + b.z);}vec operator*(li a, const vec& b){return vec(a * b.x, a * b.y, a * b.z);}li operator*(const vec& a, const vec& b){return a.x * b.x + a.y * b.y + a.z * b.z;}vec operator^(const vec& a, const vec& b){return vec(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);}bool operator<(const vec& a, const vec& b){return a.x != b.x ? a.x < b.x : (a.y != b.y ? a.y < b.y : a.z < b.z);}bool operator==(const vec& a, const vec& b){return a.x == b.x && a.y == b.y && a.z == b.z;}bool operator!=(const vec& a, const vec& b){return !(a == b);}class mat {public:vec x;vec y;vec z;mat()=default;mat(const vec& a, const vec& b, const vec& c): x(a), y(b), z(c) {}};vec operator*(const vec& a, const mat& b){return a.x * b.x + a.y * b.y + a.z * b.z;}mat operator*(const mat& a, const mat& b){return mat(a.x * b, a.y * b, a.z * b);}bool operator<(const mat& a, const mat& b){return a.x != b.x ? a.x < b.x : (a.y != b.y ? a.y < b.y : a.z < b.z);}bool operator==(const mat& a, const mat& b){return a.x == b.x && a.y == b.y && a.z == b.z;}std::vector<vec> dir = {vec(1, 0, 0), vec(0, 1, 0), vec(-1, 0, 0), vec(0, -1, 0), vec(0, 0, 1), vec(0, 0, -1)};std::vector<mat> state;std::map<mat, ul> stateid;std::map<vec, ul> dirid;std::vector<mat> rot = {mat(vec(0, 0, -1),vec(0, 1, 0),vec(1, 0, 0)),mat(vec(1, 0, 0),vec(0, 0, -1),vec(0, 1, 0)),mat(vec(0, 0, 1),vec(0, 1, 0),vec(-1, 0, 0)),mat(vec(1, 0, 0),vec(0, 0, 1),vec(0, -1, 0))};ul inv[24];ul bt[24];ul change[24][4];std::deque<pulul> queue;ul st[maxn * maxm + 1];bool ans = false;std::vector<pulpulul> e;std::vector<pulul> edge[maxn * maxm + 1];std::mt19937_64 rnd;ul vsz;void check() {for (ul i = e.size(); i; --i) {std::swap(e[rnd() % i], e[i - 1]);}for (ul i = 1; i <= vsz; ++i) {fa[i] = i;rk[i] = 0;edge[i].resize(0);}for (auto a : e) {if (connect(a.second.first, a.second.second)) {edge[a.second.first].push_back(pulul(a.first, a.second.second));edge[a.second.second].push_back(pulul(a.first ^ 2, a.second.first));}}while (queue.size()) {queue.pop_front();}queue.push_back(pulul(0, 1));st[1] = 0;ul set = 0;while (queue.size()) {auto p = queue.front();queue.pop_front();auto curr = p.second;auto prev = p.first;set |= 1 << bt[st[curr]];if (set == (1 << 6) - 1) {ans = true;break;}for (auto a : edge[curr]) {ul i = a.first;ul next = a.second;if (next == prev) {continue;}st[next] = change[st[curr]][i];queue.push_back(pulul(curr, next));}}}ul T;ul n, m;std::map<plili, ul> v;char str[maxm + 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);rnd.seed(std::time(0));for (ul i = 0; i != 6; ++i) {dirid[dir[i]] = i;}for (auto x : dir) {for (auto y : dir) {if ((x ^ y) == vec(0, 0, 0)) {continue;}state.push_back(mat(x, y, x ^ y));}}for (ul i = 0; i != 24; ++i) {stateid[state[i]] = i;}for (ul i = 0; i != 24; ++i) {for (ul j = 0; j != 24; ++j) {if (state[i] * state[j] == mat(vec(1, 0, 0), vec(0, 1, 0), vec(0, 0, 1))) {inv[i] = j;}}bt[i] = dirid[vec(0, 0, -1) * state[inv[i]]];}for (ul i = 0; i != 24; ++i) {for (ul j = 0; j != 4; ++j) {change[i][j] = stateid[state[i] * rot[j]];}}iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> n >> m;v.clear();vsz = 0;for (ul i = 1; i <= n; ++i) {iss >> str + 1;for (ul j = 1; j <= m; ++j) {if (str[j] == '1') {++vsz;v[plili(i, j)] = vsz;}}}e.resize(0);for (const auto& a : v) {auto curr = a.first;for (ul i = 0; i != 2; ++i) {auto next = plili(curr.first + dir[i].x, curr.second + dir[i].y);if (v.find(next) != v.end()) {e.push_back(pulpulul(i, pulul(a.second, v[next])));}}}ans = false;for (ul cnt = 0; cnt != 10; ++cnt) {check();if (ans) {oss << "Yes\n";break;}}if (!ans) {oss << "No\n";}}std::cout << oss.str();return 0;}
官方题解如下:

#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using li = std::int32_t;using ul = std::uint32_t;using ll = std::int64_t;using ull = std::uint64_t;const ul mod = 1e9 + 7;ul plus(ul a, ul b){return a + b < mod ? a + b : a + b - mod;}ul minus(ul a, ul b){return a < b ? a + mod - b : a - b;}ul mul(ul a, ul b){return ull(a) * ull(b) % mod;}void exgcd(li a, li b, li& x, li& y){if (b) {exgcd(b, a % b, y, x);y -= a / b * x;} else {x = 1;y = 0;}}ul inverse(ul a){li x, y;exgcd(a, mod, x, y);return x < 0 ? x + li(mod) : x;}const ul maxn = 1e6;ul n, m;ul T;ul f[maxn + 1];ul sz[maxn + 1];ul h[maxn + 1];ul fac[maxn + 1];ul fiv[maxn + 1];ul bi(ul a, ul b){return a >= b ? mul(fac[a], mul(fiv[a - b], fiv[b])) : ul(0);}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);}iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> n >> m;for (ul i = 2; i <= n; ++i) {iss >> f[i];sz[i] = 0;}for (ul i = n; i >= 2; --i) {++sz[i];sz[f[i]] += sz[i];}sz[1] = n;ul p = m - 1 >> 1;if (p >= 1) {h[1] = bi(n - 1, m - 1);for (ul s = 2; s <= n; ++s) {h[s] = minus(h[s - 1], mul(bi(s - 2, p - 1), bi(n - s, m - p - 1)));}} else {for (ul s = 1; s <= n; ++s) {h[s] = 0;}}ul ans = 0;for (ul i = 2; i <= n; ++i) {ul s = sz[i];ans = plus(plus(ans, plus(mul(s, h[s]), mul(n - s, h[n - s]))), (~m & 1) ? mul(mul(bi(s, m >> 1), bi(n - s, m >> 1)), m >> 1) : ul(0));}oss << ans << '\n';}std::cout << oss.str();return 0;}
傻逼题
#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using li = std::int32_t;using ul = std::uint32_t;using ll = std::int64_t;using ull = std::uint64_t;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);iss >> T;for (ul Case = 1; Case <= T; ++Case) {ul a, b, d, t0;iss >> a >> b >> d >> t0;oss << d << '\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 plili = std::pair<li, li>;ul n;const ul maxn = 100;std::vector<plili> v[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);iss >> n;v[n].push_back(plili(0, 0));for (ul i = n; i >= 1; --i) {std::sort(v[i].begin(), v[i].end());v[i].resize(std::unique(v[i].begin(), v[i].end()) - v[i].begin());for (const auto& p : v[i]) {if (i >= 1) {v[i - 1].push_back(plili(p.first - 1, p.second));}if (i >= 2) {v[i - 2].push_back(plili(p.first, p.second - 1));}if (i >= 3) {v[i - 3].push_back(plili(p.first, p.second + 1));}if (i >= 4) {v[i - 4].push_back(plili(p.first + 1, p.second));}}}for (ul i = 1; i <= n; ++i) {for (const auto& p : v[i]) {oss << p.first << ' ' << p.second << ' ' << i << '\n';}}std::cout << oss.str();return 0;}