首页 > 其他分享 >自出题题解

自出题题解

时间:2023-12-31 21:55:52浏览次数:28  
标签:int 题解 sum times 出题 3001 我们 sim

U288469 Piggy 算路程

显然是简单贪心。黄。

U306825 Piggy 数编号

先推式子。

令 \(L(n,k)\) 为最长区块长度为 \(k\) 的方案数,则 \(Ans=\sum_{i=0}^n\limits{L(n,i)}\times k\)。下面转为求 \(L(n,k)\)。

我们考虑可能的区块长度分别为多少。那么就相当于我们要枚举所有的长度在 \(1\sim k\) 之间的区块,他们长度的和为 \(n\)。据此我们枚举区块数量,先写出 \(L(n,k)=\sum_{i=0}^n\limits{(g(n,i,k)-g(n,i,k-1))\times ???}\)。

考虑后面的部分应该是什么。粗略一看,似乎我们只需要指定区块间的相对大小,我们就能生成一个排列,因此后面是 \(i!\),但实际上这是错误的。我们希望我们生成的 \(i\) 个区间不会退化,即相邻两个区间合并到了一起变成了一个区间。而这需要保证我们区间的相对顺序所构成的一个 \(1\sim i\) 的排列最长区间为 \(1\)。因此后面的部分是 \(L(i,1)\),据此写出公式 \(L(n,k)=\sum_{i=0}^n\limits{(g(n,i,k)-g(n,i,k-1))\times L(i,1)}\),其中 \(g(n,i,k)\) 表示在 \(1\sim k\) 中选 \(i\) 个可重复的数,且和为 \(n\)。

下面转求 \(h(n)=L(n,1)\)。我们枚举规模较小的情况,不难猜想 \(h(n)=d[n]+d[n-1]\),其中 \(d\) 是错位重排数。
实际上这也可以归纳证明:假设 \(h(n)=d[n]+d[n-1]\),那么对于\(h(n+1)\),考虑递推,我们发现 \(n+1\) 这个数对于每个排列都有 \(n\) 个合理的插入位置,即除了 \(n\) 后边的所有位置。再结合 $ d[n]=n\times d[n-1] + (-1)^n $,结论是显然的了。
另一方面也可以考虑其组合意义,对于 \(h(n)\),在插入 \(n\) 时,要么原本就合法,则此时有 \(h(n−1)\times(n−1)\) 种方案;要么原本有一对不合法,则把 \(n\) 插在两者中间,那么把这一对数看作一个,方案数有 \(h(n−2)\times(n−2)\) 种。把二者加和,这显然实际上就是 \(d[n]+d[n−1]\),虽然即使并不承认这一点也可以用递推式来预处理出 \(h\)。
结合此结论,得到\(L(n,k)=\sum_{i=0}^n\limits{(g(n,i,k)-g(n,i,k-1))\times (d[i]+d[i-1])}\)。这就是我们心心念念的 \(L\)。

考虑如何计算。首先考虑 \(g\) 的组合意义,我们发现,若 \(ik\le n\),直接置 \(g(n,i,k)=0\) 即可。那么对于剩下的情况,我们考虑其组合意义,并用插板法容斥得到公式 \(g(n,i,k)=\sum_{x=0}^i\limits{(-1)^x\binom{n-xk-1}{i-1} \binom{i}{x}}\),对组合数预处理以后控制 \(x\) 的上界,可以 \(O(n^2\log n)\) 求出结果。

出题人起初给出的代码跑的奇慢无比,发现是因为出题人一些奇怪的习惯导致常数飞天。后来重新写了一个 std,常数略小。

TODO: 有无更优复杂度?

#include <bits/stdc++.h>
#define i128 __int128_t
using namespace std;

int n, p;
int c[3001][3001], d[3001];
bool vis[3001][3001]; int res[3001][3001];

inline int b(int m, int k)
{
    if (!k)
        return 0;
    if (vis[m][k])
        return res[m][k];
    vis[m][k] = 1;
    int upper = (n - m) / k, i;
    upper = min(upper, m);
    i128 ans = 0;
    for (i = 0; i <= upper; i++)
        ans += 1ll * c[n - i * k - 1][m - 1] * c[m][i] * (i & 1 ? -1 : 1);
    ans = ans % p + p;
    return res[m][k] = ans % p;
}
inline int T(int k)
{
    if (n == k)
        return 1;
    int m;
    i128 ans = 0;
    for (m = 1; m <= n; m++)
        ans += 1ll * (b(m, k) - b(m, k - 1) + p) * (d[m] + d[m - 1]);
    return ans % p;
}
int main()
{
    int i, j, k;
    scanf("%d%d", &n, &p);
    d[0] = 1;
    c[0][0] = 1;
    for (i = 2; i <= n; i++)
        d[i] = 1ll * (d[i - 1] + d[i - 2]) * (i - 1) % p;
    for (i = 1; i <= n; i++)
    {
        c[i][0] = 1;
        for (j = 1; j <= i; j++)
        {
            c[i][j] = c[i - 1][j] + c[i - 1][j - 1];
            if (c[i][j] >= p)
                c[i][j] -= p;
        }
    }
    long long ans = 0;
    for (k = 1; k <= n; k++)
        ans += 1ll * k * T(k);
    printf("%lld", ans % p);
}

