hdu 4122 單調佇列或線段樹

2021-07-13 07:58:01 字數 2404 閱讀 6840

/**

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 的區間的元素最大值與最小值。構建乙個空佇列。以求最小值為例,從左往右掃瞄一遍陣列。如果隊首元素所在位置超過了區間範圍,則將其彈出。每當掃瞄到乙個元素時,將佇列末尾大於其的一部分捨棄,並將其放置在佇列尾。由此得到的佇列是單調遞增的,並且隊首元素是...