二分图匈牙利也可以

判断必须点就看能不能通过偶数长度的增广路翻过去

代码:

(最后一个点4s多才行,,,卡不过算了)

开始边数写少了RE,应该是4*N*N

M-R随手开了一堆int?都要是long long

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define il inline
#define reg register int
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){char ch;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=100+5;
ll a[N][N];
int co[N*N];
int in[N*N];
int n,m;
struct node{int nxt,to;
}e[8*N*N];
int hd[N*N],cnt;
int num(int x,int y){return (x-1)*m+y;
}
void add(int x,int y){
//    cout<<" ahahhaa "<<endl;e[++cnt].nxt=hd[x];e[cnt].to=y;hd[x]=cnt;
}
int to[N*N];
int vis[N*N];
bool dfs(int x,int id){
//    cout<<" x "<<x<<" id "<<id<<endl;for(reg i=hd[x];i;i=e[i].nxt){int y=e[i].to;//    cout<<" yy "<<y<<" vis "<<vis[y]<<endl;if(vis[y]==id) continue;vis[y]=id;if(!to[y]||dfs(to[y],id)){to[y]=x;in[x]=1;to[x]=y;in[y]=1;return true;}}return false;
}
bool fin(int x,int id,int pos){if(vis[x]==id) return false;vis[x]=id;if(pos==0){if(!to[x]) return true;return fin(to[x],id,pos^1);}for(reg i=hd[x];i;i=e[i].nxt){int y=e[i].to;if(y!=to[x]){if(fin(y,id,pos^1)) return true;}}return false;
}
ll p[10]={2,3,7,61,24251};
ll add(ll x,ll y,ll p){return x+y>=p?x+y-p:x+y;
}
ll qk(ll x,ll y,ll p){ll ret=0;while(y){if(y&1) ret=add(ret,x,p);x=add(x,x,p);y>>=1;}return ret;
}
ll qm(ll x,ll y,ll p){ll ret=1;while(y){if(y&1) ret=qk(ret,x,p);x=qk(x,x,p);y>>=1;}return ret;
}
bool che(ll x,ll d){int s=0;ll lp=x-1;while(!(lp&1)){++s;lp>>=1;}ll now=qm(d,lp,x);if(now==1||now==x-1) return true;for(reg i=0;i<s;++i){ll tmp=qk(now,now,x);if(tmp==1&&(now!=1&&now!=x-1)) return false;now=tmp;}if(now!=1) return false;return true;
}
bool M_R(ll x){
//    cout<<" xx "<<x<<endl;if(x==0) return true;if(x==1) return true;if(x==46856248255981ll) return false; if(x==2||x==3||x==7||x==11||x==13||x==17||x==23||x==29||x==31||x==61||x==24251) return true;for(reg i=0;i<5;++i){if(x%p[i]==0) return false;if(!che(x,p[i])) return false;}
//    cout<<" ok "<<endl;return true;
}
int mem[N*N],nb;
int main(){
//    cout<<" M_R "<<M_R(1557403521852231)<<endl;
    rd(n);rd(m);
//    cout<<" 2333 "<<endl;for(reg i=1;i<=n;++i){for(reg j=1;j<=m;++j){scanf("%lld",&a[i][j]);co[num(i,j)]=(i+j)%2;}}//    return 0;for(reg i=1;i<=n;++i){for(reg j=1;j<=m;++j){if(a[i][j]==-1) continue;if(j!=m){if(a[i][j+1]!=-1){if(M_R(a[i][j]+a[i][j+1])==0){add(num(i,j),num(i,j+1));add(num(i,j+1),num(i,j));}}}if(i!=n){if(a[i+1][j]!=-1){if(M_R(a[i][j]+a[i+1][j])==0){add(num(i,j),num(i+1,j));add(num(i+1,j),num(i,j));//        cout<<num(i,j)<<" "<<num(i+1,j)<<endl;
                    }}}}}
//    cout<<" after build "<<endl;int tot=0;int le=0,ri=0;for(reg i=1;i<=n;++i){for(reg j=1;j<=m;++j){if(co[num(i,j)]==0&&a[i][j]!=-1){++le;tot+=dfs(num(i,j),num(i,j));}else if(a[i][j]!=-1) ++ri;}}
//    cout<<" le ri "<<le<<" "<<ri<<" tot "<<tot<<endl;if(le==ri&&tot==le){puts("0");return 0;}memset(vis,0,sizeof vis);for(reg i=1;i<=n;++i){for(reg j=1;j<=m;++j){if(a[i][j]!=-1){if(!in[num(i,j)]||fin(to[num(i,j)],num(i,j),1)){mem[++nb]=num(i,j);}}}}sort(mem+1,mem+nb+1);printf("%d\n",nb);for(reg i=1;i<=nb;++i){printf("%d %d\n",(mem[i]-1)/m+1,mem[i]-((mem[i]-1)/m)*m);}return 0;
}}
signed main(){
//    freopen("data3618.in","r",stdin);
//    freopen("data3618.out","w",stdout);
    Miracle::main();return 0;
}/*Author: *Miracle*Date: 2019/2/2 20:45:23
*/

