首页 > 其他分享 >The 2023 ICPC Asia Regionals Online Contest (1) ADI

The 2023 ICPC Asia Regionals Online Contest (1) ADI

时间:2023-09-18 19:46:43浏览次数:134  
标签:const Contest int ll nullptr Asia long 2023 find

The 2023 ICPC Asia Regionals Online Contest (1)

A Qualifiers Ranking Rules

思路:按位次为第一关键字,场次为第二关键字排序即可。

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
int n,m;
int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    cin>>n>>m;
    set<string>s;
    vector<pair<array<int,2>,string>>v;
    int cnt = 0;
    for(int i = 1;i <= n;i++)
    {
        string x;
        cin>>x;
        if(s.find(x)==s.end())
            v.push_back({{++cnt,1},x});
        s.insert(x);

    }
    cnt = 0;
    s.clear();
    for(int i = 1;i <= m;i++)
    {
        string x;
        cin>>x;
        if(s.find(x)==s.end())
            v.push_back({{++cnt,2},x});
        s.insert(x);

    }
    sort(v.begin(), v.end());
    s.clear();
    for(auto [i,x]:v)
    {
        if(s.find(x)==s.end())
            cout<<x<<"\n";
        s.insert(x);
    }

    return 0;
}

D Transitivity

思路:\(n\)个点构成完全图需要\(\dfrac{(n-1)n}{2}\)条边。

如果这个连通块不是完全图,那么答案加上\(\dfrac{(n-1)n}{2}-m\)(m是当前连通块边数)

如果全都是完全图呢?由于至少连一条边,那么我们考虑选两个点数最少的使得它们成为完全图。

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e6 + 10;
ll fa[N],ret[N],d[N],sz[N];
bool vis[N];
int find(int x)
{
    if(x==fa[x])return x;
    return fa[x] = find(fa[x]);
}
ll fx(ll x)
{
    return (x-1)*x/2;
}
vector<pair<int,int>>vec;
int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    int n,m;
    cin>>n>>m;
    for(int i = 1;i <= n; i++)
        fa[i] = i,sz[i] = 1;
    for(int i = 1;i <= m; i++)
    {
        int u,v;
        cin>>u>>v;
        d[u]++,d[v]++;
        vec.push_back({u,v});
    }

    for(auto [u,v] : vec)
    {
        int fu = find(u),fv = find(v);
        if(fu != fv)
        {
            sz[fv] += sz[fu];
            d[fv] += d[fu];
            fa[fu] = fv;
        }
    }

    bool hav = false;
    int cnt = 0;
    ll ans = 0;
    for(int i = 1;i <= n; i++)
    {
        int x = find(i);
        if(!vis[x])
        {
            vis[x] = true;
            if(fx(sz[x])==d[x]/2)
                ret[++cnt] = sz[x];
            else{
                hav = true;
                ans += fx(sz[x])-d[x]/2;
            }
        }
    }

    if(hav)
    {
        cout<<ans<<"\n";
        return 0;
    }

    sort(ret+1,ret+1+cnt);
    ll ve = ret[1]+ret[2];
    ll ed = fx(ret[1])+fx(ret[2]);
    cout<<fx(ve)-ed<<"\n";

    return 0;
}

I Pa?sWorD

思路:状压\(dp\)+前缀和优化。

考虑从前往后枚举,

\(dp[i][j][k]\)表示当前第\(i\)位,第\(i\)位填\(j\)(0-25 小写,26-51大写,52-61数字,62什么都没有),状态是\(k\)(二进制表示:小写、大写、数字)。

如果当前位置\(i\)是\(?\)的话,那么当前位可以是小写,大写或者数字。

由于我们发现\(i\)只由\(i-1\)位转移过来,那么我们考虑用滚动数组。

枚举61种可能(i),然后从前面62种状态(t)和所有k继去继承。

假如第\(i\)位是选择填上小写字母的话,由于相邻两位不能一样,于是:

//假设当前位填j,上一位填t
if(j==t)continue;
else{
	dp[now][j][k|(1<<2)] += dp[pre][t][k];
}

但是这个思路的复杂度是\(O(100000*62*62*8)\),会\(T\),

其实我们考虑从上一位转移过来,考虑可转移的情况(\(k==(w|(1<<2))\))中只有当\(t==j\)(相邻两位一样了)的情况的不符合条件的。那么这里可以考虑做一个前缀和优化。我们可以把上一位转移过来的所有情况数加和,之后再减去不符合条件的。

还是以当前位是问号,填小写字母为例:

 for(int j = 0;j<26;j++)
                for(int k = 0; k < (1<<3); k++)
                    for(int w = 0; w < (1<<3); w++)if((w|(1<<2))==k){
                        dp[now][j][k] += ((a[w]-dp[pre][j][w])%mod+mod)%mod;
                        dp[now][j][k] %= mod;
                    }

以上思路对于这一位填上大写或者数字是同理的。

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 998244353;
const int N = 2e5 + 10;
int n;
string s;
ll dp[2][70][8];
int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    cin>>n>>s;
    s = "?"+s;
    //0~25,26~52,52~61,62
    for(int i = 1;i <= n; i++)
    {
        int now = i&1, pre = (i-1)&1;
        if(i==1)
            dp[pre][62][0] = 1;
        for(int j = 0;j <= 62; j++)
            for(int k = 0;k < (1<<3); k++)
                dp[now][j][k] = 0;
        vector<int>a(10);
        for(int j = 0;j <= 62; j++)
            for(int k = 0; k < (1<<3); k++)
                a[k] += dp[pre][j][k],a[k]%=mod;
        if(s[i]=='?')
        {
            for(int j = 0;j < 26; j++)
                for(int k = 0;k < (1<<3); k++)
                    for(int w = 0;w < (1<<3); w++)if((w|(1<<2))==k){
                        dp[now][j][k] += ((a[w]-dp[pre][j][w])%mod+mod)%mod;
                        dp[now][j][k] %= mod;
                    }

            for(int j = 26;j < 52; j++)
                for(int k = 0;k < (1<<3); k++)
                    for(int w = 0;w < (1<<3); w++)if((w|(1<<1))==k){
                        dp[now][j][k] += ((a[w]-dp[pre][j][w]+mod)%mod)%mod;
                        dp[now][j][k] %= mod;
                    }
           for(int j = 52;j < 62; j++)
                for(int k = 0;k < (1<<3); k++)
                    for(int w = 0;w < (1<<3); w++)if((w|(1<<0))==k){
                        dp[now][j][k] += ((a[w]-dp[pre][j][w])%mod+mod)%mod;
                        dp[now][j][k] %= mod;
                    }
        }
        else if(s[i]>='a'&&s[i]<='z')
        {
            int j = s[i]-'a';
            for(int k = 0;k < (1<<3); k++)
                for(int w = 0;w < (1<<3); w++)if((w|(1<<2))==k){
                    dp[now][j][k] += ((a[w]-dp[pre][j][w])%mod+mod)%mod;
                    dp[now][j][k] %= mod;
                }
            j += 26;
            for(int k = 0;k < (1<<3); k++)
                for(int w = 0;w < (1<<3); w++)if((w|(1<<1))==k){
                    dp[now][j][k] += ((a[w]-dp[pre][j][w])%mod+mod)%mod;
                    dp[now][j][k] %= mod;
                }
        }
        else if(s[i]>='A'&&s[i]<='Z')
        {
            int j = s[i]-'A'+26;
            for(int k = 0;k < (1<<3); k++)
                for(int w = 0;w < (1<<3); w++)if((w|(1<<1))==k){
                    dp[now][j][k] += ((a[w]-dp[pre][j][w])%mod+mod)%mod;
                    dp[now][j][k] %= mod;
                }
        }
        else
        {
            int j = s[i]-'0'+52;
            for(int k = 0;k < (1<<3); k++)
                for(int w = 0;w < (1<<3); w++)if((w|(1<<0))==k){
                    dp[now][j][k] += ((a[w]-dp[pre][j][w])%mod+mod)%mod;
                    dp[now][j][k] %= mod;
                }
        }
    }

    ll ans = 0;
    for(int j = 0;j <= 62; j++)
        ans += dp[n&1][j][7],ans%=mod;
    cout<<ans%mod<<"\n";
    return 0;
}

