首页 > 其他分享 >ARC168(A-C)题解

ARC168(A-C)题解

时间:2023-11-23 09:33:42浏览次数:38  
标签:ARC168 int 题解 ca cb 考虑 LL

比赛链接:arc168

A

题意:

读入一个由<>构成的字符串,在最开始,最后,字符之间可以填上任意数字,任意两个相邻数字之间必须满足字符代表的大小关系。求问最后填入的数字组成的数组最少有多少对逆序对。

题解:

签到。

<可以不去考虑,因为不会对答案造成影响。

>如果不是在连续段内,也可以不去考虑,因为最优解必然是这部分贡献为 0 的。只需要考虑连续的 > 个数求解即可。

B

题意:

\(n\) 堆石子,Alice 先手,Bob后手,假设最多只能取走一堆非空石子中 \([1,k]\) 任意个数的石子。

如果不存在 \(k\) 导致 Alice 存在必胜策略,输出 0。

如果不存在最大的 \(k\) 使得 Alice 存在必胜策略,输出 -1。

输出最大的 \(k\)。

题解:

最开始考虑很不全面,WA 了好几次

Nim 游戏扩展,回想 \([1,k]\) 这样的 Nim 游戏的必胜策略是什么,是:令 \(\text{SG}(x) = x \bmod (k+1)\),则 \(f=\text{SG}(a_1) \oplus \cdots \oplus \text{SG}(a_n) = 0\) 是必败情况。

考虑从上到下枚举 \(k\) 的暴力做法,当最初情况,即 \(k+1 \ge \max(a_i)\) 的时候,如果 \(f\) 已经非 0,那么输出 -1。

否则,当某一刻,\(f\) 不是 0 的时候,输出此时的 \(k\),如果到最后还没输出,那么答案就是 \(0\)。

考虑加速这个过程,考虑到答案应该是,到输出之前,无论对于哪个 \(k\),\(f\) 都是 0,考虑 \(\bmod\) 操作只会影响较大的元素,那么考虑排完序后的 \(a_n\),根据模 \(k+1\) 后是否被影响,可以分为前 \(x\) 个元素和 后 \(n - x\) 个元素,如果前 \(x\) 个此时 \(f\) 不为 0,那么 \(k+1=a_{x+1}\) 会导致 \(a_{x+1}\) 变为 0,此时就可能对最后的 \(f\) 造成影响。如此这般循环考虑即可。

C

题意:

有一个长度为 \(N\) 的,仅由 ABC 三种字符组成的字符串。你可以进行 \([0,k]\) 次操作,每次操作是选择字符串中任意两个字符,求得到的字符串由多少种。

题解:

不会写这种东西,卡麻了

考虑假设知道一个目标字符串 \(T\) ,如何求由最开始知道的字符串 \(S\) 求得需要的最少操作次数。

令 \(C[ca][cb]\) 表示有多少个对应位置上 \(S_x = ca\) 而 \(T_x = cb\)。每次操作可以使得 \(C[ca][cb]\) 和 \(C[cb][ca]\) 分别减 1。

经过一定次数的操作后,必然可以得到某一些 \(C[ca][cb]\) 为 0,此时的考虑 \(C\) 数组有何关系。

手玩一下发现,\(C[A][B] = C[B][C] = C[C][A]\),\(C[B][A] = C[C][B] = C[A][C]\)。对于一对没配对的 ABC 可以通过 ABC -> ACB -> CAB 这样用 2 次操作,让三个对应的 \(C\) 分别减去 1。

考虑限制这个 \(C\) 数组在特定情况下分别计数。

发现需要考虑的有四个自由度:1. 前一种操作的三对 \((x,y)=(A,B),(B,C),(A,C)\) 操作分别的进行次数,2. 后一种操作的次数。

计数部分是一个较前面内容简单的组合数相乘,具体可以看代码。

