你養了乙隻貓,為了讓它快樂地成長,你需要合理地安排它每天的作息時間。假設一天分為$ n \(個時刻,貓在每個時刻要麼是吃東西,要麼是睡覺。在第\) i $個時刻,假如貓是去吃東西,那麼它能獲得愉悅值 \(ei\),假如是去睡覺,那麼能獲得的愉悅值為 \(si\)。
貓要成長,不僅僅需要快樂,還需要健康的作息。經過研究,對於每乙個連續的長度為 k 的作息區間,即所有的時刻區間$ [i,i+k−1],1≤i≤n−k+1$,貓都要至少有 \(ms\)的時刻用來睡覺,$me $的時刻用來吃東西,這樣貓才能健康成長。
現在你想合理地安排一天中的這 n個時刻,使得貓在能健康成長的前提下,獲得盡量多的愉悅值。
第一行四個整數 \(n,k,ms,me\)。
第二行包含\(n\)個整數,代表\(si\)。
第三行包含\(n\)個整數,代表\(ei\)。
第一行乙個整數,代表貓能獲得的愉悅值。
第二行 n 個字元,可以為 s 或 e,代表貓在某個時刻是在睡覺(s)還是在吃東西(e)。
5 4 2 2
4 8 6 2 2
4 6 9 6 0
29ssees
參考部落格
我們先全部吃。
\(y_i\)和\(z_i\)是我們設出來的輔助變數,使得\(\leq ,\ge\)變成了\(=\)。
\[\beginx_1+x_2+...+x_k=t_1+y_1\\ x_1+x_2+...+x_k=k-t_2-z_1\\ x_2+x_3+...+x_=t_1+y_2\\
x_2+x_3+...+x_=k-t_2-z_2\\
...\\
x_+x_+...+x_n=t_1+y_\\
x_+x_+...+x_n=k-t_2-z_
\end
\]我們保留第\(1\)個和最後乙個方程,其他的方程與前乙個做差分,得到:
\[\begin
x_1+x_2+...+x_k=t_1+y_1\\
k-t_2=x_+x_+...+x_n+z_\\
y_i+z_i=k-t_1-t_2(1\leq i\leq n-k+1)\\
x_+k-t_1-t_2=x_i+z_i+y_(1\leq i\leq n-k)\\
\end
\]我們整理一下,使得每個未知量恰好在左邊出現一次,恰好在右邊出現一次。
我們拿方程作為節點,假設方程左邊的常數為\(lc\),右邊的常數為\(rc\),我們連\((s,i,lc,0),(i,t,rc,0)\)。(最後一維表示費用)。
然後對於未知量\(x_i\),假設它出現在\(a\)的左邊,\(b\)的右邊,我們連\((b,a,1,s_i-e_i)\)。
跑最大費用最大流。
我開始時犯了常識錯誤,即使最長路為負也要加上貢獻,因為我們要先保證最大流。
**:
#include#define ll long long
#define n 4005
using namespace std;
inline int get() while('0'<=ch&&ch<='9') return x*f;}
int n,k,t1,t2;
ll s[n],e[n],w[n];
int ss,tt;
struct road s[n<<3];
int h[n],cnt=1;
void add(int i,int j,int f,int c) ;h[i]=cnt;
s[++cnt]=(road) ;h[j]=cnt;
}ll ans;
queueq;
bool in[n];
ll dis[n];
int fr[n],e[n];
bool spfa(int s,int t)
for(int i=1;i<=n-k;i++)
add(1,3,1e9,0);
for(int i=1;i<=n-k;i++) add(i+n-k+3,i+3,1e9,0);
for(int i=1;i<=n-k;i++) add(i+n-k+3,i+2,1e9,0);
add(2,n-k+3,1e9,0);
while(spfa(ss,tt));
cout
return 0;
}
2017 山東二輪集訓 Day7 國王
給定一棵樹,每個點有黑白兩種顏色,定義一條簡單路徑合法當且僅當路徑上所有點黑色與白色數量相等,求有多少非空區間 l,r 使得所有編號 in l,r 的點形成的本質不同的合法簡單路徑數多於所有編號 notin l,r 的點形成的本質不同的合法路徑樹。考慮所有以 x 為乙個端點的合法簡單路徑數量為 f ...
2017 山東一輪集訓 Day7 逆序對
題解 滿滿的套路題。首先顯然從大到小列舉 然後每次生成的逆序對是1 i 1 的 這樣做dp是nk的 複雜度太高了 那我們轉化一下問題 變成sigma ai ai 據說是個經典問題。感覺非常奇妙 先容斥一下,也就是說 總的 至少1個條件不滿足 至少2個條件不滿足 那考慮一下如何算有x個條件不滿足 不滿...
2017暑假七林集訓day7 花翻
早上學長講課。首先講的是位運算。位運算是乙個奧妙重重的東西,比任何邏輯運算子都快上許多倍,可以用做常數優化的利器。它有許多神奇的應用,比如可以把列舉子集寫的這樣飄逸 for int x n x x x 1 n 另外呢他還有類似 builtin popcount 這種奧妙重重的底層函式。接下來講的是搜...