2023 暑假 正睿 ACM组队模拟赛

Day 12 - ACM膜你赛

........

总之是寄了

非常有趣的是, 我们队叫"原神怎么你了", 然后我们后面一个队居然叫"不玩原神导致的"

我只会dp

然后只做出来一道数位dp和一车签到题 我太弱了


记录一下我们队开题顺序

  1. C - A+-B (签到题)

    题意是给定 \(a\)\(b\) , 然后输出 \(a + b\)\(a - b\)

    我个人认为, 这题我这种z班蒟蒻都能做

    这么简单的题还要做4min, 还抢不到一血

  2. K - Intercepting Information (签到题2)

    它...

    甚至比C还简单

    题意居然是给定8个数, 有9就输出F, 否则输出S

    这...这也配K?!!

    我这种z班蒟蒻都轻松A掉

    那为什么比赛开始后10min过了

  3. E - DRX vs. T1

    它...

    比K还简单

    题意居然是给定一个字符串, 有3个T就输出T1, 有3个D就输出DRX

    我这种z班蒟蒻都一眼秒掉

  4. B - Money Game

    话说上面3个题真不适合当C班ACM模拟赛的题, 应该给我这种Z班蒟蒻做

    所以B终于上难度了

    我们发现, 允许 \(10 ^ {-6}\) 以内的误差, 并且, 数据趋近于无穷大

    如果不存在一组稳定的解, 这题就基本不可做了

    于是考虑构造一组稳定的解

    什么? 构造? 我这种蒟蒻不会啊

    于是请出hyt大佬

    对于任意一组 \(a\), 我们考虑构造稳定, 可循环的解

    我们先考虑给 \(a\) 中新加入一个 \(\bar a\), 然后令所有数都变为 \(\bar a\)

    然后, 我们把新加入的 \(\bar a\) 附加在 \(a_1\)

    再根据题意可知, \(\bar a\) 会在 \(a_1\)\(a_n\)\(a_n\)\(a_1\) 中反复传播, \(a\) 中的值不会再变化

    至此, 我们构造了出一组稳定的解

    总结一下, 最终的 \(a\) 就是 \(\{2 * \bar a, \bar a, \bar a, \bar a, ... , \bar a \}\)

  5. G - BOPC

    嘿嘿上强度嘿嘿

    一看题, 这什么答辩?!!

    然后我们考虑打表

    打了个表, 通过 oeis 差分, 找出规律

    然后 #define int __int128 ...

    然后居然在 1h 的时候 A 了

  6. I - Lucky tickets

    真正的强度上来了

    一眼看出是数位dp

    但是怎么dp呢

    我们想了很长时间

    同时记录并维护mod + 二进制中1的个数 + 当前数对mod取余的结果真的是一件不可做并且很恶心人的事

    所以我们考虑寻找更好的解决方案

    我们想了很久, 发现, 题中要求mod必须等于二进制中1的个数, 于是我们考虑枚举1的个数, 这样模数直接就求出来了 (等于二进制中1的个数)

    然后只需要维护当前数模上模数结果, 并且限制当前数二进制中1的个数不超过限制

    于是这题就变得可做了

    这题完全是我做的, 可能因为我们队其他大佬都不是很会dp吧

    然后自豪的贴上代码

    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <vector>
    #include <list>
    #include <stack>
    #include <map>
    #include <set>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <queue>
    
    #define fastread ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    #define endl "\n"
    
    #define int __int128
    
    using namespace std;
    
    inline void read(__int128 &x){
        x=0;
        __int128 f=1;
        char ch=getchar();
        while(!isdigit(ch)){
            if(ch=='-')f=-1;
            ch=getchar();
        }
        while(isdigit(ch)){
            x=x*10+ch-'0';
            ch=getchar();
        }
        x*=f;
    }
    void write(__int128 x){
        if(x<0){
            putchar('-');
            x=-x;
        } 
        if(x<10)putchar(x%10+'0');
        else{
            write(x/10);
            putchar(x%10+'0');
        }
    }
    
    const int maxn = 70;
    
    __int128 a;
    int stac[maxn];
    int tot;
    int dp[maxn][maxn][maxn];
    
    int mod;
    
    int dfs (int now, int cnt, int rem, bool lead, bool limit) {
        if(now>tot) {
            if (rem == 0 and cnt == mod) {
                return 1;
            } else {
                return 0;
            }
        }
        
        if (not limit and not lead and dp[now][cnt][rem] != -1) { 
            return dp[now][cnt][rem];
        }
        
        int mx = limit ? stac[tot - now + 1] : 1;
        
        int res = 0;
        for (int i = 0; i <= mx; ++i) {
            res += dfs (now + 1, cnt + i, (rem * 2 + i) % mod, lead and i == 0, limit and i == mx);
        }	
        
        if (not limit and not lead) {
            dp[now][cnt][rem] = res;
        }
        
        return res;
    }
    
    int solve(){
        while (a) {
            tot++;
            if (a & 1) { 
                stac[tot]=1;	
            }
            else {
                stac[tot]=0;
            }
            a >>= 1;
        }
        memset(dp,-1,sizeof(dp));
        return dfs(1, 0, 0,true,true);
    }
    
    signed main () {
    //	fastread
        
        read (a);
        
        int ans = 0;
        for (int i = 1; i <= 64; i++) {
            mod = i;
            ans += solve();
    //		cout << "i = " << i << " ans = " << ans << endl;
        }
        
        write(ans);
        
        return 0;
    }
    

    那个 define int __int128 用来防RE就挺难绷的

    而且那个快读快写一看就不是我写的 韩岳佟的答辩码风

    而且这代码各种玄学操作常数上天 (比如__int128), $ 2 \times 10 ^ 7 + \mathcal O(玄学)$ 居然能过我也是十分震惊的

    赛后我跟隔壁C39队的大佬sym交流, 他说 你..真不怕TLE啊 ...

    此时我们队算是到了巅峰时期, rnk9, 这放在icpc我们都能Au了

    但是接下来开题就有点困难了...

  7. F - No Bug No Game

    我们先开了一道看起来比较答辩的题

    一看这么长的题面 果断机翻

    hyt和ky给我讲了好几遍题我才明白题意

    然后我和hyt开始考虑dp, ky继续看别的题有没有可做的

    然后hyt发现这似乎是一个类似背包的东西(确实), 然后他开始写

    然后我看着他写, 越写越假

    果然连样例都过不了

    然后他开始调, hyt觉得样例太水即使这样他也没过, 自己造了组数据

    然后调了114514年, 各种WA, 各种假, 罚时都吃上天了

    最终, 我发现了一个惊奇的规律, 他的答案每次跟标准答案正好差2, 于是我们在输出之前补了一个 + (rand() % 2) * 2 然后过样例了... 甚至还过了他出的数据

    然后交上去显然假了, 而且不只是假了, 还 WA on #2, 我真的... (显然, 他只过了样例#1)

    然后我就觉得他想的不对, 一眼假啊, 我就重新读题然后准备做

    然后我们又发现了一个规律, 每次只会有一个物品不会选最后一个物品(只有一个物品的重量不是 \(p[i]\) , 价值不是 \(w[i][p[i]]\) )

    于是我们惊奇的发现, 枚举 \(i\) (那个不完全选的物品), 然后其他正常做背包不就行了

    ...

    确实行

    但是复杂度爆炸了怎么办, 即使 \(\text{vjudge}\) 的少爷机把我们上一题的 \(2e7 + \mathcal{O(玄学)}\) 给放过去了, 我真的不认为它能够容忍我们 \(9e9\) 外加升天常数

    因此我们考虑优化

    hyt大佬首先提出之前进行背包的dp数组可以再次使用

    于是精通主席树的hyt大佬写了一个超级短的主席树, 然后发现好像空间会爆炸, 又不敢开了 (而且时间复杂度 \(9e6\) 外带1个log也不是很优)

    然后hyt大佬不做了, 认为这题不可做, 去开J题了 (那是他最擅长的大模拟)

    然后我和ky在旁边想F题思路

    ...

    然后我就开始重新看题想题

    想了114514年

    我发现刚才我们的理解其实并没有什么大问题, 只是在可持久化的实现方式上有些问题

    让我们重新考虑可持久化...

    什么是可持久化? 为什么要用主席树这种毒瘤的东西?

    我们发现主席树最大的用处在于面对区间问题是可以查询历史版本

    然后我们考虑, 我们这个题中真正需要区间查询吗?

    我想, 其实只需要查询出前缀和后缀就行, 有了前后缀, 枚举一个 \(x\) , 把 \(k\) 分成 \(x\)\(k - x\) , 然后只查询两边dp即可

    我们又发现, 对于一个背包, 它加入物品的顺序并不会影响它

    于是我们考虑维护两个dp数组 \(dp1[i][j]\) 表示前 \(i\) 个物品重量限制为 \(j\) 的最大价值, \(dp2[i][j]\) 表示第 \(i\) 个物品到最后一个物品的重量限制为 \(j\) 的最大价值

    然后对于每一个 \(i\) 我们就可以 \(O(1)\) 查询前缀和后缀的dp了

    然后, 我犯了一个很严重的错误, 对于每个 \(i\) , 没有枚举它到底是那个取值 (就是 \(w[i][j]\) 中的 \(j\) 没有枚举), 而是直接取出了 \(w[i]\) 中的最大值

    这是很严重的贪心, 一个好好的dp里面怎么能放贪心呢?!!

    所以我思路假了

    然后实现也必然假了

    然后因为hyt用电脑调J题调了114514年, 导致只有20min给我写这题

    我又非常紧张没有仔细考虑是否确实假了

    于是到比赛结束也没有调出来...

    难绷, 实际上, 我最后想出来的思路是我们队中最接近正解的

    旁边C班39队的sym大佬想到了前两天学的缺一分治 (事实上我也想到了只是觉得多了个log, 我们队常数太大容易寄)

    隔壁5队用的状压...这..., 明显没看出我们总结的那个性质...

    总之是寄了

  8. J - Tavern Chess

    hyt大佬发现这是个大模拟, 然后花了114514年A掉了

    间接导致了我F题没调出来(恼

总之是寄了

最终得分:

从rnk9掉到了rnk19

喜提Ag (然而只奖励前三名的大佬...)

这Ag是我们自己用来鼓励自己的, 根本不存在

posted @ 2023-07-28 20:11  Rainbow_Automaton  阅读(50)  评论(0)    收藏  举报