/**
hdu 4122 單調佇列
題目大意:給定n個時刻,在每乙個時刻都要生產ai個月餅。給出m個可以生產的時刻,每個時刻單個生產費用為bi,單個月餅可儲存t時間,單位時間費用為s
問如何安排生產花費最少
解題思路:用單調佇列維護乙個點之前所有點的最小花費(為生產費+儲存費)
特別注意:n個時刻可能有重複的
*/#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
mapint>mp;
int n,m,time[3050],sum[15],s,t,cost[100050],q[100050];
ll num[3000];
void init()
int get(int
y,int
m,int d,int t)
if((y
%4==0&&y
%100!=0)||y
%400==0)
else
ans+=(d-1);
return ans*24+t;
}int main()
scanf("%d
%d",&t,&s);
int tail=0,head=0,k=0;
ll cnt=0;
for(int i=0; i}
printf("%i64d\n",cnt);
}return0;}
/**2
10jan 1
2000210
jan 1
2000910
522020
2010108
79510
00*/
思路分析:
ans = segma( num*(cost + (i-j)*s) )
整理一下會發現式子就是
cost-j*s + i*s
對於每乙個訂單,我們把i拿出來分析
所以也就用cost - j*s 建樹。
然後在儲存期間找到最小的花費就行了。
#include
#include
#include
#include
#include
#define lson num<<1,s,mid
#define rson num<<1|1,mid+1,e
#define maxn 2555
#define maxm 100005
#define inf 0x3f3f3f3f
using
namespace
std;
typedef
long
long ll;
int n,m;
int days[2][13]=,
};string tab = ;
ll tre[maxm<<2];
int getmonth(string x)
bool leap(int x)
ll gethour(int month,int day,int year,int hour)
void build(int num,int s,int e)
void update(int num,int s,int e,int pos,ll val)
int mid=(s+e)>>1;
if(pos<=mid)update(lson,pos,val);
else update(rson,pos,val);
tre[num]=min(tre[num<<1],tre[num<<1|1]);
}ll query(int num,int s,int e,int l,int r)
int mid=(s+e)>>1;
if(r<=mid)return query(lson,l,r);
else
if(l>mid)return query(rson,l,r);
else
return min(query(lson,l,mid),query(rson,mid+1,r));
}string tmp;
ll num[maxn];
ll cost[maxm];
ll time[maxm];
int main()
ll s,t;
build(1,1,m);
cin>>t>>s;
for(int i=1;i<=m;i++)
ll ans=0;
for(int i=1;i<=n;i++)
cout
0;}
HDU 4122 單調佇列
給定n個訂單,在相應時刻都要生產num i 個月餅,給出m個可以生產的時刻和這個時刻生產單個產品的費用cost i 每個月餅可以儲存t個小時的保質期,但是儲存月餅也是要花錢的,每小時儲存需要花費s,求出最小花費。一定要讀清楚題意。其實對於每個訂單都有乙個確定的生產時刻 最優的情況下 並且只有乙個,我...
BZOJ 1012 線段樹 單調佇列
非常裸的線段樹 單調佇列 假設乙個節點在佇列中既沒有時間優勢 早點入隊 也沒有值優勢 值更大 那麼顯然不管在如何的情況下都不會被選為最大值。既然它僅僅在末尾選。那麼自然能夠滿足以上的條件。線段樹 include stdio.h include string.h struct node data 80...
單調佇列與線段樹與樹狀陣列
更新中 線段樹給定乙個陣列,依次求所有長度為 m mm 的區間的元素最大值與最小值。構建乙個空佇列。以求最小值為例,從左往右掃瞄一遍陣列。如果隊首元素所在位置超過了區間範圍,則將其彈出。每當掃瞄到乙個元素時,將佇列末尾大於其的一部分捨棄,並將其放置在佇列尾。由此得到的佇列是單調遞增的,並且隊首元素是...