codeforces 853b//Jury Meeting// Codeforces Round #433 (Div. 1)

题意:几个人要去一个城市k天,现给出各航班的日期和花费,让这n个人能相会k天的最小花费?

用数组arr1[i]记录在第i天人到齐的最小花费。arr2[i]记录第i天之后才有人开始走的最小花费。然后取arr1[i]+arr2[i+k+1]的最小值。

//#pragma comment(linker,"/STACK:1024000000,1024000000") 
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
#include <stack>
#include <bitset>
#include <iomanip>
using namespace std;
typedef long long lon;
const lon SZ=1000010,INF=0x7FFFFFFFFFFFFFFFLL;
lon n,m,k,zcnt;
lon zvst[SZ],zsum,zmin[SZ],a[SZ];
lon ncnt,nvst[SZ],nsum,nmin[SZ],b[SZ];
struct nd{
    lon d,from,to,cost;
    nd(lon a,lon b,lon c,lon e):d(a),from(b),to(c),cost(e){}
};

bool cmpd(nd &x,nd &y)
{
    return x.d<y.d;
}

void init()
{
    cin>>n>>m>>k;
    if(m==0)return;
    vector<nd> vct;
    for(lon i=0;i<m;++i)
    {
        lon d,from,to,cost;
        cin>>d>>from>>to>>cost;
        vct.push_back(nd(d,from,to,cost));
    }
    sort(vct.begin(),vct.end(),cmpd);
    //for(lon i=0;i<vct.size();++i)cout<<vct[i].d<<endl;
    for(lon i=1,j=0;i<=1000000;++i)
    {
        a[i]=a[i-1];
        vector<nd> tmp;
        for(;j<vct.size();)
        {
            //cout<<i<<" "<<j<<" "<<vct[j].d<<endl;
            if(vct[j].d==i)
            {
                //if(i==2)cout<<" "<<j<<" "<<tmp.size()<<endl;
                tmp.push_back(vct[j]);++j;
            }else break;
        }
        //if(tmp.size())cout<<i<<" "<<tmp.size()<<endl;
        for(lon k=0;k<tmp.size();++k)
        {
            lon d,from,to,cost;
            d=tmp[k].d,from=tmp[k].from,to=tmp[k].to;
            cost=tmp[k].cost;
            if(from)
            {
                //if(i==3)cout<<"here"<<zvst[d]<<endl;
                if(zvst[from]==0)
                {
                    zvst[from]=1;
                    ++zcnt;
                    zsum+=cost;
                    zmin[from]=cost;
                }
                else
                {
                    if(zmin[from]>cost)
                    {
                        zsum-=zmin[from]-cost;
                        zmin[from]=cost;
                    }
                }
                if(zcnt==n)
                {
                    a[d]=zsum;
                }
            }
        }
    }
    
    for(lon i=1000000,j=vct.size()-1;i>=1;--i)
    {
        b[i]=b[i+1];
        vector<nd> tmp;
        for(;j>=0;)
        {
            //cout<<i<<" "<<j<<" "<<vct[j].d<<endl;
            if(vct[j].d==i)
            {
                //if(i==2)cout<<" "<<j<<" "<<tmp.size()<<endl;
                tmp.push_back(vct[j]);--j;
            }else break;
        }
        //if(tmp.size())cout<<i<<" "<<tmp.size()<<endl;
        for(lon k=0;k<tmp.size();++k)
        {
            lon d,from,to,cost;
            d=tmp[k].d,from=tmp[k].from,to=tmp[k].to;
            cost=tmp[k].cost;
            if(to)
        {
            if(nvst[to]==0)
            {
                nvst[to]=1;
                ++ncnt;
                nsum+=cost;
                nmin[to]=cost;
            }
            else
            {
                if(nmin[to]>cost)
                {
                    nsum-=nmin[to]-cost;
                    nmin[to]=cost;
                }
            }
            if(ncnt==n)
            {
                b[d]=nsum;
            }
        }
        
        }
    }
    
//    for(lon i=1;i<=1000000;++i)
//    {
//        if(!b[i]&&b[i-1])b[i]=b[i-1];
//    }
}

lon work()
{
//    for(lon i=1;i<30;++i)
//    {
//        cout<<a[i]<<" "<<b[i]<<endl;
//    }
    lon res=INF;
    for(lon i=1;i<=1000000;++i)
    {
        lon dst=min(1000002LL,i+k+1);
        //if(a[i]||b[i])if(i<20)cout<<i<<" "<<a[i]<<" "<<b[i+k+1]<<endl;
        if(a[i]!=0&&b[dst]!=0)
        {
            res=min(res,a[i]+b[dst]);
        }
    }
    if(res==INF)return -1;
    else return res;
}

int main()
{
    std::ios::sync_with_stdio(0);
    //freopen("d:\\1.txt","r",stdin); 
    //for(;scanf("%d",&n)!=EOF;)
    {
        init();
        cout<<work()<<endl;
    }
    return 0;
}

 

posted @ 2018-09-29 13:55  degvx  阅读(137)  评论(0)    收藏  举报