Day 11

Day 11

早上

面包 + 黄油 + 不知道什么东西

上午

怎么还有突击测试啊.

T1 看了一会想了个暴力 DP.

T2 觉得我不会.

T3 打了个 \(\mathcal{O}(n^3)\) 暴力, 然后不会了.

T4 读错题了并在学年大群犯糖.

然后发现 T1 我会.

T1

给你一个整数 \(x\) 和两种操作,

  1. \(x \leftarrow 2x - 1\)
  2. \(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;
}

下午一直在听福禄寿.

下午休息

去吃了家甜品店.

第一次吃这种东西诶

甜品

晚自习

CBG

Cabbagelang 终于能输出 Hello World 了.

晚上

一直在听福禄寿.

南三环东路为什么被封禁了啊啊啊啊啊

烧鸭好吃.

返回目录

posted @ 2026-08-06 13:14  Kibrel  阅读(8)  评论(0)    收藏  举报