【JZOJ5307】【NOIP2017提高A组模拟8.18】偷窃
2017-08-23 22:04
369 查看
Description
Data Constraint
Solution
在考场上理解错题意,竟然还有85分!!!上帝保佑真正的题意是可以移动一个金砖到另一堆上。
我们考虑求每一行每一列的最大值,若有一行一列满足最大值相同且交点的金砖数量不为空的话,那么显然是可以通过然交点为该值从而同时满足行与列的要求。因此我们先将所有行与列的最大值相加,若有一行一列满足最大值相同且交点的金砖数量不为空的话,那么该行向该列连一条边。最后跑一下二分图即可。所有点总和减去(和减去最大匹配)即为答案。
Code
#include<iostream> #include<cmath> #include<cstring> #include<cstdio> #include<algorithm> #define ll long long using namespace std; const ll maxn=3e4+5,mo=1e15+5; ll a[200][200],h[maxn],l[maxn],first[maxn],last[maxn],next[maxn],value[maxn],dui[maxn]; ll n,m,i,t,j,k,x,y,z,ans,s,sum,v[maxn],d[maxn],num; void lian(ll x,ll y,ll z){ last[++num]=y;next[num]=first[x];first[x]=num;value[num]=z; } ll bfs(){ int i=0,j=1;memset(d,0,sizeof(d));d[0]=1; while (i<j){ x=v[++i]; for (t=first[x];t;t=next[t]){ if (d[last[t]] ||!value[t]) continue; d[v[++j]=last[t]]=d[x]+1; } } return d[s]; } ll dg(ll x,ll sum){ ll t,p=sum,k; if (x==s) return sum; for (t=first[x];t;t=next[t]){ if (!value[t]||d[last[t]]!=d[x]+1) continue; k=dg(last[t],min(value[t],p)); if (k){ value[t]-=k;value[dui[t]]+=k;p-=k; if (!p)break; } } if (p==sum) d[x]=-1; return sum-p; } int main(){ // freopen("data.in","r",stdin); scanf("%lld%lld",&n,&m);s=n+m+1; for (i=1;i<=n;i++) for (j=1;j<=m;j++){ scanf("%lld",&a[i][j]);a[i][j]-=(a[i][j]>0); if (h[i]<a[i][j]) h[i]=a[i][j]; if (l[j]<a[i][j]) l[j]=a[i][j]; ans+=a[i][j]; } for (i=1;i<=n;i++) for (j=1;j<=m;j++) if (h[i]==l[j] && a[i][j]) lian(i,j+n,h[i]),lian(j+n,i,0); for (i=1;i<=n;i++)lian(0,i,h[i]),lian(i,0,0),sum+=h[i]; for (i=1;i<=m;i++)lian(i+n,s,l[i]),lian(s,i+n,0),sum+=l[i]; for (i=1;i<=num;i++) if (i%2) dui[i]=i+1,dui[i+1]=i; while (bfs()) sum-=dg(0,mo); printf("%lld\n",ans-sum); }
相关文章推荐
- [jzoj5307]【NOIP2017提高A组模拟8.18】偷窃
- JZOJ 5307. 【NOIP2017提高A组模拟8.18】偷窃 (Standard IO)
- JZOJ 5305. 【NOIP2017提高A组模拟8.18】C (Standard IO)
- 【jzoj5305】【NOIP2017提高A组模拟8.18】【C】
- JZOJ 5305. 【NOIP2017提高A组模拟8.18】C
- 【jzoj5306】【NOIP2017提高A组模拟8.18】【棋盘游戏】
- 【JZOJ4924】【NOIP2017提高组模拟12.17】向再见说再见
- JZOJ5358. 【NOIP2017提高A组模拟9.12】BBQ
- 【JZOJ4923】【NOIP2017提高组模拟12.17】巧克力狂欢
- 【JZOJ4930】【NOIP2017提高组模拟12.18】C
- JZOJ 5182. 【NOIP2017提高组模拟6.29】码灵鼠
- JZOJ5385. 【NOIP2017提高A组模拟9.23】Carry 树上倍增
- JZOJ 5185. 【NOIP2017提高组模拟6.30】tty's sequence
- JZOJ 5197. 【NOIP2017提高组模拟7.3】C
- JZOJ 5392. 【NOIP2017提高A组模拟10.5】Lucky Transformation
- JZOJ5399. 【NOIP2017提高A组模拟10.7】Confess bitset
- JZOJ 5328. 【NOIP2017提高A组模拟8.22】世界线
- jzoj5331 【NOIP2017提高A组模拟8.23】壕游戏
- JZOJ 5405.【NOIP2017提高A组模拟10.10】Permutation
- 【jzoj5346】【NOIP2017提高A组模拟9.5】【NYG的背包】【贪心】