博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF997B Roman Digits
阅读量:5339 次
发布时间:2019-06-15

本文共 2539 字,大约阅读时间需要 8 分钟。

题意翻译

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

题目描述

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: 
31 21 3
输出样例#1: 
32 3 32 1 1
输入样例#2: 
51 21 32 42 5
输出样例#2: 
93 5 54 3 34 1 14 2 2

 

Solution:

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

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

代码:

 

1 #include
2 #include
3 #include
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
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\n",solve(n)):printf("%lld\n",solve(11)+1ll*(n-11)*49);27 return 0;28 }

 

转载于:https://www.cnblogs.com/five20/p/9370417.html

你可能感兴趣的文章
JavaScript对象之面向对象
查看>>
C#中List和数组之间转换的方法
查看>>
屏幕分辨率过高导致软件界面显示过小影响使用
查看>>
算法 - 树最小公共节点
查看>>
Java "==" 和 "equals" 和 "" 问题
查看>>
SQL SERVER树形结构数据——批量删除分组数据
查看>>
python安装问题
查看>>
C#笔记
查看>>
PHP 中filter_var的使用
查看>>
使用IntelliJ IDEA 配置Maven(入门)
查看>>
ViewBag & ViewData
查看>>
关于谷歌浏览器Chrome正在处理请求的问题解决
查看>>
Git核心技术:在Ubuntu下部署Gitolite服务端
查看>>
git command
查看>>
Win10任务栏搜索框无法搜索,显示白色页面
查看>>
用Apache Spark和TensorFlow进行的深度学习
查看>>
c++第三周总结
查看>>
一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 保留两位小数...
查看>>
Android简单注册表单
查看>>
平面波展开法总结
查看>>