Day 11
Day 11
早上
面包 + 黄油 + 不知道什么东西
上午
怎么还有突击测试啊.
T1 看了一会想了个暴力 DP.
T2 觉得我不会.
T3 打了个 \(\mathcal{O}(n^3)\) 暴力, 然后不会了.
T4 读错题了并在学年大群犯糖.
然后发现 T1 我会.
T1
给你一个整数 \(x\) 和两种操作,
- \(x \leftarrow 2x - 1\)
- \(x\) 为奇数则 \(x \leftarrow \frac{x + 1}{2}\)
显然的 DP.
// ubsan: undefined
// accoders
#include <bits/stdc++.h>
using namespace std;
namespace OI {
#define int long long
#define endl "\n"
constexpr int maxn = 6e3+5, mod = 998244353;
int n, x;
int two[maxn];
int base = 0;
int f[maxn][maxn];
void main() {
cin >> n >> x;
two[0] = 1;
for (int i = 1; i <= n; i++)
two[i] = two[i - 1] * 2 % mod;
if (x == 1) {
cout << two[n] << endl;
return;
}
base = x;
int beg = 0;
while (base & 1)
base = (base + 1) / 2,
beg++;
f[0][beg] = 1;
int m = n + beg;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= m; j++) {
if (j > 0)
f[i][j] = (f[i][j] + f[i - 1][j - 1]) % mod;
if (j < m)
f[i][j] = (f[i][j] + f[i - 1][j + 1]) % mod;
}
}
int ans = 0;
for (int i = 0; i <= m; i++)
ans = (ans + f[n][i]) % mod;
cout << ans << endl;
}
#undef int
#undef endl
}
int main() {
freopen("operation.in", "r", stdin);
freopen("operation.out", "w", stdout);
cin.tie(0), cout.tie(0);
ios::sync_with_stdio(0);
OI::main();
return 0;
}
中午
汉堡 + 咖啡.
散落的汉堡和苦涩的咖啡无不提醒着我这里是现实.
所以说生命啊, 他苦涩如歌.
下午
T3
给你一个数列, 让你计算
\[\sum_{l = 1}^n\sum_{r = l}^n\sum_{i = l}^r \frac{1}{2^{rank_i}} \cdot a_i
\]
线段树乱搞.
#include <bits/stdc++.h>
using namespace std;
namespace OI {
#define int long long
#define endl "\n"
constexpr int maxn = 500005;
constexpr int mod = 998244353;
constexpr int inv2 = 499122177;
int n;
int arr[maxn];
int val[maxn];
int preans[maxn];
pair<int, int> pvi[maxn];
struct SegTree {
int val[maxn << 2];
int tag[maxn << 2];
void build(int v, int i = 1, int l = 1, int r = 500000) {
if (l == r) {
val[i] = v;
tag[i] = 1;
return;
}
int mid = (l + r) >> 1;
build(v, i << 1, l, mid);
build(v, i << 1 | 1, mid + 1, r);
tag[i] = 1;
val[i] = (val[i << 1] + val[i << 1 | 1]) % mod;
}
void pushDown(int i) {
if (tag[i] != 1) {
int ls = i << 1, rs = ls | 1;
val[ls] = val[ls] * tag[i] % mod;
tag[ls] = tag[ls] * tag[i] % mod;
val[rs] = val[rs] * tag[i] % mod;
tag[rs] = tag[rs] * tag[i] % mod;
tag[i] = 1;
}
}
void add(int x, int v, int i = 1, int l = 1, int r = 500000) {
if (l == r) {
val[i] = (val[i] + v) % mod;
return;
}
pushDown(i);
int mid = (l + r) >> 1;
if (x <= mid) add(x, v, i << 1, l, mid);
else add(x, v, i << 1 | 1, mid + 1, r);
val[i] = (val[i << 1] + val[i << 1 | 1]) % mod;
}
void times(int x, int y, int v, int i = 1, int l = 1, int r = 500000) {
if (x > y) return;
if (x <= l && r <= y) {
val[i] = val[i] * v % mod;
tag[i] = tag[i] * v % mod;
return;
}
pushDown(i);
int mid = (l + r) >> 1;
if (x <= mid) times(x, y, v, i << 1, l, mid);
if (y > mid) times(x, y, v, i << 1 | 1, mid + 1, r);
val[i] = (val[i << 1] + val[i << 1 | 1]) % mod;
}
int query(int x, int y, int i = 1, int l = 1, int r = 500000) {
if (x <= l && r <= y) return val[i];
pushDown(i);
int mid = (l + r) >> 1;
int res = 0;
if (x <= mid) res += query(x, y, i << 1, l, mid);
if (y > mid) res = (res + query(x, y, i << 1 | 1, mid + 1, r)) % mod;
return res;
}
} sgt1, sgt2;
int fpow(int a, int b) {
int res = 1;
while (b) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
void main() {
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> arr[i];
pvi[i] = { -arr[i], i };
val[i] = arr[i];
}
sgt1.build(1);
sgt2.build(0);
sort(pvi + 1, pvi + n + 1); // 按 -a 升序,即值降序,相同值按位置升序
sort(val + 1, val + n + 1);
int* ptr = unique(val + 1, val + n + 1); // 去重,ptr 指向末尾
for (int i = 1; i <= n; ++i) {
int pos = pvi[i].second;
int sumPre = sgt1.query(1, pos) % mod;
int self = sgt1.query(pos, pos) % mod;
preans[pos] = sumPre * fpow(self, mod - 2) % mod * arr[pos] % mod;
sgt1.times(1, pos, inv2);
}
int ans = 0;
for (int i = 1; i <= n; ++i) { // 扫描 r
int v = lower_bound(val + 1, ptr, arr[i]) - val;
sgt2.times(1, v - 1, inv2);
sgt2.add(v, preans[i]);
ans = (ans + sgt2.query(1, 500000)) % mod;
}
cout << ans * inv2 % mod << endl;
}
#undef int
#undef endl
} // namespace OI
int main() {
freopen("sequence.in", "r", stdin);
freopen("sequence.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
OI::main();
return 0;
}
下午一直在听福禄寿.
下午休息
去吃了家甜品店.
第一次吃这种东西诶

晚自习

Cabbagelang 终于能输出 Hello World 了.
晚上
一直在听福禄寿.
南三环东路为什么被封禁了啊啊啊啊啊
烧鸭好吃.

浙公网安备 33010602011771号