#define ios ios::sync_with_stdio(false), cin.tie(0), cout.tie(0) using ll = longlong;
voidmarisa(){ string p, q; cin >> p >> q; int n = p.size(), m = q.size(); vector<int> cntp(26), cntq(26); // p 和 q 中每个字符出现次数 for(int i = 1; i < n; i ++ ) cntp[p[i] - 'a'] ++ ; for(int i = 0; i < m - 1; i ++ ) cntq[q[i] - 'a'] ++ ; ll ans = (ll)n * m; for(int i = 0; i < 26; i ++ ){ ans -= (ll)cntp[i] * cntq[i]; // 减去重复次数 } cout << ans << "\n"; }
//判断点与线的位置关系 int f1 = point_line_relation(p[4], l1); int f2 = point_line_relation(p[4], l2); int f3 = point_line_relation(p[4], l3); //判断点是否在线段上 int ff1 = point_segment_relation(p[4], l1); int ff2 = point_segment_relation(p[4], l2); int ff3 = point_segment_relation(p[4], l3);
voidmarisa(){ int n, q; cin >> n >> q; unordered_map<int, vector<int>> mp; // 存储每个数字下标 for(int i = 1, x; i <= n; i ++ ){ cin >> x; mp[x].push_back(i); }
int idx = n; for(int i = 1, op, l, r, x; i <= q; i ++ ){ cin >> op; if(op == 1){ cin >> l >> r >> x; constauto& v = mp[x]; // 加引用,避免过多的拷贝导致超时 int pl = lower_bound(begin(v), end(v), l) - begin(v); int pr = upper_bound(begin(v), end(v), r) - begin(v); cout << pr - pl << "\n"; }else{ cin >> x; mp[x].push_back( ++ idx); } } }
如果 m 不为 0,那么可以选择从 x 花费一段时间走到距离其最近的传送门 transx,瞬间传送到距离 y 最近的传送门 transy,最后再花费一段时间从 transy 走到 y,即 x→transx→transy→y。此方案的答案即 x 到最近传送门 transx 的距离 + y 到最近传送门 transy 的距离
voidbfs(int src){ queue<int> q; q.emplace(src); d[src] = 1; while(q.size()){ int u = q.front(); q.pop(); for(constauto& v : e[u]){ if(d[v]) continue; q.emplace(v); d[v] = d[u] + 1, f[v][0] = u; for(int k = 1; k <= 20; k ++ ) f[v][k] = f[f[v][k - 1]][k - 1]; } } }
inlineintlca(int a, int b){ if(d[a] < d[b]) swap(a, b); for(int k = 20; ~k; k -- ) if(d[f[a][k]] >= d[b]) a = f[a][k]; if(a == b) return a; for(int k = 20; ~k; k -- ) if(f[a][k] != f[b][k]) a = f[a][k], b = f[b][k]; return f[a][0]; }
// 多源 01 bfs 预处理最近传送门距离 int dist[N]; vector<int> trans;
voidbfs01(){ queue<int> q; memset(dist, 0x3f, sizeof dist); for(constauto& x : trans){ q.emplace(x); dist[x] = 0; } while(q.size()){ int u = q.front(); q.pop(); for(constauto& v : e[u]){ if(dist[v] != inf) continue; q.emplace(v); dist[v] = dist[u] + 1; } } }
voidmarisa(){ cin >> n >> m >> q; for(int i = 1, u, v; i < n; i ++ ){ cin >> u >> v; e[u].emplace_back(v); e[v].emplace_back(u); } trans.resize(m); for(auto& x : trans) cin >> x;
bfs(1); bfs01();
for(int i = 1, x, y; i <= q; i ++ ){ cin >> x >> y; cout << min(get_d(x, y), dist[x] + dist[y]) << "\n"; } }
#define ios ios::sync_with_stdio(false), cin.tie(0), cout.tie(0) using ll = longlong;
voidmarisa(){ int n, m; cin >> n >> m; vector<ll> a(n + 1), b(m + 1); for(int i = 1; i <= n; i ++ ) cin >> a[i]; for(int i = 1; i <= m; i ++ ) cin >> b[i]; sort(begin(a) + 1, end(a)); // 排序 sort(begin(b) + 1, end(b));
ll ans = a[1] * (m - 1) + b[1] * (n - 1); // 先选最小长度的行列边 ll cnt = n + m - 2, cnt_r = 1, cnt_c = 1; // 边总数,行边数,列边数 for(int i = 2, j = 2; cnt < (ll)n * m - 1; ){ if(a[i] < b[j]){ ans += a[i ++ ] * (m - cnt_c); cnt += m - cnt_c; cnt_r ++ ; }else{ ans += b[j ++ ] * (n - cnt_r); cnt += n - cnt_r; cnt_c ++ ; } } cout << ans << "\n"; }