首页 > 编程语言 >2021年中国大学生程序设计竞赛女生专场 AKDGIBC

2021年中国大学生程序设计竞赛女生专场 AKDGIBC

时间:2023-09-16 14:33:44浏览次数:50  
标签:专场 女生 int 37 AKDGIBC 2021 mp

2021年中国大学生程序设计竞赛女生专场

目录

概况

image-20230916141124495

image-20230916141150480

前五题去年的这个时候VP的,今年学校要去打女生赛,我先帮她们看看

C - 连锁商店

一眼状压,但发现 \(n \geq 36\) 二进制位状态 \(S\) 记录是否选了这个公司,会发现根本开不了那么大的数组,也没有那么多的时间

易得出最多重复的公司数量只有 \(m \leq 18\) 个,我们用二进制位状态 \(S\) 记录是否选了有重复的点即可

int n, m, a[37], w[37], c[N], res[N], id, cnt[37], f[37][1 << 19];
map<int, int> mp;
vector<int> e[37];
void solve()
{
    cin>>n>>m;
    for(int i = 1; i <= n; i++)
    {
        cin>>c[i];    cnt[c[i]]++;
    }
    for(int i = 1; i <= n; i++)
        cin>>a[i];
    for(int i = 1; i <= n; i++)
        w[i] = a[c[i]];
    for(int i = 1; i <= m; i++)
    {
        int u, v;   cin>>u>>v;
        e[u].push_back(v);
    }
    for(int i = 1; i <= n; i++)
        if(cnt[c[i]] == 1)
            c[i] = 0;
        else if(cnt[c[i]] > 1)
        {
            if(mp[c[i]] == 0)
                mp[c[i]] = ++id;
            c[i] = mp[c[i]];
        }
    for(int i = 1; i <= n; i++)
        c[i]--;
    memset(f, ~0x3f, sizeof f);
    if(c[1] == -1)
    {
        f[1][0] = w[1];
        // cout<<"!\n";
        // cout<<f[1][0]<<'\n';
    }
    else 
    {
        f[1][1 << c[1]] = w[1];
        // cout<<f[1][1 << c[1]]<<'\n';
    }
    
    res[1] = w[1];
 
    // for(int u = 1; u <= n; u++)
    //     cout<<c[u]<<" "<<' ';
    // cout<<'\n';
    // cout<<"id : "<<id<<"  (1 << id) : "<<(1 << id)<<'\n';
    for(int u = 1; u < n; u++)
    {
        for(int S = 0; S < (1 << id); S++)
        {
            if(f[u][S] <= 0)    continue;
            for(auto v : e[u])
            {
                if(c[v] != -1 && ((S >> c[v]) & 1))
                {
                    f[v][S] = max(f[u][S], f[v][S]);
                    res[v] = max(f[v][S], res[v]);
                    // cout<<"tag : "<<1<<"  u : "<<u<<"  v : "<<v<<" S : "<<S<<" "<<f[v][S]<<"  "<<res[v]<<'\n';
                }
                else
                {
                    if(c[v] == -1)
                    {
                        f[v][S] = max(f[u][S] + w[v], f[v][S]);
                        res[v] = max(f[v][S], res[v]);
                        // cout<<"tag : "<<2<<"  u : "<<u<<"  v : "<<v<<" S : "<<S<<" "<<f[v][S]<<"  "<<res[v]<<'\n';
 
 
                    }
                    else
                    {
                        f[v][S | (1 << c[v])] = max(f[u][S] + w[v], f[v][S | (1 << c[v])]);
                        res[v] = max(f[v][S | (1 << c[v])], res[v]);
                        // cout<<"tag : "<<3<<"  u : "<<u<<"  v : "<<v<<" S : "<<(S | (1 << c[v]))<<" "<<f[v][S | (1 << c[v])]<<"  "<<res[v]<<'\n';
                    
                    }
                }
            }
        }
    }
    for(int i = 1; i <= n; i++)
        cout<<res[i]<<'\n';
}

B - 攻防演练

构造子序列,贪心地去选择最近距离下,离当前位置最远的字母,但这样直接做是\(O(qN^2)\) 的

用倍增优化这个选择即可

const int N = 2e5 + 10;
const int LOGN = 20;
typedef long long ll;

int n, m, q, ne[30], fa[N][LOGN + 2];
int a[N];
string s;

void lca_init()
{
    for(int i = n; i >= 0; i--)
        for(int j = 1; j <= LOGN; j++)
            fa[i][j] = fa[fa[i][j - 1]][j - 1];
}
int lca_query(int u, int v)
{
    int res = 0;
    for(int j = LOGN; j >= 0; j--)
        if(fa[u][j] <= v && fa[u][j] != 0)    
            u = fa[u][j], res += (1 << j);
    return res;
}
void solve()
{
    cin>>m>>n;
    cin>>s; s = "a" + s;
    for(int i = 0; i <= n; i++)
        a[i] = (s[i] - 'a' + 1);

    for(int j = 1; j <= m; j++)
        ne[j] = n + 1;

    for(int i = n; i >= 0; i--)
    {
        for(int j = 1; j <= m; j++)
            fa[i][0] = max(ne[j], fa[i][0]);
        if(i)
            ne[a[i]] = i;
    }
    lca_init();
    cin>>q;
    for(int i = 1; i <= q; i++)
    {
        int l, r;   cin>>l>>r;
        cout<<lca_query(l - 1, r) + 1<<'\n';
    } 
}

