牛客编程巅峰赛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;
    }
};

高级场C 牛牛的路径和
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;
    }
};

#题解#
全部评论

相关推荐

喜欢吃蛋糕仰泳鲈鱼是我的神:字节可以找个hr 给你挂了,再放池子捞
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务