U289325 追

简单 dij 即可。

U305747 Piggy 算恋爱

疑似错题?

U292508 网络流加强版

专门卡 EK 的图。

U294297 未来的可能

这道题通项公式是很麻烦的。但是理论可做。

U294455 渺茫的希望

可以证明先手必胜。首先我们发现 \(1\) 若是被选中只能第一次被选中,因为他是所有数的约数。这样我们考虑一个新游戏,数据范围为 \(2\sim n\),根据策梅洛定理且此游戏无平局,此游戏先手或后手必胜。
若先手必胜,原游戏的先手那么做就好。否则先手选 \(1\),让自己成为新游戏的后手,这样也必胜。

U297506 Yet Another Card Game

我们把 \(2\sim n\) 里面,所有介于 \(\frac{n}{2}\sim n\) 的素数都取走。剩下的数当中,只需要任取一个其余的数都会被连锁反应取走。所以此问题等价于问 \(\frac{n}{2}\sim n\) 有多少素数。线筛解决即可。
注意 \(n\) 较小时有边界问题,而样例已经给出了唯一的特例 \(n = 4\),所以本题是很良心的。

U306856 尽头的距离

考虑每片叶子在何处有贡献,在每个点处维护边的子树内各有多少叶子即可。

U297518 离别

我们充分发扬人类智慧。我们发现只要保留所有圆和其圆心即可。
我们考察全局 \(max\) 的点构成的图形,并只考虑其中一个连通块。如果该图形是一个点,则必为交点,算法正确;若为不规则图形,边界上必有交点,算法正确;若为规则图形则必定为圆,因此保留圆心,算法也正确。

U307878 树林

我们对于森林,有结论 \(c=v-e\),其中 \(c\) 为连通块个数,\(v, e\) 分别为点数和边数。这个结论只要考虑对树断边是显然的。
那么这个问题变成了一个二维数点问题。用二维数据结构随便做。

U303230 小 L 的情书

咕咕咕。

U303437 小 X 的数论

答案显然就是 \(\gcd(a, x)\)。

U331541 历史版本和

只需要在普通主席树上维护创建此节点的版本编号。你需要注意的是,这个标记是要下放的,不是永久化。

U330288 野兽

只会线性。线性是显然的。

U325896 嫁接

其实就是线段树合并分裂板子!

U320514 对对碰(Hard Version)

好难,不会。

U320513 对对碰(Easy Version)

显然 \(O(n^4)\) 是可以通过本题的!

U316571 序列

这不就是用平衡树维护逆置换?洒洒水啦!

U316378 套娃

因为 \(a \operatorname{xor} b\le a + b\),因此最后的权值一定是所有点的权值和,而且附带的结论是,我们绝不会做操作二。那么我们只需考虑操作一,这个操作对于每棵树互相独立。因此考虑一棵树的做法。

既然 \(a \operatorname{xor} b\le a + b\),那么当我们遇见一个子树异或和小于子树权值和的节点时,这个节点必然断开,这个采用树形 DP 是容易求的。

而对于此做法的正确性,考虑反证法。假设最后得到的若干棵树存在异或和小于权值和的,那么此树根必然会被断开,这与这是一棵树矛盾。

Code:

#include<bits/stdc++.h>
using namespace std;
const int maxN = 1e5 + 10;
vector<int> edges[maxN];
int p[maxN]; bool root[maxN];
int ans, sumxor[maxN];
long long sum[maxN];

void dfs(int u) {
    sum[u] = sumxor[u] = p[u];
    for(int i: edges[u]) {
        dfs(i);
        sum[u] += sum[i], sumxor[u] ^= sumxor[i];
    }
    if(sumxor[u] ^ sum[u]) ans++;
}

signed main() {
    cin.tie(0), cout.tie(0), ios::sync_with_stdio(false);
    int n, m; long long res = 0; cin >> n >> m;
    memset(root, 1, sizeof root);
    for(int i = 1, u, v; i <= m; i++) {
        cin >> u >> v; edges[u].push_back(v); root[v] = false;
    }
    for(int i = 1; i <= n; i++) cin >> p[i], res += p[i];
    for(int i = 1; i <= n; i++) { if(root[i]) dfs(i); }
    cout << res << "\n" << ans;
}

标签:int,题解,sum,times,出题,3001,我们,sim
From: https://www.cnblogs.com/Piggy424008/p/17938080/trashes

相关文章

  • CF1438F 题解
    如果能想到这道题用随机化,想来这道题的解法就显然了。但是为什么这道题一定要随机呢?我们考虑一棵完美二叉树,编号随机。这棵树的熵毛估估一下应该是\(O(\log^nn)\)的,但是一次询问的话,考虑每次只能得到三个点的偏序关系为某几种情况的一种,这个熵是很小的,只有\(O(\logn)\),对减......
  • P7400 题解
    P7400,一个有趣的博弈论。下面称Paula和Marin都执行一轮操作的“一整轮”为一个周期。Sub1:\(n\le100\)我们采用\(O(n^2\timesn)=O(n^3)\)的DP即可。这里略去具体实现。Sub2:边的颜色均为洋红这意味着两人都可以走过任意一条边。考虑两方如何对对方进行“围追堵截”......
  • P9309 题解
    此题问\(\operatorname{lcm}(a\simb)\)的后导\(0\)个数。考虑\(\operatorname{lcm}\)相当于对唯一分解中的素数的指数取\(\max\),此题等价于:定义\(\operatorname{g}(x,y,z)\)在\([a,b]\)的所有整数中,分解出\(z\)的最高次幂是多少,那么\(ans=\min(\operatorname{g}......
  • CF1827F 题解
    不妨先考虑一个弱化版的问题,这个问题和原来的问题仅有一个区别:\(k\)是给定整数。称最后\(n-k\)个数是“特殊的”。那么我们可以注意到,每个特殊的数字的极大段必然递增放置或者递减放置。例如我们有排列\([7,5,8,1,4,2,6,3]\)而且\(k=2\),那么极大段的下标应该是\([1,4],[6,......
  • P4875 题解
    显然这道题的解法与\(8\)强相关。从这一点下手,我们不难想到先对每一种奶牛做前缀和,这样我们可以做到\(O(8)\)查询每个区间是否可行,从而有了一个\(O(4n^2)\)的纯暴力做法。不知道多少pts,反正不是正解。下一步我们考虑优化。如果我们能快速地找到哪些区间是合法的,那么时间复......
  • P5138 题解
    因为本题的代码难度远大于解法的思考,因此这里提供一种好写的写法。做法不再赘述,就是转化为\(depth\)差以后上线段树分别维护两个信息以后求和。题解中大多数使用同一个线段树维护两个信息,可读性并不高,且比较难写。事实上我们注意到两棵线段树仅有初始的信息不一样,剩下需要支持......
  • P4434 题解
    远古模拟赛里的一道题,前来写篇题解记录一下。我们考虑一个显然的转化。将每条边染色,那么原问题等价于求下面的染色的方案数:对于每个点对\(a,b\),我们记\(\operatorname{lca}(a,b)=c\)有\(a\simc\)上的所有边同色。\(b\simc\)上的所有边同色。\(a\simc\)和\(b\simc......
  • CF958E1 题解
    Meaning在二维平面内,有位置不同且不存在三点共线的\(R\)个红点和\(B\)个黑点,判断是否能用一些互不相交的线段连接每一个点,使得每条线段的两端都分别是黑点和白点。Solution当\(R\ne{B}\)时,显然无法实现红点与黑点的两两组合,故题干所述的情况一定不存在。当\(R=B\)时,我......
  • 一觉醒来,除了你,全体 CPer 出题水平下降一百倍:我居然半小时内 AK 了一场 CF 比赛??
    第一章:我居然半小时内AK了一场CF比赛??注意本篇文章纯属虚构,请勿对号入座叮铃铃~一阵清脆的闹钟声响起,你揉着眼睛拍掉了放在床头响个不停的闹钟。你拿出手机,看了下时间,现在是2023年12月30号,22:20。作为一位优秀的CPer,从这个时间点醒来是你常有的作息,你突然想起来今天有一场C......
  • P5765 [CQOI2005] 珠宝 题解
    P5765[CQOI2005]珠宝题解思路好题,注意到有性质:颜色数最多为\(\lfloor\log_2n\rfloor+1\),有了这个性质之后直接树形DP糊上去就过了。简要的证明:考虑一个点,显然一种颜色即可。对于一个颜色为\(c\)的点,其儿子至少有\(c-1\)个,且为\(1\simc-1\)的排列,这样可......