牛客编程巅峰赛S2第3场

如何用一个数组给一个vector向量赋值?
 ①当vector是刚刚创建的时候,可以直接初始化。

int a[5]={
    
    1,2,3,4,5};
vector<int> v(a+a+5);

 ②当vector已经被创建过的时候,可以使用Insert函数。

int a[5]={
    
    1,2,3,4,5};
vector<int> v;
v.insert(v.begin(),a,a+5);

比赛地址:
青铜&白银&黄金
钻石&王者


A题:牛牛打怪

  简单模拟。

B 题:简单的公式

  可以采用常见的矩阵快速幂的方式,满足 f ( n ) = A ∗ f ( n − 1 ) + B ∗ f ( n − 2 ) f(n)=A*f(n-1)+B*f(n-2) f(n)=Af(n1)+Bf(n2)这种形式的数列。

C题:Tree VI

  数据结构题。首先这是一棵完全k叉树,对于给定一棵完全树,然后给出了一个前序/中序/后序等遍历顺序的问题,有个通用的解决步骤:先通过层次遍历的方式,利用结点序号之间的关系构建整棵树,然后再针对这棵树去按照规定的方式遍历赋值

const int maxn=1e5+10;
vector<int> v[maxn],aa;
queue<int> q;
int rec[maxn];
long long n,tot=0,kk;
long long ans=0;
class Solution {
    
    
public:
    /**
     *
     * @param k int整型 表示完全k叉树的叉数k
     * @param a int整型vector 表示这棵完全k叉树的Dfs遍历序列的结点编号
     * @return long长整型
     */
    void DFS(int root)
    {
    
    
        int size=v[root].size();rec[root]=aa[tot++];
        if(size==0) return;
        for(int i=0;i<size;++i)
        {
    
    
            DFS(root*kk+i+1);
            ans+=rec[root]^rec[root*kk+i+1];
        }
    }
    long long tree6(long long k, vector<int>& a) {
    
    
        n=a.size();aa=a;kk=k;
        while(!q.empty())  q.pop();
        q.push(0);
        while(!q.empty())
        {
    
    
            int cur=q.front();q.pop();
            for(long long i=1;i<=k;++i)
            {
    
    
                if((long long)cur*k+i>=n) break;//注意不能爆Long Long
                q.push(cur*k+i);
                v[cur].push_back(cur*k+i);
            }
        }
        DFS(0);
        return ans;
    }
};

D:整除问题

  计数问题讲究不重不漏,这里运用了容斥原理。这里首先要根据样例发现2021仅有四个因子:1,43,47,2021。
  问题就变成了二者的乘积是由谁出了这个2021的因子的问题:要不a出;要不b出;要不a出43,b出47;要不a出47,b出43.

class Solution {
    
    
public:
    /**
     * 寻找所有能整除 2021 的数对个数
     * @param a long长整型 
     * @param b long长整型 
     * @param c long长整型 
     * @param d long长整型 
     * @return long长整型
     */
    long long f(long long a,long long b)
    {
    
    
        long long ans=0;
        ans+=(a/2021)*b+a*(b/2021)-(a/2021)*(b/2021);
        ans+=(a/47-a/2021)*(b/43-b/2021)+(a/43-a/2021)*(b/47-b/2021);
        return ans;
    }
    long long findPairs(long long a, long long b, long long c, long long d) {
    
    
        return f(b,d)-f(a-1,d)-f(b,c-1)+f(a-1,c-1);
    }
};

猜你喜欢

转载自blog.csdn.net/CUMT_William_Liu/article/details/111190921
今日推荐