摘要: 记录每个节点的出度,叶子节点出度为0,每删掉一个叶子,度数-1,如果一个节点的出度变成0,那么它变成新的叶子。先把所有叶子放到优先队列中。从左往右遍历给定序列,对于root[i],每次取出叶子中编号最小的那个与root[i]相连,并且--degree[ root[i] ],如果degree[ root[i] ]为0,那么把root[i]放入优先队列。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 8 using namespace std; 9 10 const int MAXN = 751... 阅读全文
posted @ 2013-08-02 21:42 冰鸮 阅读(279) 评论(0) 推荐(0)
摘要: 二分H2的位置,判断条件为是否有Hi 2 #include 3 #include 4 #include 5 #include 6 7 using namespace std; 8 9 const double eps = 1e-9;10 11 int N;12 double A;13 14 int dcmp( double a )15 {16 if ( fabs(a) 0 )41 {42 //++cnt;43 double mid = ( l + r ) / 2.0;44 //pri... 阅读全文
posted @ 2013-08-02 21:31 冰鸮 阅读(174) 评论(0) 推荐(0)
摘要: 实际上就是问这个区间编号连续的段的个数,假如一个编号连续的段有(a+b)个人,我把他们分在同一组能得到的分值为(a+b)^2,而把他们分成人数为a和b的两组的话,得到的分值就是a^2+b^2,显然(a+b)^2 > a^2+b^2,所以对于每个区间,尽可能把他们分成尽量少的组。考虑把这些数从后往前添加,每添加一个数num[i],如果num[i]+1或者num[i]-1有且只有一个已经存在,则段数不变;如果num[i]+1和num[i]-1同时存在,则段数-1,如果都不在,则段数+1。对于每个数num[i],我们记录把它添加进去的时候,它对段数产生的影响为c[i]( 即插入num[i]时对 阅读全文
posted @ 2013-08-02 21:09 冰鸮 阅读(224) 评论(0) 推荐(0)