[題目鏈結]
[演算法]
注意到題目中的限制條件可表述為 : 若選擇區間[l , r] , 則必須選擇區間[l + 1 , r]和[l , r - 1] , 這種依賴關係可以讓我們聯想到用最大權閉合子**題
將每種代號建乙個點 , 每個區間同樣建乙個點
首先將每個形如[i , i]的區間向其代號連邊
然後將每個區間[l , r]所代表的點向[l + 1 , r]和[l , r - 1]連邊
注意我們需要減去代價mx ^ 2 + cx
那麼我們將每個形如[i , i]的區間所代表點的點權減去其代號 , 將每種代號i所代表點的點權減去m * i ^ 2
時間複雜度 : o(dinic(n ^ 2 , n ^ 2))
[**]
#includeusingnamespace
std;
typedef
long
long
ll;typedef
long
double
ld;typedef unsigned
long
long
ull;
const
int n = 110
;const
int inf =2e9;
struct
edge
e[n * n * 10
];int
n , m , cnt , mx , s , t , tot;
int d[n][n] , a[n * 10] , point[n][n] , head[n * n * 10] , dep[n * n * 10
];template
inline void chkmax(t &x,t y)
template
inline void chkmin(t &x,t y)
template
inline void read(t &x)
inline
void addedge(int u , int v , intw);
head[u] =tot;
++tot;
e[tot] = (edge);
head[v] =tot;
}inline
bool
bfs()
}
}
return
false;}
inline
int dinic(int u , int
flow)
}return flow -rest;
}int
main()
cnt =mx;
for (int i = 1; i <= n; ++i)
}s = cnt + 1 , t = s + 1
;
int ans = 0
;
for (int i = 1; i <= n; ++i) d[i][i] -=a[i];
for (int i = 1; i <= mx; ++i) addedge(i , t , m * i *i);
for (int i = 1; i <= n; i++) addedge(point[i][i] , a[i] , inf);
for (int i = 1; i <= n; ++i)
else addedge(point[i][j] , t , -d[i][j]);}}
while
(bfs())
printf(
"%d\n
", ans);
return0;
}
BZOJ4873 Shoi2017 壽司餐廳
bzoj4873 感覺網路流題目做的也不少了。可是拿到了還是不會qa q 一開始把mx 2 cx 的x看成了取的該種壽司的個數。所求答案是獲得的美味度之和減去花費。可以聯想到最大權閉合子圖。然後考慮一下依賴關係。首先可以想到源向每個區間連邊,邊權為di j,這是收益。在考慮花費,每一種壽司向匯連邊,...
六省聯考 2017 壽司餐廳
戳我 簡要題目 乙個序列,可以若干次取其中一段區間,區間及其子集的價值都會被統計進去且每個區間的價值只能被統計一次。如果你拿 c 種 x 數,你需要花費 m x 2 c x 的代價。求最大價值。這道題看起來並沒有思路,看了看題解後發現這是最大權閉合子圖。what?這是神馬?不會,於是去學了一下。然後...
六省聯考2017 壽司餐廳
感覺有難度的一道網路流 自己的網路流水平還是遠遠不夠 一開始以為是費用流搞了半天,發現無法處理只有第一次有效的情況 於是看題解才知道就是個最大權閉合子圖 由於每種東西都只有第一次有效 那麼我們可以考慮把區間作為點建圖 考慮最大權閉合子圖的模型 選擇區間 i,j 的貢獻就一定要選擇區間 i 1,j i...