(思路来源:ARC official Editorial

Code:

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

using LL = long long;
using LF = double;
using pii = pair<int, int>;
#define fir first
#define sec second
#define mk make_pair

constexpr int N = 250005, M = 105, mod = 998244353;
int n, k;
LL fac[N], inv[N], cnt[5];
string s;
LL ans;

LL Cal(LL m, LL a) {
    if (m < a) return 0;
    return fac[m] * inv[m - a] % mod * inv[a] % mod;
}

void work() {
    cin >> n >> k >> s;
    for (auto c : s)
        cnt[c - 'A']++;
    for (int i = 0; 2 * i <= k; ++i)
        for (int a = 0; a + 2 * i <= k; ++a) // ab
            for (int b = 0; b + 2 * i + a <= k && i + a + b <= cnt[0]; ++b) // ac
                for (int c = 0; a + b + c + 2 * i <= k && i + a + c <= cnt[1] && i + b + c <= cnt[2]; ++c) { // bc
                    LL mans = 1, mas = 1;
                    mans = Cal(cnt[0], i + a + b) % mod * Cal(i + a + b, i + a) % mod * Cal(cnt[2], i + b + c) % mod * Cal(i + b + c, i + b) % mod * Cal(cnt[1], i + c + a) % mod * Cal(i + a + c, i + c) % mod;
                    mas *= Cal(cnt[0], i + a + b) % mod * Cal(i + a + b, i + b) % mod * Cal(cnt[2], i + b + c) % mod * Cal(i + b + c, i + c) % mod * Cal(cnt[1], i + c + a) % mod * Cal(i + a + c, i + a) % mod;
                    ans = (ans + mas + (i == 0 ? 0 : 1) * mans) % mod;
                }
    cout << ans << endl;
}

LL fpow(LL x, int b) {
    LL res = 1;
    while (b) {
        if (b & 1) res = res * x % mod;
        x = x * x % mod;
        b >>= 1;
    }
    return res;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    fac[0] = 1; n = 250000;
    for (int i = 1; i <= n; ++i) {
        fac[i] = fac[i - 1] * i % mod;
    }
    inv[n] = fpow(fac[n], mod - 2);
    for (int i = n - 1; ~i; --i) {
        inv[i] = inv[i + 1] * (i + 1) % mod;
    }
    int T = 1;
    while (T--) work();
    return 0;
}

标签:ARC168,int,题解,ca,cb,考虑,LL
From: https://www.cnblogs.com/rongnian/p/17850828.html

相关文章

  • [Codeforces] CF1475C Ball in Berland 题解
    BallinBerland-洛谷题意在毕业典礼上,有​个男孩和​个女孩准备跳舞,不是所有的男孩和女孩都准备结伴跳舞。现在你知道​个可能的舞伴,你需要选择其中的两对,以便使没有人重复地出现在舞伴里,求可能的数量。思路暴力最朴素,也是简单的方法,就是通过暴力组合进行配对。#include......
  • 【题解】HD2016.X1,HD2016.X3,HD2016.X4,HD2016.X5
    [HD2016.X1]价钱统计题目描述夏天到了,超市里摆满了各种各样的应季水果。现在知道:西瓜的价钱是每斤1.2元;桃子的价钱是每斤3.5元;葡萄的价钱是每斤4.5元;苹果的价钱是每斤5元。现在分别给出上述四种所购买的斤数(均不超过20),请你编写程序帮助售货员阿姨计算并依次输出顾客......
  • COMP 340 操作系统 Bounded Buffer问题解决
    这里有3个发生器,每个发生器独立地产生一种独特的材料。所有这些材料在被转发给操作员之前被存储在大小为10的输入缓冲器中。我们有三个具有相同优先级的运营商,他们负责生产基于这些材料。每种产品需要2种不同的材料。每次操作员需要2个用于此目的的工具。总共为这些操作员提供了3......
  • composer无法下载问题解决
    composerrequirejaeger/querylist[Composer\Downloader\TransportException] The"https://packagist.phpcomposer.com/p/provider-2017%241fcb04ee223fce21d167c8a49f09025ba85c917aee976588a99ef82c3a a609dc.json"filecouldnotbedownloaded(HTTP/1.......
  • P8907 [USACO22DEC] Making Friends P 题解
    明明看着不难的题目,却意外的卡人。思路考虑两头奶牛可以成为朋友条件是什么。存在一条路径连接这两头奶牛。且除去端点外的路径上的所有点的编号小于两端点的较小值。充分必要性都比较显然。如何维护。我们可以从小到大加入点,维护这些路径。对于每个点维护一个\(\text{se......
  • 【luogu题解】P9749 [CSP-J 2023] 公路
    \(Meaning\)\(Solution\)这道题我来讲一个不一样的解法:\(dp\)在写\(dp\)之前,我们需要明确以下几个东西:状态的表示,状态转移方程,边界条件和答案的表示。状态的表示\(dp[i]\)表示到达第\(i\)个站点所需要的最少钱数,\(w[i]\)表示在使用最少钱数到达第\(i\)个站点时多余......
  • 【模板】最小度限制生成树 题解
    其他的题解感觉都好高级,分享一种好想且好实现的方法。我们可以先把点\(s\)和与其相连的边都删除,我们发现剩下的部分变成了一些连通块。我们不难发现,当要求与\(s\)点相连的边的个数为\(k\)时,我们的连通块个数显然是\(k\)的。接下来这个问题就转化成了:\(n-1\)个点中生......
  • [IOI2015] Teams 题解
    妙妙题。不难发现,我们对于每个\(k\)取出的人都是满足\(a_i\leqk\leqb_i\)的。经典的,我们直接将\((a_i,b_i)\)转化到二维平面上,将它转化成一个二维数点问题。我们对于每一个询问,都使\(k\)有序,从小到大贪心的选择,也就相当于\(x\)轴限制不断向右,\(y\)轴限制不断......
  • zookeeper3.5.5以上8080端口占用问题解决
    zookeeper3.5.5启动默认会把AdminService服务启动,这个服务默认是8080端口,是一个通过jetty启动的管理控制台,一般不会用到,网上的复制粘贴就是来自同一个办法如下:方法一、删除jetty方法二、修改端口。修改方法的方法有两种:在启动脚本中增加-Dzookeeper.admin.serverPort=你的端......
  • P9868 题解
    blog。NOIP2023T1。可以对字符串随意交换,即可以重排每个单词。对于询问\(i\),最优方案显然是将\(\forallj\nei\)的\(w_j\)重排至字典序最大,将\(w_i\)重排至字典序最小。这件事情本质是将\(w_i\)与\(\min\limits_{j\nei}w_j\)比较。在开始时将全部串重排至字典序......