bzoj 2122 工作評估

2021-08-03 12:25:45 字數 2373 閱讀 8181

這是一道好題~~~~~

然後發現不會做,去問人,然後在別人想的時候頹廢發現自己還是不會做

於是就膜題解啊,發現只有一篇。。。就是這個 點這裡

於是就膜啊膜,終於大概有可能會了,為了造福後面的人(騙訪問量),我決定要寫一篇題解

首先,n^2的暴力是可以過的,大概我這個40s+就過了。。主要是資料太水了

但要是你不想就這麼水過這題題,請忽視這個做法並往下看

#include#includeconst int n=50005;

int n,m;

int d[n],l[n];

int mymin (int x,int y)

int main()

printf("%d\n",ans);

}return 0;

}

比較好的解法是分塊

記f(i,j,x0)表示以初始代價x0依次經過第i天到第j天後的價值。

記g(i,j)為f(i,j,inf),其中inf是正無窮,s(i,j)為i到j的d值之和。則有f(i,j,x0)=min( g(i,j), x0+s(i,j) )。

這個第二條性質十分地重要,需要好好理解一下

其實也很簡單,就是說假如你現在給定了乙個區間l,r還有x0,接著你想啊

要是在從l到r這一段路徑中,被卡住了,也就是說中間有至少乙個值被l所限制了,那麼你這個x0其實是沒有用的,就算你是inf還是x0,答案都不會變,也就是g(i,j)

要是不會呢,那麼答案就是簡單的x0+s(i,j)

稍微想一想都知道,如果被卡了,前者肯定是小於後者的,所以取min值就可以很好地解決這個問題

於是,對於每乙個塊,我們把所有他的子串都拿出來,並維護這兩個值

接著我們知道,如果對於詢問的l,r,如果兩個子串都被包含在[l,r]中,且有g1>=g2且s1>=s2,顯然第二個子串是一定不會取到的

所以我們可以先對每乙個塊的g和s排序,將沒用的踢掉,我們就可以得到乙個g單調上公升,s單調下降的東西

到時候找答案的時候這個是理所當然可以二分的

那麼問題就剩下如何維護塊一塊之間的聯絡了

我們可以維護多兩個東西,乙個是字首的這個東西,乙個是字尾的這個東西

然後大概按照類似線段樹中左右兒子維護子串最大之類的合併方法來合併就好了,注意細節

**:#include#include#include#include#include#includeusing namespace std;

const int n=50005;

const int m=250;

int n,m;

int d[n],t[n],sd[n];

int cnt,l[n],r[n],belong[n];

typedef pairo;

int mymin (int x,int y)

void prepare()

} cnt=belong[n];r[cnt]=n;

/*for (int u=1;u<=n;u++) printf("%d ",belong[u]);

for (int u=1;u<=cnt;u++) printf("%d %d\n",l[u],r[u]);*/

}int f[m][m][m],tcnt;

o tt[n];

vectorvec[m],pre[m],suf[m];

int stack[n];

int s (int x,int y)

int g (int x,int y)

void calc (vector&vec)

for (int u=1;u<=pnt;u++)

vec.push_back(tt[stack[u]]);

}void update (int x)

tcnt=0;

for (int u=l[x];u<=r[x];u++)

for (int i=u;i<=r[x];i++)

tt[++tcnt]=o(s(u,i),g(u,i));

calc(vec[x]);

tcnt=0;

for (int u=l[x];u<=r[x];u++)

tt[++tcnt]=o(s(l[x],u),g(l[x],u));

calc(pre[x]);

tcnt=0;

for (int u=l[x];u<=r[x];u++)

tt[++tcnt]=o(s(u,r[x]),g(u,r[x]));

calc(suf[x]);

return ;

}void init ()

int lalal (vectorvec,int x0)

int ret=mymin(vec[l].first,vec[l].second+x0);

if (l+1

如何評估專案工作量

乙個工程需要的早期評估有三項 工作量 持續時間 預算。在這三項中,工作量必須首先評估。當了解工程所需的工作量,你就可以分配決定工程持續時間的資源,進而可以評估人力資源和非人力資源花費。用下面的過程來評估你的工程所需總工作量 1 決定評估所需的精確度。典型的情況是,評估的精確度越高,所需的細節就越多,...

工作量評估常用方法

目錄 運用專家判斷 自下而上進行彙總 模擬估算 三點估算 通常由團隊資深se或者技術負責人,根據經驗來做個粗略估計,通常情況下此方法估算可能偏差較大,但是量級一般比較準確。工作分解之後,工作包落到具體的實施人員,由工作直接承擔著進行工作量估算,然後向上彙總,最後彙總出乙個專案的整體工作量。此方法通常...

速達3000工作量評估

1.基於功能點評估 速達3000軟體具有如下的功能 1 採購管理 包括採購訂貨管理 採購收貨管理 採購退貨管理 暫估入庫管理 地區資料管理 商資料管理 貨品類別管理 貨品資料管理 收付款方式管理。2 銷售管理 包括銷售訂單管理 銷售發貨管理 信用額度管理 銷售退貨管理 委託代銷貨品 委託代銷結算 委...