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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

AtCoder AGC031E Snuke the Phantom Thief (费用流)

發布時間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AtCoder AGC031E Snuke the Phantom Thief (费用流) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接

https://atcoder.jp/contests/agc031/tasks/agc031_e

題解

做法一(我的做法)

這是我yy出來的一個上下界費用流做法,自己沒找到什么反例,能過。(一開始一直WA以為做法假了結果發現寫錯了一個sb地方摔)如果有什么問題敬請指出,謝謝。
考慮一維怎么做,首先可以枚舉一共選多少個,那么對每個位置的限制就相當于“前\(i\)個里選的個數在\([L_i,R_i]\)之間”。
我們可以給每個位置建一個點,源點往\(1\)號位置的點連\(([0,+\infty],0)\), \(i\)\((i+1)\)\(([L_i,R_i],0)\), \(i\)往匯點連\(([0,1],w_i)\), 跑最大費用最大流即可。
然后拓展到二維:我們給每一行每一列分別建一個點,記作\(R_i,C_j\). 對每個物品\(u\), 從\(R_{x_u}\)\(C_{y_u}\)\(([0,1],w_u)\). 設限制形如“從第\(i\)行到最后一行選的個數在\([LX_i,RX_i]\)之間”、“前\(j\)列選的個數在\([LY_j,RY_j]\)之間”,則從\(R_{i-1}\)\(R_i\)\(([LX_i,RX_i],0)\) (特別地,\(i=0\)時起點為源點),從\(C_j\)\(C_{j+1}\)\(([LY_j,RY_j],0)\) (特別地,\(j=MX\)時終點為匯點,\(MX\)為最大坐標),跑最大費用流就可以了。
這里上下界網絡流因為最大流已知,我采用的是把每條邊的下界費用設為無窮大的寫法,需要使用__int128. 有其他的寫法但是博主太菜了不會……
時間復雜度\(O(n\cdot MFMC(2n,5n))\). (一共要建\(3n\)條邊,其中至多\(2n\)條帶上下界)

做法二(官方題解)

在路上了。

代碼

做法一

#include<bits/stdc++.h> #define llong long long #define mkpr make_pair #define pii pair<int,int> #define riterator reverse_iterator using namespace std;inline int read() {int x = 0,f = 1; char ch = getchar();for(;!isdigit(ch);ch=getchar()) {if(ch=='-') f = -1;}for(; isdigit(ch);ch=getchar()) {x = x*10+ch-48;}return x*f; }namespace NetFlow {const int N = 206;const int M = 284;#define lllong __int128const lllong INF = 2e17;const lllong INF2 = 1e22;struct AEdge{int u,v,wl,wr; lllong c;} ae[M+3];struct Edge{int u,v,nxt,w; lllong c;} e[(M<<2)+3];int fe[N+3];lllong dis[N+3];int que[N+5];bool inq[N+3];int lst[N+3];int n,m,en,s,t; lllong mf,mc;void init(){memset(ae,0,sizeof(ae)); memset(e,0,sizeof(e)); memset(fe,0,sizeof(fe)); memset(dis,0,sizeof(dis)); memset(que,0,sizeof(que)); memset(inq,0,sizeof(inq)); memset(lst,0,sizeof(lst));n = m = s = t = 0; mf = mc = (lllong)0;}void addedge0(int u,int v,int w,lllong c){en++; e[en].u = u,e[en].v = v,e[en].w = w,e[en].c = c;e[en].nxt = fe[u]; fe[u] = en;en++; e[en].u = v,e[en].v = u,e[en].w = 0,e[en].c = -c;e[en].nxt = fe[v]; fe[v] = en;}bool spfa(){for(int i=1; i<=n; i++) dis[i] = -INF2;int hd = 1,tl = 2; que[1] = s; dis[1] = 0;while(hd!=tl){int u = que[hd]; hd++; if(hd>n+1) hd-=n+1;for(int i=fe[u]; i; i=e[i].nxt){int v = e[i].v;if(e[i].w>0&&dis[e[i].v]<dis[u]+e[i].c){dis[e[i].v] = dis[u]+e[i].c; lst[e[i].v] = i;if(!inq[e[i].v]){inq[e[i].v] = true;que[tl] = e[i].v; tl++; if(tl>n+1) tl-=n+1;}}}inq[u] = false;}return dis[t]!=-INF2;}void calcflow(){int flow = 1e5;for(int u=t; u!=s; u=e[lst[u]].u){flow = min(flow,e[lst[u]].w);}for(int u=t; u!=s; u=e[lst[u]].u){e[lst[u]].w -= flow; e[lst[u]^1].w += flow;}mf += flow; mc += dis[t]*(lllong)flow;}void mfmc(){mf = mc = 0; while(spfa()) {calcflow();}}void addedge(int u,int v,int wl,int wr,llong c){m++; ae[m].u = u,ae[m].v = v,ae[m].wl = wl,ae[m].wr = wr,ae[m].c = c;}llong flow(int _n,int _s,int _t,int _mf){n = _n,s = _s,t = _t; en = 1; lllong ret = 0ll;for(int i=1; i<=m; i++){if(ae[i].wl) {addedge0(ae[i].u,ae[i].v,ae[i].wl,INF); ret += (ae[i].c-INF)*(lllong)ae[i].wl;}addedge0(ae[i].u,ae[i].v,ae[i].wr-ae[i].wl,ae[i].c);}mfmc();if(mf!=_mf||mc+ret<(lllong)0) {return -1ll;}return mc+ret;} }const int N = 100; struct Element {int x,y; llong w; } a[N+3]; struct Condition {int typ,x,y; } b[N*4+3]; int alx[N+3],aly[N+3],arx[N+3],ary[N+3]; int n,m,mx; llong ans;int main() {scanf("%d",&n);for(int i=1; i<=n; i++){scanf("%d%d%lld",&a[i].x,&a[i].y,&a[i].w); mx = max(mx,max(a[i].x,a[i].y));}scanf("%d",&m);for(int i=1; i<=m; i++){char str[5]; scanf("%s%d%d",str,&b[i].x,&b[i].y); mx = max(mx,b[i].x);b[i].typ = (str[0]=='L'?0:(str[0]=='R'?1:(str[0]=='D'?2:3)));}mx++;for(int k=1; k<=n; k++){for(int i=0; i<=mx; i++) alx[i] = 0,arx[i] = k,aly[i] = 0,ary[i] = k;for(int i=1; i<=m; i++){if(b[i].typ==0){alx[b[i].x+1] = max(alx[b[i].x+1],k-b[i].y);}else if(b[i].typ==1){arx[b[i].x] = min(arx[b[i].x],b[i].y);}else if(b[i].typ==2){ary[b[i].x] = min(ary[b[i].x],b[i].y);}else if(b[i].typ==3){aly[b[i].x-1] = max(aly[b[i].x-1],k-b[i].y);}}bool ok = true;for(int i=0; i<=mx; i++) {if(alx[i]>arx[i]||aly[i]>ary[i]) {ok = false; break;}}if(!ok) continue;NetFlow::init();for(int i=0; i<=mx; i++){NetFlow::addedge(i==0?1:i+2,i+3,alx[i],arx[i],0ll);}for(int i=0; i<=mx; i++){NetFlow::addedge(i+mx+4,i==mx?2:i+mx+5,aly[i],ary[i],0ll);}for(int i=1; i<=n; i++){NetFlow::addedge(a[i].x+3,a[i].y+mx+4,0,1,a[i].w);}llong cur = NetFlow::flow(mx+mx+4,1,2,k);ans = max(ans,cur);}printf("%lld\n",ans);return 0; }

