日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[ZJOI2010] 贪吃的老鼠(二分+差分+神仙建图网络流)

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [ZJOI2010] 贪吃的老鼠(二分+差分+神仙建图网络流) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

problem

luogu-P2570

solution

臥槽網絡流尼瑪神題

首先這個最小延長時間 TTT ,套路地考慮二分,將問題轉化為判定性問題。

其次 n,mn,mn,m 和奶酪存在時間 [l,r][l,r][l,r] 的量級差很大,我們肯定會猜想一段時間內選擇吃奶酪的老鼠是一樣,套路地考慮離散化。

nnn 個奶酪的出現、消失時間放進時間軸 ti[]ti[]ti[] 中。

有序化,將時間軸割裂成若干段不相交且并集為全集的的小區間,一段時間一段時間地考慮。

像這種貪心貪不動,dppdp\ pdp?p 不動的題目,我們就可以往網絡流上靠了 。

其實是感覺是個網絡流那它多半就是網絡流。

現在就當大家已經想(猜)到這是道網絡流了。

這道題問題就在于如何建立一個和原問題等價的網絡流。

滿足:任一時刻,一只老鼠最多吃一塊奶酪,一塊奶酪最多被一只老鼠吃。

因為網絡流是同時多路徑流,所以我們很難在網絡流上面直觀理解一對一。


本版塊是對建圖的描述。

剛開始,很容易想到。s,ts,ts,t 源匯點,1~n1\sim n1n 的奶酪,源點 sss 分別與這 nnn 塊奶酪連邊,容量為對應奶酪的大小 ppp

然后后面就開始 尼瑪 神起來了。

  • 首先要將老鼠按吃的 速度從大到小 排序,最后面插個速度 000,再 差分 一下,得到新的速度序列 {v}\{v\}{v}

    e.g.:5429→95420→4122\text{e.g.}:5\ 4\ 2\ 9\rightarrow 9\ 5\ 4\ 2\ 0\rightarrow 4\ 1\ 2\ 2e.g.:5?4?2?99?5?4?2?04?1?2?2

    后面建圖部分的第 iii 個老鼠點若未明確指出原老鼠 / 差分老鼠,則均指已經差分后的第 iii 個老鼠點。

差分過后,按劃分的每個時間段重復以下的操作:

假設這個時間段 jjj 的長度為 time=ti[j+1]?ti[j]time=ti[j+1]-ti[j]time=ti[j+1]?ti[j]

  • 枚舉 1~m1\sim m1m 老鼠,給其一個新編號 tot++tot++tot++,與匯點連邊。

    iii 個老鼠連邊容量為 vi?i?timev_i·i·\text{time}vi??i?time

    你肯定會疑惑這個容量太奇怪了。但先別著急。

    看圖:

    vi?i:v_i·i:vi??i: 差分值乘上它的差分數組內的編號。

    我們觀察得到,假設差分數組為 ddd,原數組為 ooo,則有 ∑di?i=∑oi\sum d_i·i=\sum o_idi??i=oi?

    那么乘上 timetimetime 就是這個老鼠點在這個時間段能吃的奶酪限制。

    這個差分相當于將原老鼠切成了若干塊,按相同塊分類合并。

    這個在差分數組內的編號 iii 意思就是有 iii 只原老鼠能劃分出這個 v[i]v[i]v[i] 塊,統稱一只差分老鼠。

  • 枚舉 1~n1\sim n1n 奶酪,對完全在這個時間段出現的奶酪繼續操作:

    與每個老鼠連邊,容量 vi?timev_i·timevi??time

    表示一只老鼠最多在一塊奶酪上付出的努力。

    看圖:

你可以將不同顏色的藍線當作坐標軸的 x,yx,yx,y 基準軸,然后劃分出每個速度老鼠小方格,一個小方格一個小方格地分配。

從上往下從左往右第 (x,y)(x,y)(x,y) 的方格可以理解為該時間段會有第 yyy 只原老鼠吃掉第 xxx 個奶酪的 vy?timev_y·timevy??time 大小的部分。

每個奶酪會分配到某些行中的一個小方格,然后拼湊出來,相當于是吃掉了這個奶酪的一部分。


本板塊是證明此種 奇怪神奇但是對的 網絡流建圖方式不會出現不合法的情況,即不存在某一時刻一只老鼠同時吃多個奶酪 / 一個奶酪同時被多只老鼠吃。

