码迷,mamicode.com
首页 > 其他好文 > 详细

topcoder srm 704 div1 -1000

时间:2017-03-08 18:50:08      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:return   max   fst   pair   name   pre   begin   vector   srm   

1、对于一棵树上的一个节点$u$,定义$f(u)$表示树上距离$u$最远的节点到$u$的距离。给出每个节点的$f$值,构造出这棵树。

思路:找到树的主干,然后不在主干上的节点一定可以连接到主干的某个节点上。

#include <iostream>
#include <map>
#include <string>
#include <stdio.h>
#include <vector>
#include <set>
#include <algorithm>
#include <string.h>
#include <fstream>
#include <sstream>
using namespace std;



const int N=1000005;
const int mod=1000000007;



class TreeDistanceConstruction
{
    int a[111];

    int get(int t,vector<pair<int,int>> &p)
    {
        for(int i=0;i<(int)p.size();++i)
        {
            if(p[i].first==t)
            {
                if(!a[p[i].second])
                {
                    a[p[i].second]=1;
                    return p[i].second;
                }
            }
        }
        return -1;
    }

public:
    vector<int> construct(vector<int> d)
    {
        const int n=(int)d.size();
        vector<pair<int,int>> p;
        for(int i=0;i<n;++i)
        {
            p.push_back(make_pair(d[i],i));
        }
        sort(p.begin(),p.end());
        vector<int> ans;
        const int Max=p.back().first;
        const int Min=p[0].first;

        if(Min<(Max+1)/2) return ans;
        if(Min>(Max+1)/2) return ans;

        memset(a,0,sizeof(a));

        if(Max&1)
        {
            const int K=(Max+1)>>1;
            vector<int> ll,rr;
            for(int i=K;i<=Max;++i)
            {
                int t=get(i,p);
                if(t==-1) return ans;
                ll.push_back(t);
                t=get(i,p);
                if(t==-1) return ans;
                rr.push_back(t);
            }
            if(get(K,p)!=-1) return ans;

            for(int i=0;i+1<(int)ll.size();++i)
            {
                ans.push_back(ll[i]);
                ans.push_back(ll[i+1]);
            }
            for(int i=0;i+1<(int)rr.size();++i)
            {
                ans.push_back(rr[i]);
                ans.push_back(rr[i+1]);
            }
            ans.push_back(ll[0]);
            ans.push_back(rr[0]);

            for(int i=0;i<(int)p.size();++i)
            {
                int id=p[i].second;
                if(!a[id])
                {
                    int len=p[i].first;
                    int nIndex=len-K-1;
                    ans.push_back(id);
                    ans.push_back(ll[nIndex]);
                }
            }
            return ans;
        }
        else
        {
            const int K=Max>>1;
            const int Kid=get(K,p);

            if(Kid==-1) return ans;

            if(get(K,p)!=-1) return ans;

            vector<int> ll,rr;
            for(int i=K+1;i<=Max;++i)
            {
                int t=get(i,p);
                if(t==-1) return ans;
                ll.push_back(t);
                t=get(i,p);
                if(t==-1) return ans;
                rr.push_back(t);
            }


            for(int i=0;i+1<(int)ll.size();++i)
            {
                ans.push_back(ll[i]);
                ans.push_back(ll[i+1]);
            }
            for(int i=0;i+1<(int)rr.size();++i)
            {
                ans.push_back(rr[i]);
                ans.push_back(rr[i+1]);
            }
            ans.push_back(ll[0]);
            ans.push_back(Kid);
            ans.push_back(rr[0]);
            ans.push_back(Kid);

            ll.insert(ll.begin(),Kid);

            for(int i=0;i<(int)p.size();++i)
            {
                int id=p[i].second;
                if(!a[id])
                {
                    int len=p[i].first;
                    int nIndex=len-K-1;
                    ans.push_back(id);
                    ans.push_back(ll[nIndex]);
                }
            }
            return ans;
        }

    }
};

  

topcoder srm 704 div1 -1000

标签:return   max   fst   pair   name   pre   begin   vector   srm   

原文地址:http://www.cnblogs.com/jianglangcaijin/p/6520590.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!