首页 > 其他分享 >12.19 CW 模拟赛 赛时记录

12.19 CW 模拟赛 赛时记录

时间:2024-12-19 15:45:39浏览次数:3  
标签:Set 20 赛时 int rm now CW 12.19 op

前言

考试的时候只需要管考试的策略就行了, 其他的想他干嘛

看题

一般来说, 涨信心模拟赛都不会涨信心
像一位故人出的题?

\(\rm{T1}\) 相信自己, 冲一下

\(\rm{T2}\) 看不懂

\(\rm{T3}\) 博弈

\(\rm{T4}\) 困难

\(\rm{T1}\)

机房两青轴是真的蚌埠

思路

转化题意,

对于 \(N\) 条线段, 我们需要对每条线段选择一段长为 \(t_i\) 的部分, 一个选择的代价定义为, 对于 \(N - 1\) 条关系 \((A_i, B_i, C_i)\) , 如果 \(A_i, B_i\) 选择的部分重合了 \(x\) , 那么就会产生 \(f = C_i \cdot x\) 大小的贡献

首先一个很明确的性质是, 关系是一棵树, 怎么利用?
先考虑链上的情况, 也就是说每个人最多涉及到两个会产生代价的点

好吧, 链上的也不好做, 先考虑一下菊花图, 是好做的, 我们只需要枚举一下 \(1\) 点的情况, 然后其他点尽力避开即可

先跳一下, 暴力都不会了

实现

\(10 \rm{pts}\)

菊花的 \(10 \rm{pts}\)

框架

先枚举 \(1\) 点的所有情况, 标记之后对于每个点, 贪心选择最优情况即可

代码

class SolveSubtask4 {
private:
    /*计算区间的重合大小*/
    int Calc(int l, int r, int nowl, int nowr) {
        int Left = std::max(l, nowl), Right = std::min(r, nowr);
        return std::max(Right - Left + 1, 0);
    }

public:
    void solve()
    {
        int Ans = 0x3f3f3f3f;
        /*外层枚举 1 点的选择情况*/
        for (int l = Pep[1].l; l <= Pep[1].r - Pep[1].t + 1; l++) {
            int r = l + Pep[1].t - 1;
            int nowans = 0;

            /*内层尽量避开*/
            for (int j = head[1]; ~j; j = Edge[j].next) {
                int i = Edge[j].to, C = Edge[j].w;
                int MinCost = 0x3f3f3f3f;
                for (int nowl = Pep[i].l; nowl <= Pep[i].r - Pep[i].t + 1; nowl++) {
                    int nowr = nowl + Pep[i].t - 1;
                    MinCost = std::min(MinCost, Calc(l, r, nowl, nowr));
                }
                nowans += MinCost * C;
            }
            Ans = std::min(Ans, nowans);
        }

        printf("%d", Ans);
    }
} Sub4;

\(\rm{T2}\)

思路

已经有形式化题意了, 就不在这里重复

注意到如果要使得成为完全立方数, 一定要求满足 \({S^{\prime}}_i = \sum_j {T_j}^{3x}\)

一个初步的思路是, 对于每种质因数, 我们记录这个数需要的幂次, 然后最后统计怎么给幂次最优秀, 每次询问的复杂度是 \(\mathcal{O} (nM + 3^M)\)

考虑如何优化

插入和删除我们可以用 \(\rm{hash}\) 实现, 但是怎么做才能优化掉 \(3 ^ M\) 这个东西?

好像确实不会了, 但是想完整再说

注意到每个数相当于要求了一些约束条件, 如果都满足了才加入贡献

好吧不会

实现

\(20 \rm{pts}\)

框架

按照上面写的模拟即可

代码

class SolveSubtask1
{
private:
    std::map<int, int> Set;
    int pows[20][20]; // 需要的次幂
    bool vis[20][20]; // 是否需要

    int give[20];
    int Ans = 0, AnsX = -1;
    /*统计怎么给幂次最优秀*/
    void dfs(int now) {
        if (now > M + 1) return;
        /*统计答案*/
        if (now == M + 1) {
            int NOW = 0;
            int nowans = 0;
            for (auto i : Set) {
                NOW++; int Num = i.first;
                bool flag = true;
                for (int j = 1; j <= M; j++) {
                    if (!vis[NOW][j])
                        if (give[j] != 0) {
                            flag = false;
                            break;
                        }
                    
                    if (give[j] != pows[NOW][j]) {
                        flag = false;
                        break;
                    }
                }
                if (flag) nowans += i.second;
            }
            int nowx = 1;
            for (int i = 1; i <= M; i++) { for (int j = 1; j <= give[i]; j++) nowx *= Prime[i]; }
            if (nowans > Ans) Ans = nowans, AnsX = nowx;
            return;
        }

        for (int i = 0; i < 3; i++) {
            give[now] = i;
            dfs(now + 1);
        }
    }

public:
    void solve()
    {
        while (Q--)
        {
            int op; scanf("%lld", &op);
            if (op == 1) {
                int New; scanf("%lld", &New);
                Set[New]++;
            }
            if (op == 2) {
                int Sub; scanf("%lld", &Sub);
                Set[Sub]--;
            }
            if (op == 3)
            {
                Ans = 0, AnsX = -1;
                int NOW = 0;
                /*记录每个数所需要的幂次*/
                for (auto i : Set) {
                    NOW++; int Num = i.first;
                    for (int j = 1; j <= M; j++) {
                        pows[NOW][j] = 0;
                        vis[NOW][j] = !(Num % Prime[j]);
                        while (!(Num % Prime[j])) {
                            pows[NOW][j]++;
                            Num /= Prime[j];
                        }
                        pows[NOW][j] = (3 - (pows[NOW][j] % 3)) % 3;
                    }
                }

                dfs(1);
                printf("%lld\n", AnsX);
            }
        }
    }
} Sub1;

