首页 > 其他分享 >2024杭电多校第一场

2024杭电多校第一场

时间:2024-07-25 23:33:49浏览次数:11  
标签:lfloor 杭电多校 cnt ok int rfloor 2024 第一场 序列

菜鸡和大佬队友一起报了暑假的牛客和杭电······然而自己水平完全不够做多少题就是了。

1005 博弈(hdu7437

好吧赛时根本没写到它()

开始看题以为得一步一步算(是什么让我有这么离谱的思路.jpg),看了官方题解才发现自己的愚蠢呜呜,就是说有没有一种可能,A和B前 \(\lfloor n/2 \rfloor\) 位的字符串情况是“等价”的?可以视为把A的字符直接换给B,两方取到每种结果的概率实际上一样。。。 但对于A而言,平局并不计入胜利情况,单独考虑平局即可。

于是开始快乐分类讨论如下:

当 \(n\) 为偶数时,设平局概率为 \(p\) ,A获胜的概率即为 \((1-p)/2\) ; \(n\) 为奇数时,由于A比B多取一个字符,若前 \((n-1)/2\) 个字符相同,则A必胜,设前 \((n-1)/2\) 个字符相同的概率为 \(p\) ,A获胜的概率为 \((1+p)/2\) .

至于如何计算平局的概率,本菜鸡的求法极其抽象()将情况总数看作“长为 \(2n\) 的序列,每个位置在原字符集里挑选一种字符的方案数”,其中前 \((n-\lfloor n/2 \rfloor)\) 位属于A,后 \(\lfloor n/2 \rfloor\) 属于B,这样就避免了重复情况,可以用高中的排列组合知识 \(O(1)\) 计算;用 \(cnt\) 数组记录每个字母出现的次数,前 \(\lfloor n/2 \rfloor\) 个字符相同的概率可同理看作“长为 \(\lfloor n/2 \rfloor\) 的序列,在在字符集里挑选的方案数”,其中第 \(i\) 种字符只有 \(cnt[i]/2\) 个,仍然可以 \(O(1)\) 求出。此处注意 \(n\) 的奇偶情况略有不同,特判一下就好,问题不大。

主要代码如下:(好吧还是好长一坨,QwQ)


    int n;
    scanf("%d", &n);
    int s = 0;
    for(int i = 1; i <= n; i++) {
        char c = getchar();
        while(c < 'a' || c > 'z') c = getchar();
        int h;
        scanf("%d", &h);
        s += h;
        cnt[c - 'a'] += h;
    }
    if(s & 1) {
        int ok = 1;
        for(int i = 0; i < 26; i++) {
            if(cnt[i] & 1) {
                if(ok) {
                    ok = 0;
                } else {
                    ok = 1;
                    break;
                }
            }
        }
        if(ok) {
            printf("%lld\n", inv(2));
            continue;
        }
        ll x = 1, y = 1, ys = s / 2;
        for(int i = 0; i < 26; i++) {
            if(!cnt[i]) continue;
            x = x * c(s, cnt[i]) % mo;
            s -= cnt[i];
        }
        for(int i = 0; i < 26; i++) {
            if(cnt[i] <= 1) continue;
            cnt[i] /= 2;
            y = y * c(ys, cnt[i]) % mo;
            ys -= cnt[i];
        }
        ll p = y * inv(x) % mo;
        printf("%lld\n", (1 + p) * inv(2) % mo);
    } else {
        int ok = 0;
        for(int i = 0; i < 26; i++) {
            if(cnt[i] & 1) {
                ok = 1;
                break;
            }
        }
        if(ok) {
            printf("%lld\n", inv(2));
            continue;
        }
        ll x = 1, y = 1, ys = s / 2;
        for(int i = 0; i < 26; i++) {
            if(!cnt[i]) continue;
            x = x * c(ys * 2, cnt[i]) % mo;
            y = y * c(ys, cnt[i] / 2) % mo;
            ys -= cnt[i] / 2;
        }
        ll p = y * inv(x) % mo;
        printf("%lld\n", (1 + mo - p) * inv(2) % mo);
    }
    

1006 序列立方 (hdu7438

一言以蔽之:人类智慧题(bushi

需要求出序列中每个非空子序列出现次数的立方值的和(什么绕口令),这个立方值看上去十分抽象也不好处理,于是换一种思路:在序列中可重复地取三个子序列,它们相同的情况总数。

考虑动态规划,\(dp[i][j][k]\) 表示已经选了三个相同的子序列,其结尾分别在第 \(i,j,k\) 位,故 \(a[i]=a[j]=a[k]\) 时满足条件。使用前缀和数组 \(s[i][j][k]\) 表示以 \(i,j,k\) 位结尾的方案总数,有 \(a[i]=a[j]=a[k]\) 时 \(dp[i][j][k]=s[i-1][j-1][k-1]\) ,前缀和可用容斥思想维护。

代码如下,注意代码中用ans统计答案,可略去dp数组。


    for(int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
    }
    for(int i = 0; i <= n; i++) {
        for(int j = 0; j <= n; j++) {
            s[i][j][0] = s[i][0][j] = s[0][i][j] = 1;
        }
    }
    ll ans = 0;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            for(int k = 1; k <= n; k++) {
                ll ss = (s[i - 1][j][k] + s[i][j - 1][k] + s[i][j][k - 1]) % mo;
                ss -= (s[i - 1][j - 1][k] + s[i - 1][j][k - 1]
                       + s[i][j - 1][k - 1]) % mo;
                ss = (ss + mo) % mo;
                ss += s[i - 1][j - 1][k - 1];
                ss %= mo;
                if(a[i] == a[j] && a[i] == a[k]) {
                    ans += s[i - 1][j - 1][k - 1];
                    ans %= mo;
                    ss += s[i - 1][j - 1][k - 1];
                    ss %= mo;
                }
                s[i][j][k] = ss;
            }
        }
    }
    printf("%lld\n", ans);

标签:lfloor,杭电多校,cnt,ok,int,rfloor,2024,第一场,序列
From: https://www.cnblogs.com/meowqwq/p/18324320

相关文章

  • 2024-7-21谨以此文纪念我的gap year
    2023年6月,在一阵栀子花香中我们毕业。临近毕业的时候,拿到了悉尼的offer,心里想那可真是个好机会,万事俱备只差雅思了。毕业的那一刻,很多人如释重负,我,还背着重重的书包,包里放着剑桥雅思。走到哪里都带着耳机,只为了过雅思听力,随时随地磨耳朵。雅思似乎就像是我命中的一道坎,一次......
  • YOLOv8改进 | 主干网络 | ⭐重写星辰Rewrite the Stars⭐【CVPR2024】
     秋招面试专栏推荐:深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(1)
    2024“钉耙编程”中国大学生算法设计超级联赛(1)循环位移HDU-7433思路字符串哈希,将A串拼接两遍记为AA,然后对其哈希一下,用map/set记录哈希值,因为\(|A|\le|B|\),所以只要检查B中长度为\(|A|\)的子串哈希值是否存在AA中即可。代码#include<bits/stdc++.h>usingna......
  • 2024牛客暑期多校训练营4
    Preface最赤石的一集,上来先认为D是个煞笔贪心提交了该题的第一发代码并喜提WA后面下机后祁神把L扔给我告诉我就是个煞笔线段树板,结果我写完过不去样例发现题意假了值得一提的是最后发现这两题是这场过的人最少的两题,直接开局给我干的道心破碎之后A题写不来带权并查集样......
  • 2024暑假集训测试11
    前言比赛链接。这次好多外校的参加\(60\)多个人,反正至少没怎么挂分。确切的说赛时我只能冲T1、T2,T3可撤销或可持久化并查集都不会,赛后现学的,T4更抽象,可惜T2打假了。T3最后五分钟才开始看,没想直接打暴力了。但是T3数据太水了,加了捆绑还是水,赛后安排了重测。T1Pe......
  • 河南萌新联赛2024第(二)场:南阳理工学院
    A-国际旅行Ⅰ因为保证联通,所以直接排序就好了#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingvi=vector<int>;i32main(){ intn,m,q; cin>>n>>m>>q; via(n); for(int&i:a)cin>>i; sort(a......
  • 【专题】2024年云计算白皮书报告合集PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=371122023年全球云计算市场显著增长,预计将持续繁荣至2027年突破万亿美元,中国市场同样保持强劲势头,预计也将大幅跃升。国内云计算经过十余年发展,虽取得显著进展,但在资源布局、服务质量和技术融合等方面仍需深化提升。阅读原文,获取专题报告合集全文,解......
  • 平邑2024高算(补题)
    Day1risk题目描述解法考虑最后的集结,不妨考虑找出所有集结过程中可能经过的边,不难发现是一棵树,所以答案就是最小生成树。代码点击查看代码structnode{ intu,v,w;}e[3000001];intn,m;intfa[3000001];intfind(intx){ returnx==fa[x]?fa[x]:fa[x]=find(......
  • 2024 暑假友谊赛-热身2
    TreeDestruction-洛谷|计算机科学教育新生态(luogu.com.cn)思路:树的直径。定理:在一棵树上,从任意节点y开始进行一次DFS,到达的距离其最远的节点z必为直径的一端。第一次dfs1(),从任意一个点,到达的最远的点必然是直径两端的其中一个。再从找到的端点开始dfs1(),......
  • NOIP2024/7/25模拟赛
    T4题意:答案对\(2^{16}\)取模。分析:根节点\(1\)选到\(1\)的概率为\(\frac{1}{n}\),然后随便把剩下的\(n-1\)分配给它的所有子树,记\(1\)的其中一个儿子为\(y\),那么\(y\)选到它所被分配到的数中最小值的概率为\(\frac{1}{siz_{y}}\),然后\(y\)再继续分配给它的子......