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

11.28 CW 模拟赛 赛时记录

时间:2024-11-28 14:54:36浏览次数:6  
标签:11.28 赛时 位置 pos 链表 30 rm CW id

看题

有外校的一起考, 那我爆个 \(0\)

\(\rm{A}\)

至少不能是简单题

考虑找规律一类的东西, 看能不能推出来?

\(\rm{B}\)

啊?

也是需要脑子, 多半不会做, 应该也是规律题

\(\rm{C}\)

至少暴力可以打, 争取达到高档暴力

\(\rm{D}\)

能打到这在想吧


完了嘛

时间分配: \(1 \rm{h} + 30 \rm{min} + 45 \rm{min} + 1 \rm{h} 15 \rm{min}\)

\(\rm{A}\)

手玩样例看能不能找到明显的性质

没有什么头绪, 显然的, 对于 \(30\%\) 的数据, 我们可以更改之后再跑一遍
考虑优化, 感性理解上, 每次只改变一个地方的交换, 肯定有大量重复的计算, 考虑优化掉这些重复的计算

  • 前面没改的
    这显然是不需要重复计算的, 我们通过简单的二分操作, 就知道 \(id\) 位置的人在 \(t\) 操作前在哪里

  • 后面没改的
    这一部分比较复杂, 但是显然的, 我们知道如果这个操作没有涉及到 \(id\) 位置的人在 \(t\) 操作前所在位置, 那么对答案没有影响
    考虑涉及到了的情况, 我们假设 \(id\) 当前位置为 \(u\), 位移之后位置为 \(v\)
    那么有, \(v\) 本来在后面的操作全部都位移到了 \(u\) 身上, 我们直接利用 \(v\) 的操作即可

那么思路大概就有了, 时间复杂度约为 \(\mathcal{O}(Q \log n)\) , 大概可以通过

那么考虑代码的具体实现
维护 \(n\) 个位置变换链表, 记录第 \(i\) 次变换时, 变换操作的编号以及当前所在的位置
显然的, 空间复杂度为 \(\mathcal{O}(n)\)
记录每个位置变换了多少次, 建立链表时, 考虑利用辅助数组

对于具体的操作, 我们先找到 \(id\) 编号在 \(t\) 次操作之前, 最后一次所在位置, 如果更改之后两编号 \(u, v\) 与最后一次所在位置无关, 那么直接输出最后一次答案, 如果有关, 那么我们找到(假设 \(u\) 为当前节点最后一次所在位置) \(v\) 后续的最终节点即可

其中 \(v\) 后续的最终节点怎么求?

问题转化为找 \(t\) 次操作之前最后一个出现 \(v\) 的操作, 即 \(v\) 在 \(t\) 操作前到底是那个最初位置的人在, 然后直接输出这个人的最终节点即可, 在当前的写法中不好实现

考虑再建立一个链表, 我们考虑记录每一个位置变换 \(id\) 的链表, 即记录第 \(i\) 次更改时, 最后一个 \(id\) 的编号

那么对于第一个操作, 我们在第一个链表里面求, 对于第二个操作, 我们在第二个链表里面求

现在主要问题在于链表的建立, 对于第一个链表, 我们记录每一个位置对应最初的 \(id\) , 一直更改即可

对于第二个链表, 我们建立第一个链表的过程中即可处理

注意到, 当当前被替换的操作与 \(id\) 有关时, 我们还是需要从后面的推, 不能直接输出

预期得分: \(100 \rm{pts}\)

\(\rm{B}\)

对于 \(30 \%\) 的数据, 考虑直接处理 \(x, y\) 坐标的链, 每次删一个就把其之后的全部推上来

预期得分: \(30 \rm{pts}\)

\(\rm{C}\)

注意到 \(m\) 很小啊, 考虑从这里下手

显然的, 本质不同的字符串只有 \(2 ^ {m + 1} - 1\) 种, 对于 \(m \leq 10\) 已经可以处理了

考虑 \(m\) 更大的情况

考虑不出来

预期得分: \(30 \rm{pts}\)

\(\rm{D}\)

看不懂题, \(S\) 是啥?

预期得分: \(0 \rm{pts}\)

代码

