PKUSC 2022游记

Posted Delov

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PKUSC 2022游记相关的知识,希望对你有一定的参考价值。

你说的对,但是波波曰写游记

先默写一遍题意,要不忘了(

DAY 1

T1

给两个等长的字符串 \\(S,T\\),对于每个位置,问将 \\(S\\) 这个位置的字符换成 \\(T\\)对应位置的字符后,\\(S\\) 的最长border的长度

\\(|S| \\leq 2 * 10^6\\),时限 \\(1s\\)

T2

狼人杀背景,现在有 \\(n\\) 个人,其中一个狼人一个预言家,剩下是平民,你现在是狼人,是 \\(m\\) 号,对于剩下的 \\(n-1\\) 人,等概率是预言家,游戏中狼人不能刀人,事实上只有预言家可以操作,其余都没有操作。预言家每轮等概率地询问一个区间,得到的回答是这个区间中有没有狼人,问游戏期望进行多少轮后预言家可以唯一确定狼人的编号。

\\(n \\leq 150\\)\\(998244353\\) 取模

T3

有一棵以 \\(1\\) 为根的树,保证每个节点的儿子数量为偶数。每个点有一个观测值,有 \\(p\\) 的概率为 \\(1\\)\\(1-p\\) 的概率为 \\(0\\)。现在从叶子到根求出每个点的分析值,一个点的分析值是它自己的观测值和它的儿子的分析值中的众数,问根节点分析值为 \\(1\\) 的概率。此外有 \\(q\\) 次修改,每次修改一个点观测值为 \\(1\\) 的概率 \\(p\\),你在每次修改后都回答根节点分析值为 \\(1\\) 的概率。

\\(n \\leq 10^5,q \\leq 5 \\times 10^4\\)

DAY 2

T1

三种操作:

  • 新来一个人,编号顺延,并让其站到编号为\\(x\\)的人后面
  • \\(x\\)个人改为站到编号为\\(y\\)的人后面,对于直接或间接站在\\(x\\)后面的人,他们也会随之移动
  • 询问编号为 \\(x\\) 的人的位置

$ n \\leq 3 \\times 10^5 $

T2

\\(L\\) 个装备槽,第 \\(i\\) 个装备槽有 \\(n_i\\) 个候选装备,每个候选装备有两种属性 \\(a,b\\),每个装备槽必须选恰好一个装备。你有初始属性\\(A,B\\),对于一套装备,你最终的战力为 \\((A + \\sum_i=1^L a_i)\\times (B + \\sum_i=1^L b_i)\\),问最大化战斗力的装备方案。有 \\(q\\) 次询问.设最优解的战力为\\(z\\),你回答的方案战力为\\(x\\)\\(|z-x| \\leq 2500\\)即判定正确。

多测 \\(T \\leq 100\\),$ \\sum L \\leq 50000 $ ,\\(n_i \\leq 10\\)\\(a,b \\leq 100\\)\\(A,B \\leq 10^7\\)\\(q \\leq 10\\)\\(a,b,A,B\\) 是实数

T3

给出 \\(P\\)\\(m=5\\) 个同余方程,第 \\(i\\) 个为 $ a_i x + ( x \\bmod (b_i+1))(x^i \\bmod ( \\lfloor \\sqrt x \\rfloor) ) \\equiv c_i \\ \\ (\\bmod P) $ ,保证在模\\(P\\)意义下有唯一解,求\\(x\\)

多测\\(T \\leq 5\\)\\(a_i,c_i < P\\),$ P $是质数且在\\(10^17\\)\\(10^18\\)量级(具体记不清了,多测组数也是),\\(b_i =1\\)或$ 81 \\leq b_i \\leq 100$

PKUSC 2018 随机算法

PKUSC 2018 随机算法

[ made by Ameiyo ]


题目连接

用 $ f[i][s] $ 表示已经有 $ i $ 个点在排列里面,最大独立集的集合为 $ s $ ,这样的方案数。

对于当前不能加入最大独立集的点,在之后仍然不能加入,所以这些点可以被视为相同点,当做消耗品一样使用即可。

而可以加入的点,即加入后会使最大独立集变大的点,就直接放进 $ s $ 就行了。

#include <cstdio>
#include <cctype>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

#define ll long long
#define reg register
#define rep(i, a, b) for (reg int i = (a), i##end = (b); i <= i##end; ++i)
#define dep(i, a, b) for (reg int i = (a), i##end = (b); i >= i##end; --i)

template <typename _typer> inline _typer read() {
    _typer init = 0;
    char ch = getchar(), k = 0;
    for ( ; !isdigit(ch); ch = getchar()) k = (ch == '-');
    for ( ; isdigit(ch); ch = getchar())
        init = (init << 3) + (init << 1) + (ch ^ 48);
    return k ? -init : init;
}
const ll N = 25, INF = 1e9;
const ll M = (1 << 20), Mod = 998244353;

int n, m, G[N][N];
int tp[M], mk[N][M];
int f[N][M];

int Pow(int x, int k) {
    int ans = 1;
    for ( ; k > 0; x = 1ll * x * x % Mod, k >>= 1)
        ((k & 1) && (ans = 1ll * ans * x % Mod));
    return ans;
}

void Add(int &x, int y) { ((x += y) >= Mod && (x -= Mod)); }

int main() {
    n = read<int>(), m = read<int>();
    rep (i, 0, m - 1) {
        int x = read<int>() - 1, y = read<int>() - 1;
        G[x][y] = G[y][x] = true;
    }

    rep (i, 0, n - 1) tp[1 << i] = i, mk[i][0] = true;
    rep (i, 0, n - 1) rep (s, 1, (1 << n) - 1) if (!(s & (1 << i)))
        mk[i][s] = (mk[i][s & (s - 1)] && !G[i][tp[s & -s]]);

    f[0][0] = 1;
    // 不能放的点一直都不能放,所以可以算是一类点,就是把这部分处理掉就行了
    rep (i, 0, n - 1) rep (s, 0, (1 << n) - 1) if (f[i][s]) {
        reg int tmp = f[i][s], res = 0;
        rep (j, 0, n - 1) if (mk[j][s])
            ++res, Add(f[i + 1][s | (1 << j)], tmp);
        Add(f[i + 1][s], 1ll * tmp * (n - i - res) % Mod);
    }

    int Ans = 0, tot = 1, mx = 0;
    rep (i, 1, n) tot = 1ll * tot * i % Mod;
    rep (s, 0, (1 << n) - 1) if (f[n][s]) {
        int cnt = 0;
        for (int x = s; x > 0; x &= (x - 1)) ++cnt;
        if (cnt > mx) Ans = f[n][s], mx = cnt;
        else if (cnt == mx) Add(Ans, f[n][s]);
    }

//     cerr << Ans << endl;

    printf("%lld
", 1ll * Ans * Pow(tot, Mod - 2) % Mod);
    return 0;
}

注意洛谷上卡内存, $ mk $ 数组开不了,但是 $ O(2 ^ n * n ^ 3) $ 可以过。。。


[ in 2019.12.8 ]

以上是关于PKUSC 2022游记的主要内容,如果未能解决你的问题,请参考以下文章

PKUSC2018游记

PKUSC2018游记

PKUSC2017 游记

pkusc2021 游记

[PKUSC2022]随机函数

[PKUSC2022]Rating