題意: 打印東西,給出區間(張數)對應費用(到達一定張數就都按某更低的價格),m次詢問,問最優費用。給的時候按張數遞增給的。
dp出當前張數到最後的最小值。對於詢問q,然後二分處》=q的最小的一個張數的價格。min(這個價格*p,dp[這+1])即可。nlogn;後來看網上有些人用線段樹,沒必要的。
ps:開始竟然因為犯中間數據爆int的初級錯誤!,不該不該!
#include#include #include #include using namespace std; struct node { long long si; long long pi; long long pay; }; long long dp[100005]; node v[100008]; int n,m; int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=0;i =0;i--) { dp[i]=min(v[i].pay,dp[i+1]); } int x; while(m--) { scanf("%d",&x); int r=n,l=0,mid; while(l+1 x) { r=mid; } else { l=mid; } } long long ans=v[l].pi*x; if(l+1