\(\rm{T3}\)

思路

时间比较紧张, 看下题吧, 多半拿不到分了

今天暴力调太久了, 还是要练, 正解想不出来也是不行的

先考虑不加边的时候怎么判断先后手谁赢
先手只能在奇数层做改变, 后手只能在偶数层做改变
那么只要存在一条链, 使得在偶数层上, 这条脸上的点只能选择向这条链里面走

标签:Set,20,赛时,int,rm,now,CW,12.19,op
From: https://www.cnblogs.com/YzaCsp/p/18617358

相关文章

  • 12.17 CW 模拟赛 赛时记录
    前言这一次又来更新比赛策略讲真打了这么久,还没有一个好的比赛策略真的是抽象回去吃点感冒药看题怎么\(\rm{T1\T2}\)是一个题\(\rm{T1}\)可能是\(\rm{dp}\)题\(\rm{T3}\)有些不好做\(\rm{T4}\)这种题一般都不会做,能骗多少是多少\(\rm{T1}\)思路转化题意......
  • 12.17 CW 模拟赛 T4. 记忆碎片
    思路转化题意,问你在一个带权无向完全图中,如何填上\(w_i\in\left[1,\frac{n\cdot(n-1)}{2}\right]\),使得其最小生成树上的边权为给定的\(n-1\)个数考虑模仿\(\rm{kruskal}\)的方式,令\(f_S\)表示当前点集为\(S\),每次转移,如果当前边权需要在最小生......
  • 12.12 CW 模拟赛 T3. 消除贫困
    思路朴素容易发现一个人资金变化是这样的:对于\(op=1\)的情况,会将其直接变成\(x\)对于\(op=2\)的情况,将其变成\(\max(x,当前值)\)直接用线段树暴力的维护即可巧妙容易发现\(op=2\)相当于一个大保底,我们先倒着处理出每个人到\(i\)位置至少有多少......
  • 12.12 CW 模拟赛 T1. 理想路径
    前言作为一个别的不行抗伤无敌的\(\rm{man}\),区区反向\(\rm{rk\1}\)不足为惧\(\rm{HD0X}\)巨佬场切\(2700\),\(\%\%\%\)思路朴素先把考场上一些基础的想法搬过来考虑一个环什么时候会导致产生字典序负环,这个好像还比较显然,就是如果出去的那个点的字典序小......
  • acwing 1141. 局域网
    某个局域网内有 nn 台计算机和 kk 条 双向 网线,计算机的编号是 1∼n1∼n。由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不停的在回路内传输,造成网络卡的现象。注意:对于某一个连接,虽然它是双向的,但我们不将其当做......
  • 12.10 CW 模拟赛 T3. 循环
    算法很容易想到枚举短边断环之后\(\mathcal{O}(P)\)的求答案那么这个算法还有前途吗?可以发现,对于每次枚举断边,断\((i,i+1)\)和\((i-1,i)\)这两条边,变化量并不大,严格来说,均摊复杂度\(\mathcal{O}(P)\)具体实现上怎么处理呢?将断第\(x\)条边作为横......
  • 12.10 CW 模拟赛 T2. 乘法
    算法剪枝怎么都过不去\(50\%\),红温了不管了容易想到的是,枚举最终\(B\)进制数的位数,然后进行一个搜索来确定答案这样不够优秀,考虑折半搜索,我们将\(B\)进制数分为两个部分,然后分别判断两个部分对\(n\)取余的值,若可以,考虑归并具体怎么操作呢?对于左......
  • 12.10 CW 模拟赛 赛时记录
    前言最近发现只要每分钟都在做有意义的事就不算颓,同理的,这场考试只要每分钟都在想些事情,也就不算短期的主要目标就是利用好时间,其他的问题我基本上已经解决了,就是时间分配利用上的问题所以就只抓时间分配,这段时间先不去想别的,就好好把时间利用起来,不死磕,不畏......
  • ifcwall案例
    ifc中一个ifcwall案例 #6=IFCCARTESIANPOINT((0.,0.,0.));#10=IFCCARTESIANPOINT((0.,0.));#20=IFCDIRECTION((0.,0.,1.));#26=IFCDIRECTION((-1.,0.));#32=IFCAXIS2PLACEMENT3D(#6,$,$);#33=IFCLOCALPLACEMENT(#3665,#32);#96=IFCAXIS2PLACEMENT3D(#6,$,$);#......
  • AcWing 92. 递归实现指数型枚举
    文章目录前言代码思路前言简单题只有那么一些,后面的稍微难一点点的题,自己写一道可能就要一个小时。现在不写之后需要的时候可能就来不及了。好吧。种一棵树最好的时间是十年前,对,假设我十年之前是信息竞赛选手,把这些题刷得非常熟练,现在可能就不需要写这些算法题了,但是......