字首和優化水站
阿新 • • 發佈:2020-07-16
題目
思路
定義差分陣列記錄為從第i層一直放水到第n層的花費,考慮第k層在某一層i開始放水時,到第k層必須強制放水,因為水從上向下傳遞的時候,肯定是越來越多的,所以一定存在一層i,從第i層開始放水,到第k層必須強制放水,然後c[i]+v[k],c[k+1]-v[k],進行區間修改,因為資料有點大,在查詢i時可以進行二分查詢。
程式碼
#include<bits/stdc++.h> using namespace std; const int maxn=150000+10; int w[maxn],sum[maxn],l[maxn],v[maxn],c[maxn]; int main(){ int n;scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d%d",&w[i],&l[i],&v[i]); sum[i]=sum[i-1]+w[i]; } for(int i=1;i<=n;i++){ int x=lower_bound(sum,sum+1+n,sum[i]-l[i])-sum; x++; c[x]+=v[i]; c[i+1]-=v[i]; } int ans=0x3f3f3f3f; int pos=0; for(int i=1;i<=n;i++){ c[i]=c[i]+c[i-1]; if(c[i]<ans){ ans=c[i]; pos=i; } } printf("%d\n",ans); int tot=0; for(int i=pos;i<n;i++){ tot+=w[i]; if(tot<=l[i]){ printf("%d ",i); } } printf("\n"); }