牛客编程巅峰赛S2赛季第10场代码
初级场A 数学实验
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param n long长整型 老师给牛牛的数字
* @return int整型
*/
int mathexp(long long n) {
// write code here
while (1){
long long te=n,nn=te%10;
te/=10;
while (te){
nn*=(te%10);
te/=10;
}
if (nn==n) break;
n=nn;
}
return n;
}
};
初级场B&高级场A 奇怪的排序问题
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param n int整型
* @param a int整型vector
* @return int整型
*/
int f[1100000];
int wwork(int n, vector<int>& a) {
// write code here
int ans=0;
int mi=n+1;
for(int i=n-1;i>=0;--i){
if (mi<a[i]) ++ans;
if (a[i]<mi) mi=a[i];
}
return ans;
}
};
初级场C&高级场B XOR和
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param n int整型
* @return long长整型
*/
long long Sum(int n) {
// write code here
long long ans=0;
for(long long i=1;i<=n;i<<=1){
ans+=n/i*i;
}
return ans;
}
};
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param n int整型 点的个数
* @param u int整型vector 每条边的起点
* @param v int整型vector 每条边的终点
* @param p int整型vector 每个点的价值
* @return long长整型
*/
vector<int> P;
long long f[110000][21],ans;
vector<int> e[110000];
void dfs(int x,int fa){
for(int y:e[x])if (y!=fa){
dfs(y,x);
for(int i=0;i<=20;++i) if (P[x]&(1<<i)){
f[x][i]+=f[y][i];
ans-=((f[y][i]*f[y][i])<<i);
}
}
for(int i=0;i<=20;++i){
if (P[x]&(1<<i)) f[x][i]++;
ans+=((f[x][i]*f[x][i])<<i);
}
}
long long solve(int n, vector<int>& u, vector<int>& v, vector<int>& p) {
P=p;
for(int i=0;i<u.size();++i){
e[u[i]].push_back(v[i]);
e[v[i]].push_back(u[i]);
}
dfs(0,-1);
long long te=0;
for(int i=0;i<p.size();++i)
te+=p[i];
ans=(ans-te)/2+te;
return ans;
}
};