洛谷P7515:矩阵游戏(差分约束)
生活随笔
收集整理的這篇文章主要介紹了
洛谷P7515:矩阵游戏(差分约束)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
解析
如果沒(méi)有元素均要在 [0,1e6][0,1e6][0,1e6] 的條件,可以很容易的構(gòu)造出一個(gè)合法解。
那么我們就要通過(guò)調(diào)整得到的解,使所有數(shù)都在合法范圍內(nèi)。
注意到,每次給某一行/列依次+1,-1,+1,-1…這樣仍然符合要求。
讓每一行/列錯(cuò)開(kāi),就能變成:
這樣每個(gè)格子行貢獻(xiàn)和列貢獻(xiàn)的符號(hào)就都是相反的,然后就可以差分約束了。
代碼
#include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long #define debug(...) fprintf(stderr,__VA_ARGS__) #define ok debug("OK\n") using namespace std;const int N=650; const int M=50050; const int mod=1e9+7; const double eps=1e-9;inline ll read() {ll x(0),f(1);char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f; }int n,m; int a[N][N],b[N][N],c[N],d[N],tot; ll dis[N]; int o=1e6; queue<int>q; bool vis[N]; int tim[N]; struct node{int to,nxt,w; }p[N*N*2]; int fi[N],cnt; inline void addline(int x,int y,int w){p[++cnt]=(node){y,fi[x],w};fi[x]=cnt; } bool spfa(){memset(dis,0,sizeof(dis));memset(tim,0,sizeof(tim));for(int i=1;i<=tot;i++) q.push(i),vis[i]=1;while(!q.empty()){int now=q.front();q.pop();vis[now]=0;for(int i=fi[now];~i;i=p[i].nxt){int to=p[i].to;if(dis[to]<dis[now]+p[i].w){dis[to]=dis[now]+p[i].w;tim[to]++;if(!vis[to]){vis[to]=1;q.push(to);}if(tim[to]>tot) return false;}}}return true; } void work(){memset(a,0,sizeof(a));tot=0;memset(fi,-1,sizeof(fi));cnt=-1;n=read();m=read();for(int i=1;i<n;i++){for(int j=1;j<m;j++) b[i][j]=read();}for(int i=n-1;i>=1;i--){for(int j=m-1;j>=1;j--) a[i][j]=b[i][j]-a[i+1][j+1]-a[i+1][j]-a[i][j+1];}//for(int i=1;i<=n;i++){//for(int j=1;j<=m;j++) printf("%d ",a[i][j]);//puts("");//}for(int i=1;i<=n;i++) c[i]=++tot;for(int j=1;j<=m;j++) d[j]=++tot;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if((i+j)&1){addline(c[i],d[j],a[i][j]-o);addline(d[j],c[i],-a[i][j]);}else{ addline(c[i],d[j],-a[i][j]);addline(d[j],c[i],a[i][j]-o);}}}//for(int i=1;i<=tot;i++)// for(int j=1;j<=tot;j++) printf("%d -> %d w=%d\n",i,j,e[i][j]);if(!spfa()){puts("NO");return;}puts("YES");for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){ll add=dis[c[i]]-dis[d[j]];if((i+j)&1) a[i][j]+=add;else a[i][j]-=add;printf("%d ",a[i][j]);}puts("");} } int main() { #ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout); #endifint T=read();while(T--) work();return 0; } /* 1 3 3 1000000 2000000 0 0 */ 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的洛谷P7515:矩阵游戏(差分约束)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 红酒木瓜汤怎么做
- 下一篇: 洛谷P7518:宝石(倍增、可撤销并查集