预期得分: \(100 + 30 + 30 = 160 \rm{pts}\)
剩下 \(1 \rm{h }30 \rm{min}\) 打代码

\(\rm{A}\)

决定我今天到底有多少的题, 大吉保佑我

先理清楚思路
读入直接用题面里面的
首先是建立链表


第一个链表

维护原本在 \(id\) 位置的人变换顺序

初始化时, 记录 \(pos_{id} = id\) 表示 \(id\) 位置上的人是 \(id\)
每次对于一个变换 \(u, v\) , 考虑找到 \(pos_u, pos_v\), 然后对于链表 \(pos_u\) , 插入当前位置 \(v\) , 对于 \(pos_v\) , 插入当前位置 \(u\) , 令 \(pos_u, pos_v\) 交换

第二个链表

维护位置 \(id\) 上人的变换顺序
在第一个链表的维护过程中, 每次 \(pos_{id}\) 变化, 将 \(pos_{id}\) 插入进 \(id\) 这一链表


注意两个链表都要记录在第几次操作到达方便二分

其次是查询

每次知道 \(t, id\) , 二分查询 \(id\) 在 \(t\) 之前的最后位置, 检查 \(u, v\) 中是否有 \(id\)

  • 没有
    直接输出最终答案


  • 二分查询 \(v\) 位置在 \(t\) 前最后一个所在人的编号, 输出这个人的最终答案

\(\rm{C}\)

今天能拿到的所有分了

#include <bits/stdc++.h>
#define FILE_IO
const int MAXN = 1e5 + 20;
const int MAXSIZ = 3000;

int n, m;

/*n <= 1000*/
class Subtask1
{
private:
    std::string Now[MAXN];
    int NowNum[MAXN];
    int Calc(int u, int v)
    {
        int x = u ^ v;
        int ans = 0;
        while (x)
        {
            if (x & 1) ans++;
            x >>= 1;
        }

        return ans;
    }

public:
    void solve()
    {
        for (int i = 1; i <= n; i++) {
            std::cin >> Now[i];
        }

        for (int i = 1; i <= n; i++) {
            NowNum[i] = 0;
            for (int j = 0; j < Now[i].length(); j++)
            {
                if (Now[i][j] == 'G') {
                    NowNum[i] += (1 << j);
                }
            }
        }

        for (int i = 1; i <= n; i++) {
            int Ans = 0;
            for (int j = 1; j <= n; j++) {
                Ans = std::max(Ans, Calc(NowNum[i], NowNum[j]));
            }

            printf("%d\n", Ans);
        }
    }
} S_1;

/*m <= 10*/
class Subtask2
{
private:
    int Have[MAXSIZ];
    int Ans[MAXSIZ];
    std::string Now[MAXN];
    int Calc(int u, int v)
    {
        int x = u ^ v;
        int ans = 0;
        while (x)
        {
            if (x & 1) ans++;
            x >>= 1;
        }

        return ans;
    }

public:
    void solve()
    {
        for (int i = 1; i <= n; i++) {
            std::cin >> Now[i];
            int NowNum = 0;
            for (int j = 0; j < Now[i].length(); j++)
            {
                if (Now[i][j] == 'G') {
                    NowNum += (1 << j);
                }
            }
            Have[NowNum]++;
        }

        for (int i = 0; i < (1 << (m + 1)); i++) {
            if (!Have[i]) continue;
            Ans[i] = 0;
            for (int j = 0; j < (1 << (m + 1)); j++) {
                if (!Have[j] || i == j) continue;

                Ans[i] = std::max(Ans[i], Calc(i, j));
            }
        }

        for (int i = 1; i <= n; i++) {
            int NowNum = 0;
            for (int j = 0; j < Now[i].length(); j++)
            {
                if (Now[i][j] == 'G') {
                    NowNum += (1 << j);
                }
            }
            printf("%d\n", Ans[NowNum]);
        }
    }
} S_2;

int main()
{
#ifdef FILE_IO
    freopen("different.in", "r", stdin);
    freopen("different.out", "w", stdout);
#endif
    scanf("%d %d", &n, &m);
    if (m <= 10) {
        S_2.solve();
    } else {
        S_1.solve();
    }

    return 0;
}