PS:本版塊若未強調差分老鼠,則均指是原老鼠。

  • 先證明不存在一只老鼠同時吃多個奶酪的情況。

    假設排序后第 kkk 只老鼠在該時間段吃了 xxx 塊奶酪,第 iii 塊奶酪吃了時間 tit_iti?

    如果 (∑ti)>time(\sum t_i)> time(ti?)>time,則表示存在一只老鼠同時吃多個奶酪(不合法)。

    首先第 kkk 個差分老鼠至少產生的流量都是 (∑ti)?vk(\sum t_i)·v_k(ti?)?vk?,而容量為 vk?k?timev_k·k·timevk??k?time

    此時有兩種情況:

    • 有速度更快的老鼠能夠幫吃超額部分(引起老鼠必須同時吃奶酪的部分),那么就可以分擔。

      就不會存在 (∑ti)>time(\sum t_i)>time(ti?)>time。(也就是說看似不合法的流法可以通過調整變成合法流法)

    • 不能幫吃完所有超額部分。那么這些更快的老鼠肯定是吃過了,也就是它們在這個時間段每時每刻都在吃。

      在差分上會體現成前 k?1k-1k?1 個差分老鼠對 kkk 差分老鼠造成流量負擔,加上原本流量,(∑ti)?vk+(k?1)?vk?time=k?vk?time+vk?((∑ti′)?time)>k?vk?time(\sum t_i)·v_k+(k-1)·v_k·time=k·v_k·time+v_k·\big((\sum t_i')-time\big)>k·v_k·time(ti?)?vk?+(k?1)?vk??time=k?vk??time+vk??((ti?)?time)>k?vk??time,即流量大于容量,顯然不可能,所以在網絡流圖上不可能跑成這樣。(如果調整不了那么一開始就不可能跑成這種情況)

  • 再證明不存在一個 iii 奶酪同時被多只老鼠吃的情況。

    假設有 xxx 只老鼠吃了該奶酪,吃了時間 tit_iti?

    如果 (∑ti)>tim(\sum t_i)>tim(ti?)>tim 則表示存在一個奶酪同時被多只老鼠吃。

    由于排名靠前的老鼠會對排名靠后的老鼠造成影響。即吃了同一個奶酪的 排名最后面的 老鼠流量為 (∑ti)?vk>ti?vk(\sum t_i)·v_k>t_i·v_k(ti?)?vk?>ti??vk?(奶酪向每個差分老鼠的連邊容量)。

    也不存在跑出這種情況的可能。


在建圖板塊,是從差分到原來;而在證明板塊,是從原來到差分。可多思考一下。

因為這個建圖是差分后的建圖,所以如果要輸出方案(即還原每只老鼠吃的時間)很有可能遇到差分還原后某只老鼠的時間是負數。
還原方法就是第一只差分老鼠的流量 /v/v/v 就是時間,然后把編號比它大的所有差分老鼠減去這個老鼠造成的流量貢獻,以此類推。
網絡流的流法很多種,我們只是知道最后流滿沒有。所以有可能某種流法看上去是不對的,但是它一定可以被調整成一種合法流法(優先滿足編號小的差分老鼠)。
所以考察輸出方案的話就顯得不可做了。

code

#include <bits/stdc++.h> using namespace std; #define int long long #define maxn 100000 #define maxm 500000 #define eps 1e-6 #define inf 1e9int s, t, cnt, T, n, m; int head[maxn], cur[maxn], dep[maxn]; struct edge { int to, nxt; double flow; }E[maxm]; namespace NetworkFlow {queue < int > q;void init() { s = 0, t = n * m * 2 + 1, cnt = -1, memset( head, -1, sizeof( head ) ); }void addedge( int u, int v, double w ) {E[++ cnt] = { v, head[u], w }, head[u] = cnt;E[++ cnt] = { u, head[v], 0 }, head[v] = cnt;}bool bfs() {memset( dep, 0, sizeof( dep ) );memcpy( cur, head, sizeof( head ) );dep[s] = 1; q.push( s );while( ! q.empty() ) {int u = q.front(); q.pop();for( int i = head[u];~ i;i = E[i].nxt ) {int v = E[i].to;if( ! dep[v] and E[i].flow > eps ) {dep[v] = dep[u] + 1;q.push( v );}}}return dep[t];}double dfs( int u, double cap ) {if( u == t or cap < eps ) return cap;double flow = 0;for( int i = cur[u];~ i;i = E[i].nxt ) {int v = E[i].to; cur[u] = i;if( dep[v] == dep[u] + 1 ) {double w = dfs( v, min( cap, E[i].flow ) );if( w < eps ) continue;E[i ^ 1].flow += w;E[i].flow -= w;flow += w;cap -= w;if( cap < eps ) break;}}return flow;}double dinic() {double ans = 0;while( bfs() ) ans += dfs( s, inf );return ans;} }struct node { double p, l, r; }c[maxn]; double v[maxn], ti[maxn]; double sum; bool check( double delta ) {NetworkFlow :: init();for( int i = 1;i <= n;i ++ ) {NetworkFlow :: addedge( s, i, c[i].p );ti[i] = c[i].l, ti[i + n] = c[i].r + delta;}sort( ti + 1, ti + (n << 1 | 1) );int tot = n;for( int i = 1;i <= m;i ++ )for( int j = 1;j < (n << 1);j ++ ) {if( ti[j + 1] - ti[j] < eps ) continue;tot ++, NetworkFlow :: addedge( tot, t, ( ti[j + 1] - ti[j] ) * v[i] * i );for( int k = 1;k <= n;k ++ )if( c[k].l <= ti[j] and ti[j + 1] <= delta + c[k].r )NetworkFlow :: addedge( k, tot, ( ti[j + 1] - ti[j] ) * v[i] );}return sum - NetworkFlow :: dinic() < eps; }signed main() { scanf( "%lld", &T );while( T -- ) {scanf( "%lld %lld", &n, &m );for( int i = 1;i <= n;i ++ ) scanf( "%lf %lf %lf", &c[i].p, &c[i].l, &c[i].r );sum = 0; for( int i = 1;i <= n;i ++ ) sum += c[i].p;for( int i = 1;i <= m;i ++ ) scanf( "%lf", &v[i] );sort( v + 1, v + m + 1, []( int x, int y ) { return x > y; } ); for( int i = 1;i < m;i ++ ) v[i] = v[i] - v[i + 1];double l = 0, r = 5e7, ans;while( l + eps < r ) {double mid = ( l + r ) / 2;if( check( mid ) ) ans = mid, r = mid;else l = mid;}printf( "%.4f\n", ans );}return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的[ZJOI2010] 贪吃的老鼠(二分+差分+神仙建图网络流)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av日韩中文字幕 | 日韩精品无码一区二区 | 国产精品久久久影院 | 免费av一级片 | 日韩avxxx | 国产日韩视频在线 | 亚洲国产精品久久久久婷婷老年 | 国v精品久久久网 | 欧美性受视频 | 另类ts人妖一区二区三区 | 天美乌鸦星空mv | 亚洲天堂手机在线观看 | 中文字幕一区久久 | 午夜a区 | 国产内射老熟女aaaa∵ | 国产精品一亚洲av日韩av欧 | 国产精品女人久久久 | 日韩精品一区二区三区不卡 | 天堂视频一区 | 一区二区欧美视频 | 一级黄色录象 | 欧美成人aaaaⅴ片在线看 | 人人妻人人澡人人爽精品欧美一区 | 欧美人与物videos另类 | mm131亚洲精品| 欧美成人三级精品 | 午夜免费福利在线观看 | 波多野结衣中文字幕在线 | 亚洲av无码成人精品区 | 欧美黑人疯狂性受xxxxx野外 | 成年人激情网 | 国产精品第一区 | 国产人妻777人伦精品hd | 国产女同在线观看 | 亚洲无码乱码精品国产 | 成 年人 黄 色 片 | 香蕉久久夜色精品 | 级毛片| 日韩av免费一区 | 波多野结衣影院 | 高清成人免费视频 | 日本一本视频 | 欧美一二| aaaaaav| 在线免费av网站 | 69热在线 | 国产探花精品在线 | 天天夜夜操| 日本wwwwww | 欧美成人视屏 | 内射国产内射夫妻免费频道 | 日韩 中文字幕 | 一级特黄a大片免费 | 三级爱爱| 亚洲一区二区黄片 | 欧美一区二区三区四区在线观看 | 青娱乐av | 成人高清视频在线观看 | 超碰超碰超碰超碰超碰 | 久久久久女教师免费一区 | 日本91av| 欧美爱爱网址 | 国产成人精品二区三区亚瑟 | 成年人av网站 | 欧美大片xxxx | 有码一区二区三区 | 久久久久久久久久一区二区 | 少妇一级片| 偷自拍| 久久99草| 在线观看国产三级 | 欧美黄色片 | 人妻少妇精品视频一区二区三区 | 人妻妺妺窝人体色www聚色窝 | 中文字幕不卡在线播放 | 777奇米四色 | 爱爱爱爱网站 | 国产精品一级片在线观看 | 浪漫樱花动漫在线观看免费 | 国产小视频在线看 | 国产精品无码免费在线观看 | 99er精品视频 | 九一福利视频 | 中文字幕丰满孑伦无码专区 | 欧美在线资源 | 亚洲一区二区观看播放 | 国产精品成人久久久 | 国产不卡视频在线播放 | 国产裸体舞一区二区三区 | 亚洲综合小说网 | 伊人成长网 | 国产精品亚洲αv天堂无码 伊人性视频 | 国产伦精品一区二区三区四区 | 女同动漫免费观看高清完整版在线观看 | 日韩伊人久久 | 亚洲一区二区三区高清在线 | 亚洲一区二区久久 | 黄色av免费观看 | 午夜美女网站 |