題解 CF1148E 【Earth Wind and Fire】
阿新 • • 發佈:2020-08-24
\[\huge\mathcal{Description} \]
日期 | 2020年8月24日 |
---|---|
編號 | \(\texttt{CF1148E}\) |
演算法 | 排序、棧、佇列 |
來源 | 無名小題 |
\[\huge\mathcal{Solution} \]
\[\huge\mathcal{Code} \]
#include<bits/stdc++.h> #define MAX 300001 using namespace std; struct Struct { int Position; int Id; inline bool operator < (const Struct &Compare)const { return Position<Compare.Position; } }; struct Ans { int PointA; int PointB; int Dist; }; int TotalPoint; Struct Start[MAX]; Struct End[MAX]; int Dist[MAX]; int main(void) { register int i; cin>>TotalPoint; for(i=1;i<=TotalPoint;i++) { cin>>Start[i].Position; Start[i].Id=i; } for(i=1;i<=TotalPoint;i++) { cin>>End[i].Position; End[i].Id=i; } sort(Start+1,Start+TotalPoint+1); sort(End+1,End+TotalPoint+1); for(i=1;i<=TotalPoint;i++) { Dist[i]=End[i].Position-Start[i].Position; } register long long Sum; Sum=0; for(i=1;i<=TotalPoint;i++) { Sum+=Dist[i]; if(Sum<0) { cout<<"NO"<<endl; return 0; } } if(Sum!=0) { cout<<"NO"<<endl; return 0; } register stack< int >Stack; register queue< Ans >Queue; for(i=1;i<=TotalPoint;i++) { if(!Dist[i]) { continue; } if(Dist[i]>0) { Stack.push(i); } if(Dist[i]<0) { while(!Stack.empty()) { register int Delta; register int j; j=Stack.top(); Delta=min(Start[i].Position-End[i].Position,End[j].Position-Start[j].Position); Start[i].Position-=Delta; Start[j].Position+=Delta; Queue.push(Ans{Start[j].Id,Start[i].Id,Delta}); if(Start[i].Position==End[i].Position) { break; } Stack.pop(); } } } cout<<"YES"<<endl; cout<<Queue.size()<<endl; while(!Queue.empty()) { cout<<Queue.front().PointA<<' '<<Queue.front().PointB<<' '<<Queue.front().Dist<<endl; Queue.pop(); } return 0; }