标签:11.28,赛时,位置,pos,链表,30,rm,CW,id
From: https://www.cnblogs.com/YzaCsp/p/18574307

相关文章

  • 11.26 CW 模拟赛 赛时记录
    看题也是给他绑上\(\rm{Subtask}\)了,这我骗鸡毛分啊感冒也是非常难受,但是事已至此,先读题吧题目背景好看爱看\(\rm{T1}\)图论题,好玩\(\rm{T2}\)大概也是不会做,再说\(\rm{T3}\)难绷,考虑高档暴力\(\rm{T4}\)这个肯定是暴力都难打今天也是\(30\rm{min}......
  • MITRE公布2024 年“CWE TOP 25”
    MITRE分享了从2023年6月至2024年6月期间披露的31,000多个漏洞背后最常见和最危险的25个软件弱点列表。软件弱点是指在软件的代码、架构、实现或设计中发现的缺陷、错误、漏洞和错误。攻击者可以利用这些弱点来破坏运行易受攻击软件的系统,从而能够控制受影响的设备并......
  • 11.28
    [实验任务一]:多次撤销和重复的命令模式某系统需要提供一个命令集合(注:可以使用链表,栈等集合对象实现),用于存储一系列命令对象,并通过该命令集合实现多次undo()和redo()操作,可以使用加法运算来模拟实现。实验要求:提交类图;提交源代码;//AbstractCommand.javapackagecomma......
  • 2024.11.24~2024.11.28
    2024.11.24开心的周末(可能是写博客的时候比较开心吧,嘻嘻)上午刷了一套cf,在3h30min刷完了下午去打了一会乒乓球,回来时发现shr已经讲了10分钟的课了(尴尬.png)这周将扫描线,虽然说这个机房除了我以外还有不会的吗?(呃),但是起码没像讲平衡树那样一个字也听不懂的的程度了发现扫描线也没......
  • acwing第三章算法模板
    29、树与图的存储树是一种特殊的图,与图的存储方式相同。对于无向图中的边ab,存储两条有向边a->b,b->a。因此我们可以只考虑有向图的存储。(1)邻接矩阵:g[a][b]存储边a->b(2)邻接表://对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点int......
  • 2023 年和 2024 年最具威胁的 25 种安全漏洞(CWE Top 25)
    目录1.缓冲区溢出(CWE-120)2.代码注入(CWE-94)3.认证缺失(CWE-287)4.访问控制缺失(CWE-284)5.SQL注入(CWE-89)6.跨站脚本(XSS)(CWE-79)7.不安全的反序列化(CWE-502)8.脆弱的随机数生成(CWE-331)9.信息泄露(CWE-200)10.不安全的直接对象引用(CWE-63......
  • Acwing题解系列——841. 字符串哈希
    #include<iostream>usingnamespacestd;constintN=100010;constintP=131;/*题解https://www.acwing.com/solution/content/24738/可以 把字符串变成一个p进制数字(哈希值),实现不同的字符串映射到不同的数字。采用字符的ascii码乘上P的次方来计算哈希值。X1X2X......
  • 【AcWing】866~868. 质数
    #include<iostream>#include<math.h>usingnamespacestd;intn;boolis_prime(intx){if(x<2)returnfalse;for(inti=2;i<=x/i;i++){if(x%i==0)returnfalse;}returntrue;}intmain(){cin>>n;......
  • tarjan—算法的神(一)cw
    本篇包含tarjan求强连通分量、边双连通分量、割点部分,tarjan求点双连通分量、桥(割边)在下一篇。伟大的RobertTarjan创造了众多被人们所熟知的算法及数据结构,最著名的如:(本文的)连通性相关的tarjan算法,Splay-Tree,Toptree,tarjan求lca等等。注:有向图的强连通分量、无向......
  • 国产芯片CW32L010兼容代替STM8S003
     CW32L010是基于eFlash的单芯片低功耗微控制器,集成了主频高达48MHz的ARM®Cortex®-M0+内核,ZUI高主频能够达到48MHz、高速嵌入式存储器(多至64K字节FLASH和多至4K字节SRAM)以及一系列全面的增强型外设和I/O口,并且集成高精度模拟数字转换器(ADC)。 所有型号都提供全套的通信接口(二......