3.21 每日一题题解

小K的疑惑

题目链接:https://ac.nowcoder.com/acm/problem/20823

涉及知识点:

  • 思维/搜索/简单图论

solution:

  • 题目要求??????(??,??) = ??????(??,??) = ??????(??,??) ,首先要满足每两个节点的距离都是偶数,即??????(??,??) = ??????(??,??) = ??????(??,??) = 0
  • 由于树上任意两点的距离是唯一的,所以如果i到j的距离是奇数,j到k的距离是奇数,那么i到k的距离一定是偶数
  • 所以题目简化成找树上任意两点的距离是偶数的方案数
  • 树上dp也是可行解,我们考虑简单的做法:
  • 考虑以1号节点(任意节点都可以),到其余所有节点的距离,长度为偶数的记为k1 , 长度为奇数的记为k2(1号节点到1号节点的长度 = 0 ,也要算到答案中去)
  • 那么答案其实就是k1×k1×k1 + k2×k2×k2
  • 距离1号节点长度为奇数的也要算到里面,因为两条长度为奇数边相连就构成了偶数
  • 这里的三次方意思就是(i, j ,k)位置上可以放置任意一个元素(组合数)

std:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 100005;
int n;
struct node{
    int x,z;
};
vector<node> v[maxn];
ll cnt1 = 0,cnt2 = 0;
void dfs(int x,int fa,int z)
{
    if(z%2)cnt1++;
    else cnt2++;
    for(int i=0;i<v[x].size();i++){
        if(v[x][i].x == fa)
            continue ;
        dfs(v[x][i].x , x , (z+v[x][i].z)%2);
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<n;i++){
        int x,y,z;
        cin>>x>>y>>z;
        v[x].push_back(node{y , z});
        v[y].push_back(node{x , z});
    }
    dfs(1, 0 , 0);
    cout<<cnt1*cnt1*cnt1 + cnt2*cnt2*cnt2<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/QFNU-ACM/p/12536460.html

时间: 2024-10-07 07:58:40

3.21 每日一题题解的相关文章

3.25 每日一题题解

tokitsukaze and Soldier 题目链接:https://ac.nowcoder.com/acm/problem/50439 涉及知识点: 优先队列/贪心 solution: 每个士兵都有战力Vi和一个限制Si,我们先按照每个士兵的Si从大到小进行排序 然后我们根据排好序的士兵遍历 因为士兵的Si从大到小,所以遍历的过程中,当前遍历的士兵对应的si一定是最小 所以我们可以维护一个大小由Si较小的优先队列 如果队列大小小于当前遍历士兵的Si,就扔到优先队列里,一旦士兵的人数超过限制

2019.1.21每日一题

Description 求 1-n 1\sim n 1-n 之间素数个数. 输入格式 一行一个数 n n n . 输出格式 一行一个数,表示答案. 样例 样例输入 10 样例输出 4 样例解释 1 2,3,5,72,3,5,72,3,5,7 #include<stdio.h>int sum(int n);int main(){    int i,a;    int result=0;    scanf("%d",&a);    for(i=2;i<=a;i++

3.22 每日一题题解

Farewell Party 题目链接:https://codeforces.com/problemset/problem/1081/B 涉及知识点: 思维/构造 solution: 考虑颜色不同的人数不是很好想,下面我们考虑帽子颜色相同的人数 样例2的3 3 2 2 2,反过来就是2 2 3 3 3 这样是不是就能看出来如何判断了,把颜色相同的人加到一起,如果加起来人的个数 = 对应颜色相同的人数,就对了 当然不是! 如果输入 2 2 2 2 ,我们会输出Impossible,其实我们忽略了一

3.31 每日一题题解

Arpa's obvious problem and Mehrdad's terrible solution 题目链接:http://codeforces.com/problemset/problem/742/B 涉及知识点: 数学 solution: 题意就是让你找出给定数列里两两异或值为x的组合个数 暴力n方,会超时 根据异或运算性质:a^b=x; x^a=b; x^b=a; 所以可以直接O(n)的遍历每一个数,查找x异或这个数是否存在即可 std: #include <bits/stdc+

4.6 每日一题题解

三角形 题目链接:https://ac.nowcoder.com/acm/contest/4911/B 涉及知识点: 背包dp solution: 背包是dp算法中非常经典的一个问题(如果打算学dp的同学必须要学会背包问题),具体的大家可以看我发在群里的背包九讲pdf 关于这道题目,我们可以对每一个宝箱做一个背包 题目要求从每一个宝箱中有且只能取一个,所以设dp[i][j]为枚举到第i个宝箱,可以获得钱数等于j的方案数 那么转移方程就等于 dp[ i ][ z ] += dp[ i-1 ][ z

4.11 每日一题题解

完全平方数 题目链接:https://ac.nowcoder.com/acm/contest/37/A 涉及知识点: 暴力/二分 solution: \(祝大家周末愉快\) \([1,n]区间的完全平方数的个数等于\) \(\sqrt{n}\) \([L,R]区间的完全平方数的个数可以理解为\) $\sqrt{R} - \sqrt{L-1} $ \(0也是完全平方数,L和R是否为0判断一下即可\) \(当然将所有平方数放入数组,lowerbound二分也是时间复杂度允许的可行解\) std: #

CISP/CISA 每日一题 21

CISSP 每日一题(答)What is the term that identifies data ona disk after the data has supposedly been erased? Dataremanence What are the steps of a patch management program? Evaluate,test, apply, and audit patches What can be used to verify patches havebeen

老男孩教育每日一题-第126天-通过shell脚本打印乘法口诀表

问题背景: 生成9*9乘法表 [[email protected] ~]# seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}' 1x1=1 1x2=2   2x2=4 1x3=3   2x3=6   3x3=9 1x4=4   2x4=8   3x4=12  4x4=16 1x5=5

老男孩教育每日一题-2017年5月17日-使用三剑客进行变化格式

1.题目 原始数据: 17/Apr/2015:09:29:24 +0800 17/Apr/2015:09:30:26 +0800 17/Apr/2015:09:31:56 +0800 18/Apr/2015:09:34:12 +0800 18/Apr/2015:09:35:23 +0800 19/Apr/2015:09:23:34 +0800 19/Apr/2015:09:22:21 +0800 20/Apr/2015:09:45:22 +0800 期望结果: 2015-04-17 09:29: