1. 程式人生 > >bzoj千題計劃321:bzoj5251: [2018多省省隊聯測]劈配(網路流 + 二分)

bzoj千題計劃321:bzoj5251: [2018多省省隊聯測]劈配(網路流 + 二分)

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;

#define N 201
#define M 80801 

int n,m;

int lim[N];
int a[N][N][N];
int cnt[N][N];

int dream[N];

int tot=1;
int src,decc;
int lev[N<<1
],cur[N<<1]; int front[M<<1],nxt[M<<1],to[M<<1],cap[M<<1]; queue<int>q; int st[N]; inline void read(int &x) { x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } } inline void init() { read(n); read(m); decc
=n+m+1; for(int i=1;i<=m;++i) read(lim[i]); int x; for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) { read(x); if(x) a[i][x][++cnt[i][x]]=j; } for(int i=1;i<=n;++i) read(dream[i]); } inline void add(int u,int v,int w) { to[
++tot]=v; nxt[tot]=front[u]; front[u]=tot; cap[tot]=w; to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; cap[tot]=0; } inline bool bfs() { for(int i=0;i<=decc;++i) cur[i]=front[i],lev[i]=-1; while(!q.empty()) q.pop(); q.push(src); lev[src]=0; int now,t; while(!q.empty()) { now=q.front(); q.pop(); for(int i=front[now];i;i=nxt[i]) { t=to[i]; if(lev[t]==-1 && cap[i]) { lev[t]=lev[now]+1; if(t==decc) return true; q.push(t); } } } return false; } inline int dinic(int now,int flow) { if(now==decc) return flow; int rest=0,delta; for(int &i=cur[now];i;i=nxt[i]) if(cap[i] && lev[to[i]]==lev[now]+1) { delta=dinic(to[i],min(flow-rest,cap[i])); if(delta) { rest+=delta; cap[i]-=delta; cap[i^1]+=delta; if(rest==flow) break; } } if(rest!=flow) lev[now]=-1; return rest; } void solve1() { for(int i=1;i<=m;++i) add(n+i,decc,lim[i]); int ok; for(int i=1;i<=n;++i) { add(src,i,1); for(int j=1;j<=m;++j) if(cnt[i][j]) { for(int k=1;k<=cnt[i][j];++k) add(i,n+a[i][j][k],1); if(bfs()) { dinic(src,i); st[i]=j; break; } else { for(int k=1,h=tot;k<=cnt[i][j];++k,h-=2) cap[h]=cap[h-1]=0; } } } for(int i=1;i<=n;++i) printf("%d ",st[i] ? st[i] : m+1); putchar('\n'); } inline bool check(int x,int goal) { tot=1; memset(front,0,sizeof(front)); for(int i=1;i<=m;++i) add(n+i,decc,lim[i]); int ok=0; for(int i=1;i<goal;++i) { add(src,i,1); if(!st[i]) { ok++; continue; } for(int j=1;j<=cnt[i][st[i]];++j) add(i,n+a[i][st[i]][j],1); } add(src,x,1); for(int i=1;i<=dream[x];++i) for(int j=1;j<=cnt[x][i];++j) add(x,n+a[x][i][j],1); while(bfs()) ok+=dinic(src,goal); return ok==goal; } void solve2() { int l,r,mid,ans; for(int i=1;i<=n;++i) { if(st[i] && st[i]<=dream[i]) { printf("0 "); continue; } ans=i; l=1; r=i-1; while(l<=r) { mid=l+r>>1; if(check(i,i-mid)) ans=mid,r=mid-1; else l=mid+1; } printf("%d ",ans); } putchar('\n'); } void clear() { memset(st,0,sizeof(st)); memset(cnt,0,sizeof(cnt)); memset(front,0,sizeof(front)); tot=1; } int main() { //freopen("mentor.in","r",stdin); //freopen("mentor.out","w",stdout); int T,C; read(T); read(C); while(T--) { clear(); init(); solve1(); solve2(); } }

相關推薦

bzoj計劃321bzoj5251: [2018聯測]網路 + 二分

#include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #d

bzoj計劃324bzoj5249: [2018聯測]IIIDX線段樹

#include<cmath> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 500001 int d[N

bzoj計劃311bzoj5017: [Snoi2017]炸彈線段樹優化tarjan構圖

#include<cstdio> #include<vector> #include<iostream> #include<algorithm> using namespace std; const int mod=1e9+7;

bzoj計劃319bzoj2865: 字串識別字尾自動機 + 線段樹

#include<map> #include<cstdio> #include<cstring> #include<algorithm> #define N 500001 using namespace std; char s[

bzoj計劃310bzoj5285: [Hnoi2018]尋寶遊戲(思維+雜湊)

#include<cstdio> #include<algorithm> #define N 5001 using namespace std; const int mod=1e9+7; int bit[N]; char s[N]; int has

bzoj計劃316bzoj3173: [Tjoi2013]最長上升子序列二分+樹狀陣列

#include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 100001 #define lowbit(x) x&-x

bzoj計劃309bzoj4332: JSOI2012 分零食分治+FFT

#include<cmath> #include<cstdio> #include<algorithm> using namespace std; const int M=1<<17; #define N 10001 int m,

bzoj計劃312bzoj2119: 股市的預測字尾陣列+st表

#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #d

bzoj計劃317bzoj4650: [Noi2016]優秀的拆分字尾陣列+差分

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 30002 using namespace std; int n;

bzoj計劃318bzoj1396: 識別子串字尾自動機 + 線段樹

#include<cstdio> #include<cstring> #include<algorithm> #define N 100001 using namespace std; char s[N]; int ch[N<&

bzoj計劃323bzoj1951: [Sdoi2010]古代豬文Lucas+CRT+尤拉定理

#include<cmath> #include<cstdio> #include<iostream> using namespace std; const int mod=999911659; const int phi=mod-1; typ

bzoj計劃322bzoj2561: 最小生成樹最小割

#include<cstdio> #include<queue> #include<cstring> #include<iostream> #include<algorithm> using namespace std;

bzoj計劃313bzoj3879: SvT字尾陣列+st表+單調棧

#include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 500001 #define M 3000001 int n,m,mm;

bzoj計劃314bzoj3238: [Ahoi2013]差異字尾陣列+st表+單調棧

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define N 500001 int n

bzoj計劃320bzoj4939: [Ynoi2016]掉進兔子洞 + bitset

#include<cmath> #include<cstdio> #include<bitset> #include<cstring> #include<iostream> #include<algorithm> us

bzoj計劃308bzoj4589: Hard Nim倍增FWT+生成函式

#include<cstdio> #include<cstring> using namespace std; #define N 50001 const int mod=1e9+7; const int M=1<<16; int inv

bzoj計劃315bzoj3172: [Tjoi2013]單詞AC自動機

#include<queue> #include<cstdio> #include<cstring> using namespace std; #define N 2000001 using namespace std; int pos[20

[BZOJ5251][九聯考2018](網絡)

整數 limit 沒有 開始 ems 舉例 我們 led ans 5251: [2018多省省隊聯測]劈配 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 33 Solved: 22[Submit][Status][D

《compass-reference》翻譯計劃1.1概述和1.2所涉及技術

1.2.2. 領域模型   Compass的一個主要特性就是OSEM(物件/搜尋引擎對映)。可以採用annotation或者xml定義(或聯合使用),把豐富的領域模型對映到搜尋引擎中。想了解更多的內容,請閱讀第6章:OSEM-物件/搜尋引擎對映。   1.

LeetCode庫11盛最水的容器——JavaScript解答

題目描述: 給定 n 個非負整數 a1,a2,…,an,每個數代表座標中的一個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的