如何用一个数组给一个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)=A∗f(n−1)+B∗f(n−2)这种形式的数列。
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);
}
};