戳我
簡要題目:這道題看起來並沒有思路,看了看題解後發現這是最大權閉合子圖。\(what?\)這是神馬?不會,於是去學了一下。乙個序列,可以若干次取其中一段區間,區間及其子集的價值都會被統計進去且每個區間的價值只能被統計一次。
如果你拿\(c\)種\(x\)數,你需要花費\(m*x^2+c*x\)的代價。
求最大價值。
然後發現這道題就是最大權閉合子圖;
首先處理區間:
將區間看成點,看看這個區間的權值是否為正,為正用\(s\)和這個區間相連,流量為權值。反之用這個區間和\(t\)相連流量為權值的字首和。因為對於乙個區間他還必須要包括子區間,所以我們在把這個區間\([i,j]\)和\([i,j-1],[i+1,j]\)相連。流量為\(inf\)
再來看看壽司
對於\(m*x^2+c*x\)我們將他拆分。變成\(m*x^2\)和\(c*x\)
對於\(m*x^2\)我們會發現他和數量沒冠希,於是我們可以將他和\(t\)相連流量為\(m*x^2\)
在將\([i,i]\)這個點和這個壽司相連,流量為\(inf\)再將這個點和\(t\)相連流量為\(x\)
#include#define inf 1e9
using namespace std;
typedef long long ll;
int read()
struct nodea[200001];
int head[100001],cnt,n,m,s,t,x,y,z,dep[100001],ans,cur[100001];
void add(int x,int y,int c)
queueq;
int bfs()
}if(dep[t]!=0)
return 1;
else
return 0;
}int dfs(int k,int list)}}
return 0;
}int dinic()
return ans;
}int vis[1001][1001],bj[1001],f[1001][1001];
int main()
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
printf("%d\n",ans-dinic());
}
六省聯考2017 壽司餐廳
感覺有難度的一道網路流 自己的網路流水平還是遠遠不夠 一開始以為是費用流搞了半天,發現無法處理只有第一次有效的情況 於是看題解才知道就是個最大權閉合子圖 由於每種東西都只有第一次有效 那麼我們可以考慮把區間作為點建圖 考慮最大權閉合子圖的模型 選擇區間 i,j 的貢獻就一定要選擇區間 i 1,j i...
六省聯考 壽司餐廳
太長了,不描述!看題面看了10min才反應過來這是個最大權值閉合子圖的問題 應用網路流最小割的模型來解決本問題 首先,每個壽司編號即為器材,代價為 w i w i m 那麼我們由每個壽司編號向匯點鏈結一條容量為w i w i m 每個壽司一定需要乙個壽司編號,代價為 w i 那麼我們由壽司向壽司編號...
P3749 六省聯考2017 壽司餐廳
首先因為每個值只會被算一次且值的個數為 n 2 級別的,因此我們可以對每個 d 開乙個點,之後就可以用最大權閉合子圖做。考慮題目的限制 1.選擇乙個區間 l,r 會將 sum limits sum limits rd 選上 我們顯然不能全部連上,這是 n 4 級別的,我們可以只從 d 向 d 和 d...