• CF997B Roman Digits


    题意翻译

    给你一棵树,每次挑选这棵树的两个叶子,加上他们之间的边数(距离),然后将其中一个点去掉,问你边数(距离)之和最大可以是多少.

    题目描述

    You are given an unweighted tree with n n n vertices. Then n−1 n-1 n1 following operations are applied to the tree. A single operation consists of the following steps:

    1. choose two leaves;
    2. add the length of the simple path between them to the answer;
    3. remove one of the chosen leaves from the tree.

    Initial answer (before applying operations) is 0 0 0 . Obviously after n−1 n-1 n1 such operations the tree will consist of a single vertex.

    Calculate the maximal possible answer you can achieve, and construct a sequence of operations that allows you to achieve this answer!

    输入输出格式

    输入格式:

    The first line contains one integer number n n n ( 2<=n<=2⋅105 2<=n<=2·10^{5} 2<=n<=2105 ) — the number of vertices in the tree.

    Next n−1 n-1 n1 lines describe the edges of the tree in form ai,bi a_{i},b_{i} ai,bi ( 1<=ai 1<=a_{i} 1<=ai , bi<=n b_{i}<=n bi<=n , ai≠bi a_{i}≠b_{i} aibi ). It is guaranteed that given graph is a tree.

    输出格式:

    In the first line print one integer number — maximal possible answer.

    In the next n−1 n-1 n1 lines print the operations in order of their applying in format ai,bi,ci a_{i},b_{i},c_{i} ai,bi,ci , where ai,bi a_{i},b_{i} ai,bi — pair of the leaves that are chosen in the current operation ( 1<=ai 1<=a_{i} 1<=ai , bi<=n b_{i}<=n bi<=n ), ci c_{i} ci ( 1<=ci<=n 1<=c_{i}<=n 1<=ci<=n , ci=ai c_{i}=a_{i} ci​=ai​ or ci=bi c_{i}=b_{i} ci​=bi​ ) — choosen leaf that is removed from the tree in the current operation.

    See the examples for better understanding.

    输入输出样例

    输入样例#1: 
    3
    1 2
    1 3
    
    输出样例#1: 
    3
    2 3 3
    2 1 1
    
    输入样例#2: 
    5
    1 2
    1 3
    2 4
    2 5
    
    输出样例#2: 
    9
    3 5 5
    4 3 3
    4 1 1
    4 2 2
    

    Solution:

      昨天学长讲课的题目,思路贼有意思。

      我们先打表$O(n^3)$枚举答案,枚举到$n=11$时会发现后面答案每次加$49$,这样就可以直接乱搞了。

    代码:

     1 #include<bits/stdc++.h>
     2 #include<ext/pb_ds/assoc_container.hpp>
     3 #include<ext/pb_ds/hash_policy.hpp>
     4 #define il inline
     5 #define ll long long
     6 #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
     7 #define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
     8 using namespace std;
     9 using namespace __gnu_pbds;
    10 int n;
    11 ll ans;
    12 gp_hash_table<int,bool>mp;
    13 
    14 il int solve(int x){
    15     int ans,tot=0;
    16     for(int i=0;i<=x;i++) for(int j=0;i+j<=x;j++) for(int k=0;i+j+k<=x;k++){
    17         ans=i+j*5+k*10+(x-i-j-k)*50;
    18         if(!mp[ans]) mp[ans]=1,tot++;
    19     }
    20     return tot;
    21 }
    22 
    23 int main(){
    24     ios::sync_with_stdio(0);
    25     cin>>n;
    26     n<=11?printf("%d
    ",solve(n)):printf("%lld
    ",solve(11)+1ll*(n-11)*49);
    27     return 0;
    28 }
  • 相关阅读:
    strcpy 详解
    c/c++中static详解
    c/c++中const详解
    12、Java中的接口
    11、java中的模板方法设计模式
    10、java中的抽象类
    9、java中的final关键字
    8、java继承中的this和super的应用
    7、java实现的两种单例模式
    6、java中的构造代码块
  • 原文地址:https://www.cnblogs.com/five20/p/9370417.html
Copyright © 2020-2023  润新知