首页 > 其他分享 >2024牛客多校1

2024牛客多校1

时间:2024-08-10 12:53:47浏览次数:9  
标签:name int 个数 多校 2024 牛客 maxn dp mod

H
签到题,对于每场比赛排名在 lzr010506 前面且同时在两场比赛出现的的队伍,让他们全部去另一场,看看哪种情况 lzr010506 的排名更高即可。

#include<bits/stdc++.h>
#define endl '\n'

using namespace std;
const int maxn = 1e5+3;

struct team
{
    string name;
    int num,time;
}a[maxn],b[maxn];
map<string,int> s;

bool cmp(team &x,team &y)
{
    if(x.num==y.num) return x.time<y.time;
    return x.num>y.num;
}

void solve()
{
    int n; cin>>n;
    for(int i=1;i<=n;i++)
    cin>>a[i].name>>a[i].num>>a[i].time,s[a[i].name]++;
    int m; cin>>m;
    for(int i=1;i<=m;i++)
    cin>>b[i].name>>b[i].num>>b[i].time,s[b[i].name]++;
    sort(a+1,a+1+n,cmp);
    sort(b+1,b+1+m,cmp);
    // cout<<"46"<<endl;
    // for(int i=1;i<=n;i++)
    // {
    //     cout<<a[i].name<<" "<<a[i].num<<" "<<a[i].time<<endl;
    // }
    int rank;
    int t=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i].name=="lzr010506") 
        {
            rank=i-t;
            break;
        }
        if(s[a[i].name]>1) t++;
    }
    t=0;
    for(int i=1;i<=m;i++)
    {
        if(b[i].name=="lzr010506") 
        {
            rank=min(rank,i-t);
            break;
        }
        if(s[b[i].name]>1) t++;
    }
    cout<<rank<<endl;
    return ;
}

int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T; T=1;
    while(T--) solve();
    return 0;
}

C
不妨假设现在的数组为 a[6]={0,1,2,3,4,5},则后缀数组为
s [ 1 ] = a 1 + a 2 + a 3 + a 4 + a 5 s[1]=a_1+a_2+a_3+a_4+a_5 s[1]=a1​+a2​+a3​+a4​+a5​
s [ 2 ] = a 2 + a 3 + a 4 + a 5 s[2]=a_2+a_3+a_4+a_5 s[2]=a2​+a3​+a4​+a5​
s [ 3 ] = a 3 + a 4 + a 5 s[3]=a_3+a_4+a_5 s[3]=a3​+a4​+a5​
s [ 4 ] = a 4 + a 5 s[4]=a_4+a_5 s[4]=a4​+a5​
s [ 5 ] = a 5 s[5]=a_5 s[5]=a5​
可以观察到第 i 个元素对后缀数组和的贡献为 i 次,因此移除的时候减,增加的时候加即可。

  • 注意取模涉及到减号时要加上 mod 来防止负数。
#include<bits/stdc++.h>
#define endl '\n'
#define int long long

using namespace std;

const int maxn = 5e5+3;
const int mod = 1e9+7;
int a[maxn],sum[maxn];

void solve()
{
    int q; cin>>q;
    int t,v; 
    int cnt=0;
    int ans=0;
    while(q--)
    {
        cin>>t>>v;
        while(t--) 
        {
            ans=(ans-cnt*a[cnt]%mod+mod)%mod; // 涉及到减号取模时一般都要 +mod 来防止负数
            cnt--;
        }
        a[++cnt]=v;
        ans=(ans%mod+cnt*a[cnt]%mod)%mod;
        cout<<ans<<endl;
    }
    return ;
}

signed main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T; T=1;
    while(T--) solve();
    return 0;
}

A
求有多长长为 n 的元素在 [ 0 , 2 m ) [0,2^m) [0,2m) 的序列满足存在一个非空子序列的 AND 和是1。
观察数据范围可以发现,一定至少有 n 个奇数,从二进制的角度来考虑, AND 和为1,最后一位只能是 1,不妨假设满足条件的序列中有 k 个数在满足条件的子序列中,那么不在子序列中的数就是 n-k 个,对于不在子序列中的数,二进制的最后一位一定是0,剩下的随便填,共 2 ( m − 1 ) ∗ ( n − k ) 2^{(m-1)*(n-k)} 2(m−1)∗(n−k) 中情况,而挑出来的这k个数要想满足条件,必须满足前 m-1 位每位至少存在一个 0,这样一共是 ( 2 k − 1 ) ( m − 1 ) (2^k-1)^{(m-1)} (2k−1)(m−1)。
综上最后的答案为 C n k ∗ 2 ( m − 1 ) ∗ ( n − k ) ∗ ( 2 k − 1 ) ( m − 1 ) C_n^k*2^{(m-1)*(n-k)}*(2^k-1)^{(m-1)} Cnk​∗2(m−1)∗(n−k)∗(2k−1)(m−1),k 从 1 到 n。
由于 q 不一定是质数,因此如果需要求逆元的话不能用费马小定理,用 exgcd。