總結

以上是生活随笔為你收集整理的AtCoder AGC031E Snuke the Phantom Thief (费用流)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产日韩欧美一区二区东京热 | 亚洲一区二区三区 | 亚洲av无码久久忘忧草 | jav中文字幕| 天堂成人av| 亚洲精品一二三 | 日韩成人在线观看视频 | 91无打码| 欧洲日韩一区二区三区 | 中文字幕激情 | 久久九九精品 | 91在线无精精品入口 | 精品久久视频 | r级无码视频在线观看 | 久久精品99| 成都免费高清电影 | 国产精品一区二区三区四区 | 国精产品乱码一区一区三区四区 | 天天久| 亚洲欧美在线免费观看 | 337p粉嫩大胆色噜噜噜 | 久久成年| 成年人看的黄色片 | 99re这里只有精品在线 | 国产成人 综合 亚洲 | 日韩高清一区二区 | 99re热视频| 日本888xxxx| 高清不卡一区 | 亚洲永久精品一区 | 久久久久久婷婷 | 自拍偷拍福利视频 | 久久精品色欲国产AV一区二区 | 青青青在线视频 | 情侣av| 原来神马电影免费高清完整版动漫 | 久久亚洲精品无码va白人极品 | 真人毛片97级无遮挡精品 | 日本视频在线观看免费 | 性色欲网站人妻丰满中文久久不卡 | 成人福利在线观看 | 98国产视频| 影音先锋啪啪 | 色呦呦在线免费观看 | 亚洲欧美日韩一区二区三区在线观看 | 在线看日本 | 久久国产乱子伦精品 | 九色91蝌蚪 | 亚色视频在线 | 日韩精品中文字幕在线播放 | 少妇一级淫免费观看 | 超碰pron | 亚洲自拍偷拍一区 | 欧美日韩一级二级三级 | 精品深夜av无码一区二区老年 | 日韩欧美精品一区二区 | 欧美大片免费在线观看 | 手机免费av片 | 99国产精品久久久久99打野战 | 99久久精品免费看国产四区 | 清纯粉嫩极品夜夜嗨av | 牛牛澡牛牛爽一区二区 | 国产免费一区二区三区三州老师 | 91丨porny丨刺激 | 欧美在线视频观看 | 国产男女自拍 | 日韩一区二区视频在线观看 | 国产欧美日韩专区 | 粉嫩av在线 | 手机看片欧美日韩 | 日韩播放 | 中文国产视频 | 色综合国产 | 日韩一级片在线播放 | 亚洲天堂最新 | 日本三级精品 | av最新网址 | 黑花全肉高h湿play短篇 | 中文字幕在线永久 | 91你懂的| 日本在线成人 | 天天av天天爽 | 337p粉嫩日本欧洲亚洲大胆 | 欧美xxxx胸大| 黄色aa视频 | 国模无码一区二区三区 | 久久亚洲精品石原莉奈 | 国产精品无码内射 | 性xxxx另类xxⅹ | 中文字幕黄色片 | 国产成人一区二区三区小说 | 精品无码三级在线观看视频 | 成人小视频在线 | 免费看国产片在线观看 | 一区二区乱码 | 午夜影院色 | 亚洲美女中文字幕 | 精品久久人人 | 日本性爱视频在线观看 |