I - 驾驶卡丁车

G - 3G网络

D - 修建道路

K - 音乐游戏

A - 公交线路

标签:专场,女生,int,37,AKDGIBC,2021,mp
From: https://www.cnblogs.com/magicat/p/17706702.html

相关文章

  • JVM--2021面试题系列教程(附答案解析)
    JVM--2021面试题系列教程(附答案解析)--大白话解读--JavaPub版本前言序言再高大上的框架,也需要扎实的基础才能玩转,高频面试问题更是基础中的高频实战要点。适合阅读人群Java学习者和爱好者,有一定工作经验的技术人,准面试官等。阅读建议本教程是系列教程,包含Java基础,JVM,容......
  • Deltix Round, Autumn 2021 (open for everyone, rated, Div. 1 + Div. 2) A. Divide
    有一个长为\(n\)的数组,可以执行以下整份操作任意次:选择任意两个数\(a_i,a_j\),满足\(2\mida_i\)\(a_i=\frac{a_i}{2}\)\(a_j=2\cdota_j\)请找到经过任意此操作后的最大\(\sum_{i=1}^{n}a_i\)。在唯一分解定理下讨论两个数\(a_i=2^{\alpha_i}\cdotx,a......
  • 关于Unity2021 Timeline
    谨以我的第一篇游戏&图形学(可能没啥关系)相关blog缅怀带我入门的毛星云前辈。总感觉想说点什么,却又什么都说不出来。我大概很长时间都不会忘记这个名字。作为一个unity初学者,记录一下自己的unitytimeline使用过程。突发奇想了解了一下,说不定未来能自己做个avg(笑[toc]#1、Tim......
  • 【2023潇湘夜雨】LTSC_2021.19044.3448软件选装纯净版(9.15)
    【系统简介】=============================================================1.本次更新母盘来自LTSC_2021.19044.3448。2.增加部分优化方案,手工精简部分较多。3.OS版本号为19044.3448。精简系统只是为部分用户安装,个别要求高的去MSDN下。4.集成《DrvCeo-2.13.0.8》网卡版、运行库......
  • 20211326德永学习笔记2
    第九章总结要点1.I/O库函数与系统调用系统调用函数:open()、read()、write()、lseek()、close();I/O库函数:fopen()、fread()、fwrite()、flseek()、fclose()。I/O库函数一一对应地依赖于系统调用函数。2、I/O库函数的算法-2.1fread算法在第一次调用fread()时,FILE结构体的缓......
  • The 2021 ICPC Asia Macau Regional Contest
    目录写在前面AKFCGI写在最后写在前面比赛地址:https://codeforces.com/gym/104373当了一场口胡选手。我是彩笔。以下按个人向难度排序。A随便找条路径,检查路径是否满足条件,满足则直接输出,否则倒序输出。CodebyYRMrSu:#include<bits/stdc++.h>#defineLLlonglongusing......
  • CSP 202109-2 非零段划分
    题目C++代码//202109-2非零段划分#include<iostream>#include<cstdio>#include<algorithm>usingnamespacestd;constintN=500010;constintM=10010;inta[N],d[M];//d[i]为差分数组boolc[N];intn,ans,sum;intmain(){scanf(&q......
  • XMind2021免安装绿色便携版教程来了!
    安装直接解压从文末获取到的压缩包打开解压的文件夹,找到XMind.exe,右键选择发送到->桌面快捷方式回到桌面双击快捷方式,启动XMind2021至此,你的XMind就安装解锁成了获取顶尖架构师栈关键字公号资源XMindXMind全系列激活工具教程C01超10G后端学习面试资源......
  • XMind2021免安装绿色便携版教程来了!
    安装直接解压从文末获取到的压缩包打开解压的文件夹,找到XMind.exe,右键选择发送到->桌面快捷方式回到桌面双击快捷方式,启动XMind2021至此,你的XMind就安装解锁成了获取顶尖架构师栈关键字公号资源XMindXMind全系列激活工具教程C01超10G后端学习面试资......
  • 20211312徐元琦 学习笔记1
    历史:Unix是早期的商业化操作系统,诞生于20世纪60年代,最早由AT&T的贝尔实验室开发。它的设计目标是支持多用户和多任务的环境。Linux是由LinusTorvalds于1991年创建的开源操作系统。它最初是为个人计算机而开发,后来演变成一个广泛的操作系统家族。联系:Linux是基于Unix的设计,因......