8/18 牛客加赛补题

Posted 钟钟终

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8/18 牛客加赛补题相关的知识,希望对你有一定的参考价值。

E-Everyone is bot

题意:一个复读的游戏,倒数第p个人复读会被惩罚,其他人则获得a[i][j]个冰红茶。
每个人只能参与一次复读,且可以选择是否复读。
思路:
1.首先,倒数第p个人会被惩罚。首先看n=5,p=3,则只能n-p个人参与复读,若n-p+1个人参与,则后面p-1个人都参与,那它就会被惩罚,因此都不会参与。
2.再看n=5,p=2,这组数据,只能由n-2p个人复读,若n-2p+1个人复读,则剩下p+1个人也会复读。
因此可看出只能由n-(n/p)*p个人复读。

#include<bits/stdc++.h>
#define endl '\\n'
#define re register
#define int long long
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
#define maxn 1000000000LL
#define ULL unsigned long long
using namespace std;
const int N=3e3+10;
const int inf=0x3f3f3f3f;
const int mod=1e7+7;
int n,p,a[N][N];

void solve()

    cin>>n>>p;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>a[i][j];
    int g=n-(n/p)*p;
    for(int i=1;i<=n;i++)
        if(i<=g)
            cout<<a[i][i]<<" ";
        else
            cout<<0<<" ";
    cout<<endl;

signed main()

    //int t;cin>>t;
    //while(t--)
        solve();
    return 0;


H-Here is an Easy Problem of Zero-chan

题意:给定一个值x,和i进行lca,求出公共节点数相乘问有多少个后缀0
思路:暴力的方式首先排除
1.后缀0的形成,需要因子2和5,而0的个数取决于2和5个数中的较小值。
2.结合题目,每个结点i和x的最近公共祖先,可考虑到:x子树中的结点lca为x,而x和其他结点lca为x的祖先。
3.可用一种削减的方式。先考虑根节点中2的个数和5的个数。2的个数siz[u]*two[u],5的同理;如果递归到子树节点,则要减去已根为lca的结点num1-siz[v]*two[u],加上已v为lca的点。
4.将点分为两类,一类为已x为最近公共祖先的子树结点,一类为x的祖先为lca的结点。

#include<bits/stdc++.h>
#define endl '\\n'
#define re register
#define int long long
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
#define maxn 1000000000LL
#define ULL unsigned long long
using namespace std;
const int N=7e5+10;
const int inf=0x3f3f3f3f;
const int mod=1e7+7;
int n,q,d[N],two[N],five[N],siz[N],ans[N];
int dep[N];     //存u点的深度
int fa[N][20];  //存从u点向上跳2^i层的祖先节点
vector<int>e[N];
void dfs(int u,int pare)

    dep[u]=dep[pare]+1;
    fa[u][0]=pare;
    siz[u]=1;
    for(int i=1;i<=19;i++)
        fa[u][i]=fa[fa[u][i-1]][i-1];
    for(int v:e[u])
        if(v!=pare)
        
            dfs(v,u);siz[u]+=siz[v];
        

void dfs1(int u,int fa,int num1,int num2)

    num1+=siz[u]*two[u],num2+=siz[u]*five[u];
    ans[u]=min(num1,num2);
    for(int v:e[u])
    
        if(v==fa) continue;
        dfs1(v,u,num1-siz[v]*two[u],num2-siz[v]*five[u]);
    

//利用st表求lca
int lca(int u,int v)

    if(dep[u]<dep[v]) swap(u,v);
    for(int i=19;i>=0;i--)
        //先跳到同一层
        if(dep[fa[u][i]]>=dep[v])
            u=fa[u][i];
    if(u==v)    return v;
    //跳到lca的下一层
    for(int i=19;i>=0;i--)
        if(fa[u][i]!=fa[v][i])
        u=fa[u][i],v=fa[v][i];
    return fa[u][0];


void solve()

    cin>>n>>q;
    for(int i=1,u,v;i<n;i++)
    
        cin>>u>>v;
        e[u].push_back(v);e[v].push_back(u);
    
    for(int i=1;i<=n;i++)
    
        int tmp=i;
        while(tmp%2==0) two[i]++,tmp/=2;
        while(tmp%5==0) five[i]++,tmp/=5;
    
    dfs(1,0);
    dfs1(1,0,0,0);
    while(q--)
    
        int x;cin>>x;
        cout<<ans[x]<<endl;
    

signed main()

    //int t;cin>>t;
    //while(t--)
        solve();
    return 0;


M-Maimai DX 2077

一道模拟题,题意还算清晰。但有个地方没看懂,A是标准分数中如果全是critical perfect将得到的分数。
理解是硬伤!!!

#include<bits/stdc++.h>
#define endl '\\n'
#define re register
#define int long long
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
#define maxn 1000000000LL
#define ULL unsigned long long
using namespace std;
const int N=7e5+10;
const int inf=0x3f3f3f3f;
const int mod=1e7+7;
double a1,a2,b1,b2;
double a[4][5]=1,1,0.8,0.5,0,
                2,2,1.6,1.0,0,
                3,3,2.4,1.5,0,
                5,5,2.5,2.0,0;
double b[5]=1,0.5,0.4,0.3,0;


void solve()

    for(int i=0;i<4;i++)
    
        for(int j=0;j<5;j++)
        
            int x;cin>>x;
            a1+=x*a[i][j];
            a2+=x*a[i][0];
            if(i==3)
                b1+=b[j]*x,b2+=x*b[0];
        
    
    double ans=a1/a2*100+b1/b2;
    cout<<fixed<<setprecision(9)<<ans<<endl;

signed main()

    //int t;cin>>t;
    //while(t--)
        solve();
    return 0;


J-Jellyfish and its dream

差分数组。(2,0)可转化为(0,0),(1,1)可转化为(2,0),(0,1)可转化为(1,0),因此只要1的个数大于等于2的个数,便可将数组全消为0.

#include<bits/stdc++.h>
#define endl '\\n'
#define re register
#define int long long
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
#define maxn 1000000000LL
#define ULL unsigned long long
using namespace std;
const int N=7e6+10;
const int inf=0x3f3f3f3f;
const int mod=1e7+7;
int n,a[N];

void solve()

    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    int x=0,y=0;
    for(int i=0;i<n;i++)
    
        if(a[i]!=a[(i+1)%n])
        
            if((a[i]+1)%3==a[(i+1)%n])
                x++;
            else
                y++;
        
    
    if(x>=y)
        cout<<"YES"<<endl;
    else
        cout<<"NO"<<endl;

signed main()

    int t;cin>>t;
    while(t--)
        solve();
    return 0;


以上是关于8/18 牛客加赛补题的主要内容,如果未能解决你的问题,请参考以下文章

二叉树有关习题整理145二叉树的后序遍历 94二叉树的中序遍历 572另一棵树的子树 236二叉树的最近公共祖先 JZ36二叉搜索树与双向链表 - 牛客

2022牛客多校2补题

2022牛客多校2补题

2022牛客多校2补题

2022牛客多校2补题

牛客小白月赛71 补题记录