牛客周赛62
A - E
A:
void solve() {
string s;cin >> s;
swap(s[0], s[1]);
cout << s << '\n';
}
B:
#define int long long
void solve() {
int n, x;cin >> n >> x;
vector<int> a(n + 1);
for (int i = 1;i <= n;i++)cin >> a[i];
int ans = 0;
for (int i = 1;i <= n;i++) {
if (!x)continue;
ans += a[i];
if (x > 0) {
x -= a[i];
} else if (x < 0) {
x += a[i];
}
}
cout << ans << '\n';
}
C:
看错题目力
#define int long long
constexpr double pi = 3.14159265358979324;
void solve() {
cout << fixed << setprecision(15);
int n, k;cin >> n >> k;
vector<pair<double, double>> cnt(n);
for (int i = 0;i < n;i++) {
double x, y, r;cin >> x >> y >> r;
double dis = x * x + y * y;
cnt[i] = {max<double>(0,r - sqrt(dis)),pi * r * r};
}
sort(cnt.begin(), cnt.end(), [](auto x, auto y) {
return x.first * x.second < y.first * y.second;
});
double ans = 0;
for (int i = 0;i < n - k;i++) {
ans += cnt[i].first * cnt[i].second;
}
cout << ans << '\n';
}
D:
取模需要注意
#define int long long
constexpr int mod = 1e9 + 7;
void solve() {
int n;cin >> n;
vector<vector<int>> g(n + 1);
for (int i = 1;i < n;i++) {
int u, v;cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
if (n == 1) {
cout << "1\n";return;
}
vector<int> p(n + 1), q(n + 1);
auto dfs = [&](auto self, int u, int fa, int d, int mul)->void {
if (g[u].size() == 1 && u != 1) {
p[u] = d;q[u] = mul;
}
int cnt = 0;
for (auto v : g[u]) {
if (v == fa)continue;
cnt++;
}
for (auto v : g[u]) {
if (v == fa)continue;
self(self, v, u, d + 1, mul * cnt % mod);
}
};
dfs(dfs, 1, 0, 1, 1);
int ans = 0;
for (int i = 1;i <= n;i++) {
if (p[i] && q[i]) {
ans += p[i] * inv(q[i]) % mod;
ans %= mod;
}
}
cout << ans << '\n';
}
E:
pbds 的第一次运用
template<typename T>
using ordered_multiset = tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update>;
void solve() {
int n, q;cin >> n >> q;
vector<int> a(n + 1);
for (int i = 1;i <= n;i++) cin >> a[i];
q--;int l, r;cin >> l >> r;
int k = r - l + 1;
ordered_multiset<int> s;
vector<int> ans;
ans.push_back(0);
for (int i = 1;i <= k;i++) {
s.insert(a[i]);
}
ans.push_back(*s.find_by_order(k / 2));
for (int i = k + 1;i <= n;i++) {
s.erase(s.upper_bound(a[i - k]));
s.insert(a[i]);
ans.push_back(*s.find_by_order(k / 2));
}
cout << ans[l] << '\n';
while (q--) {
cin >> l >> r;
cout << ans[l] << '\n';
}
}
F :
主席树板子,可以理解我区间求第
对于区间求第
大相关的解决方法特别多
- 整体二分
- 主席树/树状数组
- 分块
- 莫队
P3834 【模板】可持久化线段树 2 - 洛谷 | 计算机科学教育新生态
->一个区间求第 k 小的板子(可以通过本题)
constexpr int N = 200010;
int n, q, m, cnt = 0;
int a[N], b[N], T[N];
int sum[N << 5], L[N << 5], R[N << 5];
int build(int l, int r) {
int rt = ++cnt;
sum[rt] = 0;
int mid = l + r >> 1;
if (l < r) {
L[rt] = build(l, mid);
R[rt] = build(mid + 1, r);
}
return rt;
}
int update(int pre, int l, int r, int x) {
int rt = ++cnt;
L[rt] = L[pre]; R[rt] = R[pre]; sum[rt] = sum[pre] + 1;
int mid = l + r >> 1;
if (l < r) {
if (x <= mid) L[rt] = update(L[pre], l, mid, x);
else R[rt] = update(R[pre], mid + 1, r, x);
}
return rt;
}
int query(int u, int v, int l, int r, int k) {
if (l >= r) return l;
int x = sum[L[v]] - sum[L[u]];
int mid = l + r >> 1;
if (x >= k) return query(L[u], L[v], l, mid, k);
else return query(R[u], R[v], mid + 1, r, k - x);
}
int main() {
int n, q;cin >> n >> q;
for (int i = 1; i <= n; i++) {
cin >> a[i];
b[i] = a[i];
}
sort(b + 1, b + 1 + n);
m = unique(b + 1, b + 1 + n) - b - 1;
T[0] = build(1, m);
for (int i = 1; i <= n; i++) {
int t = lower_bound(b + 1, b + 1 + m, a[i]) - b;
T[i] = update(T[i - 1], 1, m, t);
}
while (q--) {
int l, r;cin >> l >> r;
int k = r - l + 1;k = (k + 1) / 2;
int t = query(T[l - 1], T[r], 1, m, k);
cout << b[t] << '\n';
}
}