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; }
浙公网安备 33010602011771号