Skip to content

Commit 23e8f84

Browse files
committed
2025牛客暑期多校训练营4
1 parent a086744 commit 23e8f84

2 files changed

Lines changed: 199 additions & 0 deletions

File tree

Nowcoder/115023K.cpp

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
/**
2+
* @file 115023K.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-07-30
5+
*
6+
* @copyright Copyright (c) 2025
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
#ifndef LOCAL
14+
#define endl '\n'
15+
#endif
16+
17+
bool mem1;
18+
19+
#define maxn 1005
20+
21+
mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());
22+
int64_t a[maxn], A[maxn], B[maxn];
23+
int ans[maxn];
24+
25+
void solve(void) {
26+
int n = 1000;
27+
28+
for (int i = 0; i < n; i++) cin >> a[i];
29+
30+
const int64_t mod = 1e9, bmod = 1e18;
31+
32+
auto fnd = [&](const vector<int64_t>& rec) -> pair<int64_t, int64_t> {
33+
unordered_map<int64_t, int64_t> mp;
34+
while (true) {
35+
int64_t S = rnd() & (((int64_t)1 << rec.size()) - 1), sum = 0;
36+
for (size_t i = 0; i < rec.size(); i++)
37+
if (S >> i & 1) sum += rec[i];
38+
sum %= mod;
39+
if (mp.count(sum) && S != mp[sum]) return {S ^ (S & mp[sum]), mp[sum] ^ (S & mp[sum])};
40+
mp[sum] = S;
41+
}
42+
};
43+
44+
vector<int64_t> vec;
45+
for (int t = 0; 32 * (t + 1) <= n; t++) {
46+
vector<int64_t> rec;
47+
for (int i = 0; i < 32; i++) rec.push_back(a[32 * t + i] % mod);
48+
tie(A[t], B[t]) = fnd(rec);
49+
50+
int64_t sum = 0;
51+
for (int i = 0; i < 32; i++) {
52+
if (A[t] >> i & 1) sum = (sum + a[32 * t + i]) % bmod;
53+
if (B[t] >> i & 1) sum = (sum + bmod - a[32 * t + i]) % bmod;
54+
}
55+
vec.push_back(sum / mod);
56+
}
57+
58+
auto [S, T] = fnd(vec);
59+
for (size_t t = 0; t < vec.size(); t++) {
60+
if (S >> t & 1)
61+
for (int i = 0; i < 32; i++) {
62+
if (A[t] >> i & 1) ans[32 * t + i] = 1;
63+
if (B[t] >> i & 1) ans[32 * t + i] = 2;
64+
}
65+
if (T >> t & 1)
66+
for (int i = 0; i < 32; i++) {
67+
if (A[t] >> i & 1) ans[32 * t + i] = 2;
68+
if (B[t] >> i & 1) ans[32 * t + i] = 1;
69+
}
70+
}
71+
72+
for (int i = 0; i < n; i++) cout << ans[i];
73+
cout << endl;
74+
75+
return;
76+
}
77+
78+
bool mem2;
79+
80+
int main() {
81+
ios::sync_with_stdio(false), cin.tie(nullptr);
82+
#ifdef LOCAL
83+
cerr << "Memory Cost: " << abs(&mem1 - &mem2) / 1024. / 1024. << "MB" << endl;
84+
#endif
85+
86+
int _ = 1;
87+
while (_--) solve();
88+
89+
#ifdef LOCAL
90+
cerr << "Time Cost: " << clock() * 1000. / CLOCKS_PER_SEC << "MS" << endl;
91+
#endif
92+
return 0;
93+
}

Nowcoder/115023L.cpp

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
/**
2+
* @file 115023L.cpp
3+
* @author Macesuted (i@macesuted.moe)
4+
* @date 2025-07-30
5+
*
6+
* @copyright Copyright (c) 2025
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
#ifndef LOCAL
14+
#define endl '\n'
15+
#endif
16+
17+
bool mem1;
18+
19+
#define maxn 200005
20+
21+
using tlll = tuple<int64_t, int64_t, int64_t>;
22+
23+
int64_t pow2(int x) { return x < 30 ? (1 << x) : 1e9; }
24+
25+
tlll operator+(const tlll& a, const tlll& b) {
26+
auto [val, rest, len] = a;
27+
tlll ans = b;
28+
29+
if (val >= get<1>(ans)) {
30+
get<0>(ans)++, val -= get<1>(ans), get<1>(ans) = pow2(get<2>(ans));
31+
get<0>(ans) += val / get<1>(ans), val %= get<1>(ans);
32+
}
33+
get<1>(ans) -= val;
34+
get<1>(ans) = min(rest + (get<1>(ans) - 1) * pow2(len), int64_t(1e9));
35+
get<2>(ans) += len;
36+
37+
return ans;
38+
}
39+
40+
class SegmentTree {
41+
private:
42+
tlll a[maxn << 2];
43+
int n;
44+
45+
void build(int p, int l, int r, int v[]) {
46+
if (l == r) return a[p] = {v[l] / 2 + v[l] % 2, v[l] % 2 + 1, 1}, void();
47+
int mid = (l + r) >> 1;
48+
build(p << 1, l, mid, v), build(p << 1 | 1, mid + 1, r, v);
49+
return a[p] = a[p << 1] + a[p << 1 | 1], void();
50+
}
51+
tlll query(int p, int l, int r, int ql, int qr) {
52+
if (ql <= l && r <= qr) return a[p];
53+
int mid = (l + r) >> 1;
54+
if (qr <= mid) return query(p << 1, l, mid, ql, qr);
55+
if (ql > mid) return query(p << 1 | 1, mid + 1, r, ql, qr);
56+
return query(p << 1, l, mid, ql, qr) + query(p << 1 | 1, mid + 1, r, ql, qr);
57+
}
58+
59+
public:
60+
void resize(int _n) { return n = _n, void(); }
61+
void build(int v[]) { return build(1, 1, n, v); }
62+
tlll query(int l, int r) { return query(1, 1, n, l, r); }
63+
} SGT;
64+
65+
int a[maxn];
66+
67+
void solve(void) {
68+
int n, q;
69+
cin >> n >> q;
70+
for (int i = 1; i <= n; i++) cin >> a[i];
71+
SGT.resize(n), SGT.build(a);
72+
73+
while (q--) {
74+
int x, y;
75+
cin >> x >> y, y = n - y + 1;
76+
77+
int p = upper_bound(a + 1, a + n + 1, x) - a;
78+
79+
if (y < p) {
80+
cout << 0 << endl;
81+
continue;
82+
}
83+
84+
tlll ret = SGT.query(p, y);
85+
ret = tlll{x, 1, 0} + ret;
86+
cout << get<0>(ret) - x << endl;
87+
}
88+
return;
89+
}
90+
91+
bool mem2;
92+
93+
int main() {
94+
ios::sync_with_stdio(false), cin.tie(nullptr);
95+
#ifdef LOCAL
96+
cerr << "Memory Cost: " << abs(&mem1 - &mem2) / 1024. / 1024. << "MB" << endl;
97+
#endif
98+
99+
int _ = 1;
100+
while (_--) solve();
101+
102+
#ifdef LOCAL
103+
cerr << "Time Cost: " << clock() * 1000. / CLOCKS_PER_SEC << "MS" << endl;
104+
#endif
105+
return 0;
106+
}

0 commit comments

Comments
 (0)