标签:const,Contest,int,ll,nullptr,Asia,long,2023,find
From: https://www.cnblogs.com/nannandbk/p/17712874.html

相关文章

  • 2023年VR虚拟现实的10个应用行业
    1.医疗保健现代医疗保健的培训方式离不开VR虚拟现实。。由于医疗行业的特殊性,不允许拿大量的病人来练手,但医疗又非常注重实践,一些新手医生就缺乏锻炼的机会,而VR虚拟现实技术很好的解决了这一问题。医生可以在高清晰、低延时、高逼真的虚拟环境中学习和练习,减少了对传统手术中对于......
  • 2023/9/18 虹日刊 关键词:云计算
    ......
  • WebStorm 2023:JavaScript开发者的终极利器
    WebStorm是JetBrains公司开发的一款强大的JavaScript开发工具,为前端开发者提供了丰富的功能和智能,帮助他们提高开发效率、降低出错率并提高代码质量。→→↓↓载RubyMine2023mac+win版代码提示与自动补全:WebStorm能够根据用户输入的内容,提供代码提示与自动补全功能,减少用户......
  • RubyMine 2023:高效Ruby编码工具,适用于macOS和Windows
    RubyMine是JetBrains开发的一款为Ruby开发者量身定制的集成开发环境(IDE)。它为Ruby语言提供了全面的支持,包括代码编辑、调试、测试和集成版本控制系统等功能,帮助开发者更加高效地进行Ruby编程。→→↓↓载RubyMine2023mac+win版代码编辑与自动补全:RubyMine提供了强大的代码编......
  • 每日总结2023/9/18
    今天是个特殊的日子哦,勿忘国耻 ......
  • 多地同频|2023年国家网络安全宣传周 海泰方圆全面参与共建网络强国
    9月11日至17日,2023年国家网络安全宣传周在全国范围内统一开展,以“网络安全为人民网络安全靠人民”为主题,全方位宣贯科普网络安全知识技能、法律法规,并探讨网络安全前沿技术及应用,展示网络安全建设成果。作为密码事业的建设者、践行者和见证者,海泰方圆深度参与国家网络安全宣传周西......
  • 【DSP视频教程】第11期:插补算法,曲线拟合丝滑顺畅,统计函数和基础函数加速实现,汇集SIMD,
    视频教程汇总帖:https://www.armbbs.cn/forum.php?mod=viewthread&tid=110519 DSP视频教程有段时间没有更新了。当前DSP库从CMSIS软件包里面独立出来,并且更新非常频繁,所以本期视频教程优先给大家简单介绍下新版DSP,然后为大家详细介绍了基础函数,统计函数和插补函数。其中基础函数里......
  • 关于举办2023年SHRM-CP考试的通知
    2023年SHRM-CP考试将于2023年12月2日(周六)举行,考试报名相关事项安排如下:一、考试时间:12月2日上午08:00-12:00二、报名时间:即日起至2023年10月13日23:59三、缴费截止时间:2023年10月14日23:59四、报名方式:请点击本页面中“考生报名”按钮,按照要求注册报名。五、参加考试时需......
  • 2023年11月25日PMP报名正式开始!附操作指南
    2023年11月25日PMP®报名时间已经公布,报名时间是根据考试地区而定的。如果您计划参加11月份的PMP®考试,请尽早报名以保证您的考试资格。记得准备好相关材料,将报名账号注册好,以便确保您顺利报考PMP考试。  一、PMP®考试时间:11月25日 二、报名时间:   第一批报名城市:2023年9月1......
  • 2023-09-18 hexo博客之如何自定义页面内容宽度==》在custom.styl中添加两行代码即可
    前言:我的hexo主题为hexo-theme-next 5.1.4版本。操作如下:打开你的博客名称\themes\hexo-theme-next\source\css\_variables,找到这个文件custom.styl,然后把下面代码添加进去:$main-desktop=1200px$content-desktop=1000px刷新页面即可见效。......