#include<bits/stdc++.h>
#define endl '\n'
#define int long long

using namespace std;
using ll = long long;

const int maxn = 5001;
int pw[maxn],C[maxn];
int n,m,mod;
    
int ksm(int a,int b)
{
    int res=1;
    while(b)
    {
        if(b&1) res=(res*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return res;
}

void solve()
{
    cin>>n>>m>>mod;
    pw[0]=1;
    int q=max(n,m);
    for(int i=1;i<=q;i++)
    pw[i]=(pw[i-1]*2)%mod;
    C[0]=1;
    for(int i=1;i<=n;i++) // 计算 C[n][i];
    for(int j=i;j>0;j--)
    C[j]=(C[j]+C[j-1])%mod;
    int res=0;
    for(int k=1;k<=n;k++)
    {
        int cur1=ksm(pw[m-1],n-k);
        int cur2=ksm(pw[k]-1,m-1);
        res=(res+(ll)cur1*cur2%mod*C[k]%mod)%mod;
    }
    cout<<(res+mod)%mod<<endl;
    return ;
}

signed main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T; T=1;
    while(T--) solve();
    return 0;
}

B
和第一题背景一样,只不过满足条件的子序列需要大于等于2。
正难则反,采用容斥,用第一问的答案减去满足条件的子序列为 1 的序列个数即可。
下面分析满足条件的子序列为1的序列的性质,假设满足条件的子序列的长度为 k ,即奇数的个数为 k,那么这 k 个数全部化为二进制可以对应出一个 m*k 的数表,每行对应了一个数的二进制,首先最后一列肯定全部为 1。可以发现,要让子序列的情况唯一,那么这 k 个数一定在某一位有一个 0 且这个零在这一列唯一,这样才能保证删除任意一个数都会使异或和不为 1。我们将这样的 0 所在的位置称为特殊位。
显然,一个数可能有多个特殊位,但一个特殊位一定只对应一个数。
设 d p [ i ] [ j ] dp[i][j] dp[i][j] 为前 i i i 个数有 j j j 个特殊位,对于第 j j j 个特殊位,可以由前 i − 1 i-1 i−1 行的任何一行承担,剩下的 j − 1 j-1 j−1 个特殊位有两种情况,一种是由前 i − 1 i-1 i−1 个数承担,一种是由前 i i i 个数承担,从而有转移方程 d p [ i ] [ j ] = i ∗ ( d p [ i − 1 ] [ j − 1 ] + d p [ i ] [ j − 1 ] ) dp[i][j]=i*(dp[i-1][j-1]+dp[i][j-1]) dp[i][j]=i∗(dp[i−1][j−1]+dp[i][j−1])。
也可以这么理解,新加进来的特殊位可以被这 i i i 个数之一所对应,移除这一位特殊位后肯能还有 i i i 个数对应特殊位,也可能有 i − 1 i-1 i−1 个数对应特殊位。
记这 k k k 个二进制最后一位位 1 的数总共对应了 t t t 个二进制数,那么 t t t 从 k k k 到 m − 1 m-1 m−1 均为要减去的那部分,方案数为 C n k ∗ 2 ( n − k ) ( m − 1 ) ∗ d p [ k ] [ t ] ∗ ( 2 k − 1 − t ) m − 1 − t C_n^k*2^{(n-k)(m-1)}*dp[k][t]*(2^k-1-t)^{m-1-t} Cnk​∗2(n−k)(m−1)∗dp[k][t]∗(2k−1−t)m−1−t , t t t 从 k k k 到 m − 1 m-1 m−1 求和。其中 C n k ∗ 2 ( n − k ) ( m − 1 ) C_n^k*2^{(n-k)(m-1)} Cnk​∗2(n−k)(m−1) 和第一问相同,代表偶数的排列方式,即选出偶数再讨论其前面的 m − 1 m-1 m−1位 d p [ k ] [ t ] ∗ ( 2 k − 1 − t ) m − 1 − t dp[k][t]*(2^k-1-t)^{m-1-t} dp[k][t]∗(2k−1−t)m−1−t 代表了奇数的排列方案数 d p [ k ] [ t ] dp[k][t] dp[k][t] 是除最后一位外的 t 个特殊位对应的特殊列的排列方案,剩下的 m − 1 − t m-1-t m−1−t 列需要满足 0 的个数大于等于 2,因为为 1 的时候不满组 t t t 个特殊位的前提, t t t 为 0 的时候又不满足异或和为 1 的性质。这 m − 1 − t m-1-t m−1−t 列每一列的方案为 2 k − 1 − t 2^k-1-t 2k−1−t ,全部的方案数减去全为 1 的和有一个是 0 的方案。

标签:name,int,个数,多校,2024,牛客,maxn,dp,mod
From: https://blog.csdn.net/jinxdtaiy/article/details/141037714

相关文章

  • 2024/08/10 每日一题
    LeetCode2940找到Alice和Bob可以相遇的建筑方法1:线段树classSolution{staticint[]tree;//存储区间的最大值staticvoidbuild(into,intleft,intright,int[]datas){if(left==right){tree[o]=datas[left-1];......
  • 塔子哥的美食节-阿里淘天2024笔试(codefun2000)
    题目链接塔子哥的美食节-阿里淘天2024笔试(codefun2000)题目内容塔子哥是一位美食评论家,他最近参加了一个美食节,品尝了n种不同的美食,每种美食都有一个特定的人气值。现在,塔子哥想写一篇关于这次美食节的文章,他打算挑选出k种美食,使得文章中能够突出一种特别受欢迎的......
  • 2024牛客暑期多校训练营2
    A.FloorTiles恶心构造,本来构造的方法没有错,因为不小心修改了第一块砖的位置,导致一直过不去,没注意,倒了思路:先把最多曲线的构造出来,就是类似于BAB......
  • 2024,该放弃框架来实现 Web 布局了
    在这里,我并不想评论CSS框架和库的好坏,但一个不争的现实就是,很多Web开发者很容易在众多的CSS框架库中迷失方向。甚至,每个框架和库都向Web开发者承诺,将提供更简单的样式和更流畅的Web布局。然而,在当下,现代CSS特性提供了更简单和更灵活的方法,你完全可以不依赖任何CSS......
  • 【ACM出版,见刊检索快速稳定】第四届物联网与机器学习国际学术会议(IoTML 2024,8月23-25)
    2024年第四届物联网与机器学习国际学术会议(IoTML2024)将于2024年8月23-25日在中国南昌召开。会议将围绕着物联网和机器学习开展,探讨本领域发展所面临的关键性挑战问题和研究方向,以期推动该领域理论、技术在高校和企业的发展和应用,为专注于该研究领域的创新学者、工程师和......
  • 2024年网络信息安全工程师面试题,看看你能做几个?
    一、网络安全网络安全的概念和重要性是什么?常见的网络攻击方式有哪些?网络安全防御措施有什么?计算机病毒和恶意软件有哪些?网络安全法律法规有什么?二、网络协议什么是TCP/IP协议?它包括哪些层次?请简要介绍每个层次的作用。什么是HTTP协议?请简要介绍HTTP协议的......
  • 2024最全最新VMWare以及Linux配置(含yum失效解决方案)
    血泪教训浓缩的精华配置、报错解决(解决99%问题) 目录1.Linux环境搭建1.1安装VMWare1.1.1卸载老版本VMWare(如果有的话) 1.1.2开始安装VMware1.2创建虚拟机1.3安装Centos71.4设置虚拟机快照1.5安装远程连接SSH客户端 重要:新的yum镜像源需要配置(几乎人人都要配置,必......
  • 【保奖思路】2024年华为杯研究生数学建模D题解题思路分享(点个关注,后续会更新
    您的点赞收藏是我继续更新的最大动力!一定要点击如下的卡片链接,那是获取资料的入口!点击链接加入群聊【2024华为杯研赛资料汇】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=MwNruKbEvR9aZns1l7xXBWmQQKYAEh-F&authKey=igaBN79pz6BhNlDQ6TIZ5YFAbn71aDcYL77uANPquLF%2FTVgeSAhE......
  • 【保奖思路】2024年华为杯研究生数学建模D题解题思路分享(点个关注,后续会更新
    您的点赞收藏是我继续更新的最大动力!一定要点击如下的卡片链接,那是获取资料的入口!点击链接加入群聊【2024华为杯研赛资料汇】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=MwNruKbEvR9aZns1l7xXBWmQQKYAEh-F&authKey=igaBN79pz6BhNlDQ6TIZ5YFAbn71aDcYL77uANPquLF%2FTVgeSAhE......
  • 2024-8-9 算法学习
    P5788【模板】单调栈题意:给定一个数列,求数列中每一个元素之后第一个大于该元素的下标若存在一个数大于它之后的数,那么当我们在左边计算答案的话,那个较小的数不可能被统计到。所以利用单调栈的做法,和右边的比就从右边统计,维护一个栈就行了P6510奶牛排队题意:给定一个数列,求......