这个题的二分图匹配思想还是很巧妙

从最大匹配来考虑,便于决策

转载于:https://www.cnblogs.com/Miracevin/p/10349457.html

fzyzojP3618 -- [校内训练-互测20180412]士兵的游戏相关推荐

  1. P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演,拉格朗日插值)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演,拉格朗日插值) Problem Sol ...

  2. 校内训练赛题解第三篇

    校内训练赛题解 人气估值 解题思路 脑力训练计划 (模拟 + 字符串) 解题思路 大暑赛期(贪心 + 思维) 人气估值 题目描述 你是某动画制作公司的企划部长.如今动画制作公司制作的东西,已经不仅仅局 ...

  3. P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演 + 伯努利数)

    P6271 [湖北省队互测2014]一个人的数论 ∑i=1nim[gcd⁡(i,n)=1]∑d∣nμ(d)dm∑i=1ndim由伯努利数可知∑i=0nim=1m+1∑i=0mCm+1iBi(n+1)m ...

  4. UOJ#191. 【集训队互测2016】Unknown

    UOJ#191. [集训队互测2016]Unknown 题目描述 Solution 二进制分组. 每一个组内维护一个斜率单调减的凸包. 因为有删点,避免出现反复横跳产生的爆炸复杂度,需要等到同一深度的 ...

  5. [2015国家集训队互测]口胡

    比赛链接 http://uoj.ac/contest/11 口胡题解 A.[集训队互测2015]Robot 直接果断打暴力了...这个暴力很好写,我就不废话了 B.[集训队互测2015]Marketi ...

  6. 2017.10.24队内互测——压轴出场的互测终曲|(*_-)

    出题人: Sherlock, Frank, WWQ, MurasameKatana 终于到了我们组出题啦. 题面都是我自己写的2333 Problem 1 :令咒 题目来源:http://codevs ...

  7. 2017.9.16队内互测——老年组Day1

    2017.9.16队内互测--老年组Day1 出题人:feather,MeiCo,Summer,Black Problem 1: 对于100%的数据,n<=1000 截图比较奇怪-还请见谅 简单 ...

  8. 【LOJ3077】「2019 集训队互测 Day 4」绝目编诗

    [题目链接] 点击打开链接 [思路要点] 不难发现各个边双连通分量可以分开处理,桥边可以直接删除. 可以证明,对于每一个边双连通分量,当 M−NM-NM−N 超过 O(N)O(\sqrt{N})O(N ...

  9. 「2019 集训队互测 Day 1」最短路径 解题报告

    一.题目概述 题目链接:Libre OJ. 给出一张图,求出 ans=∑i=1n∑j=1n[i≠j]dk(i,j)ans=\sum_{i=1}^n\sum_{j=1}^n[i\ne j]\texttt ...

最新文章

  1. 死磕Java并发:深入分析CAS
  2. php 请求拦截,解决拦截器对ajax请求的拦截实例详解
  3. 修复Linux系统内核TCP漏洞,修复Linux TCP SACK PANIC 远程拒绝服务漏洞
  4. eclipse启动提示java,Eclipse启动时报错-JSP教程,Java技巧及代码
  5. 使用^、(异或、并且)位运算 实现算数加法(+)
  6. Bootstrap 导航条
  7. 吞吐量、速率、背板带宽
  8. Java .net 心得_我做英文站的心得-如何做好英文站 - 程序员日记 - 做人做技术【关注.NET和JAVA】...
  9. 小程序triggerevent 传参_开源wwto:小程序跨端迁移解决方案——微信转其他小程序...
  10. 经验:多表复制(结构、数据)
  11. sql 创建存储过程
  12. 《算法导论》+第四版++答案
  13. 左神算法:找到二叉树中符合搜索二叉树条件的最大拓扑结构(Java版)
  14. 浏览器工作原理和实践
  15. \t\t林荫苗圃 苗木和苗圃 好苗木种植技术是关键 它好我也好
  16. 解决 Minimum supported Gradle version is 5.1.1. Current version is 4.6
  17. IAR6.3创建MSP430工程
  18. win10清理_小学生都会:win10设置自动清理缓存和垃圾文件
  19. android顶部按钮图片,安卓动态改变button顶部图片即drawableTop属性
  20. Fluent UDF 根据给定点坐标获取cell

热门文章

  1. 《PyInstaller打包实战指南》第十一节 其他进阶命令
  2. 【数论】一些数论知识
  3. 婚恋交友app源码,实现一个不一样的轮播指示器
  4. 婚恋交友app源码,如何进行代码优化
  5. 今奥无人机举证_国土三调攻坚冲刺,大疆无人机为调查举证提供加速度
  6. 黑苹果社区2019年10月1日限时免费注册
  7. RTX 4090Ti显卡性能怎么样? RTX 4090Ti功耗
  8. Effective FPV for verification 形式验证 第6章
  9. Java学习之阶段小结
  10. 关于ISCC2013的思路整理