fzyzojP3618 -- [校内训练-互测20180412]士兵的游戏
二分图匈牙利也可以
判断必须点就看能不能通过偶数长度的增广路翻过去
代码:
(最后一个点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]士兵的游戏相关推荐
- P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演,拉格朗日插值)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演,拉格朗日插值) Problem Sol ...
- 校内训练赛题解第三篇
校内训练赛题解 人气估值 解题思路 脑力训练计划 (模拟 + 字符串) 解题思路 大暑赛期(贪心 + 思维) 人气估值 题目描述 你是某动画制作公司的企划部长.如今动画制作公司制作的东西,已经不仅仅局 ...
- 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 ...
- UOJ#191. 【集训队互测2016】Unknown
UOJ#191. [集训队互测2016]Unknown 题目描述 Solution 二进制分组. 每一个组内维护一个斜率单调减的凸包. 因为有删点,避免出现反复横跳产生的爆炸复杂度,需要等到同一深度的 ...
- [2015国家集训队互测]口胡
比赛链接 http://uoj.ac/contest/11 口胡题解 A.[集训队互测2015]Robot 直接果断打暴力了...这个暴力很好写,我就不废话了 B.[集训队互测2015]Marketi ...
- 2017.10.24队内互测——压轴出场的互测终曲|(*_-)
出题人: Sherlock, Frank, WWQ, MurasameKatana 终于到了我们组出题啦. 题面都是我自己写的2333 Problem 1 :令咒 题目来源:http://codevs ...
- 2017.9.16队内互测——老年组Day1
2017.9.16队内互测--老年组Day1 出题人:feather,MeiCo,Summer,Black Problem 1: 对于100%的数据,n<=1000 截图比较奇怪-还请见谅 简单 ...
- 【LOJ3077】「2019 集训队互测 Day 4」绝目编诗
[题目链接] 点击打开链接 [思路要点] 不难发现各个边双连通分量可以分开处理,桥边可以直接删除. 可以证明,对于每一个边双连通分量,当 M−NM-NM−N 超过 O(N)O(\sqrt{N})O(N ...
- 「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 ...
最新文章
- 死磕Java并发:深入分析CAS
- php 请求拦截,解决拦截器对ajax请求的拦截实例详解
- 修复Linux系统内核TCP漏洞,修复Linux TCP SACK PANIC 远程拒绝服务漏洞
- eclipse启动提示java,Eclipse启动时报错-JSP教程,Java技巧及代码
- 使用^、(异或、并且)位运算 实现算数加法(+)
- Bootstrap 导航条
- 吞吐量、速率、背板带宽
- Java .net 心得_我做英文站的心得-如何做好英文站 - 程序员日记 - 做人做技术【关注.NET和JAVA】...
- 小程序triggerevent 传参_开源wwto:小程序跨端迁移解决方案——微信转其他小程序...
- 经验:多表复制(结构、数据)
- sql 创建存储过程
- 《算法导论》+第四版++答案
- 左神算法:找到二叉树中符合搜索二叉树条件的最大拓扑结构(Java版)
- 浏览器工作原理和实践
- \t\t林荫苗圃 苗木和苗圃 好苗木种植技术是关键 它好我也好
- 解决 Minimum supported Gradle version is 5.1.1. Current version is 4.6
- IAR6.3创建MSP430工程
- win10清理_小学生都会:win10设置自动清理缓存和垃圾文件
- android顶部按钮图片,安卓动态改变button顶部图片即drawableTop属性
- Fluent UDF 根据给定点坐标获取cell