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*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=+;
ll a[N][N];
int co[N*N];
int in[N*N];
int n,m;
struct node{
int nxt,to;
}e[*N*N];
int hd[N*N],cnt;
int num(int x,int y){
return (x-)*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]=;
to[x]=y;
in[y]=;
return true;
}
}
return false;
}
bool fin(int x,int id,int pos){
if(vis[x]==id) return false;
vis[x]=id;
if(pos==){
if(!to[x]) return true;
return fin(to[x],id,pos^);
}
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y!=to[x]){
if(fin(y,id,pos^)) return true;
}
}
return false;
}
ll p[]={,,,,};
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=;
while(y){
if(y&) ret=add(ret,x,p);
x=add(x,x,p);
y>>=;
}
return ret;
}
ll qm(ll x,ll y,ll p){
ll ret=;
while(y){
if(y&) ret=qk(ret,x,p);
x=qk(x,x,p);
y>>=;
}
return ret;
}
bool che(ll x,ll d){
int s=;
ll lp=x-;
while(!(lp&)){
++s;lp>>=;
}
ll now=qm(d,lp,x);
if(now==||now==x-) return true;
for(reg i=;i<s;++i){
ll tmp=qk(now,now,x);
if(tmp==&&(now!=&&now!=x-)) return false;
now=tmp;
}
if(now!=) return false;
return true;
}
bool M_R(ll x){
// cout<<" xx "<<x<<endl;
if(x==) return true;
if(x==) return true;
if(x==46856248255981ll) return false;
if(x==||x==||x==||x==||x==||x==||x==||x==||x==||x==||x==) return true;
for(reg i=;i<;++i){
if(x%p[i]==) 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=;i<=n;++i){
for(reg j=;j<=m;++j){
scanf("%lld",&a[i][j]);
co[num(i,j)]=(i+j)%;
}
} // return 0;
for(reg i=;i<=n;++i){
for(reg j=;j<=m;++j){
if(a[i][j]==-) continue;
if(j!=m){
if(a[i][j+]!=-){
if(M_R(a[i][j]+a[i][j+])==){
add(num(i,j),num(i,j+));
add(num(i,j+),num(i,j));
}
}
}
if(i!=n){
if(a[i+][j]!=-){
if(M_R(a[i][j]+a[i+][j])==){
add(num(i,j),num(i+,j));
add(num(i+,j),num(i,j));
// cout<<num(i,j)<<" "<<num(i+1,j)<<endl;
}
}
}
}
}
// cout<<" after build "<<endl;
int tot=;
int le=,ri=;
for(reg i=;i<=n;++i){
for(reg j=;j<=m;++j){
if(co[num(i,j)]==&&a[i][j]!=-){
++le;
tot+=dfs(num(i,j),num(i,j));
}else if(a[i][j]!=-) ++ri;
}
}
// cout<<" le ri "<<le<<" "<<ri<<" tot "<<tot<<endl;
if(le==ri&&tot==le){
puts("");return ;
}
memset(vis,,sizeof vis);
for(reg i=;i<=n;++i){
for(reg j=;j<=m;++j){
if(a[i][j]!=-){
if(!in[num(i,j)]||fin(to[num(i,j)],num(i,j),)){
mem[++nb]=num(i,j);
}
}
}
}
sort(mem+,mem+nb+);
printf("%d\n",nb);
for(reg i=;i<=nb;++i){
printf("%d %d\n",(mem[i]-)/m+,mem[i]-((mem[i]-)/m)*m);
}
return ;
} }
signed main(){
// freopen("data3618.in","r",stdin);
// freopen("data3618.out","w",stdout);
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/2/2 20:45:23
*/
这个题的二分图匹配思想还是很巧妙
从最大匹配来考虑,便于决策
fzyzojP3618 -- [校内训练-互测20180412]士兵的游戏的更多相关文章
- fzyzojP3580 -- [校内训练-互测20180315]小基的高智商测试
		题目还有一个条件是,x>y的y只会出现一次(每个数直接大于它的只有一个) n<=5000 是[HNOI2015]实验比较 的加强版 g(i,j,k)其实可以递推:g(i,j,k)=g(i- ... 
- 【loj2461】【2018集训队互测Day 1】完美的队列
		#2461. 「2018 集训队互测 Day 1」完美的队列 传送门: https://loj.ac/problem/2461 题解: 直接做可能一次操作加入队列同时会弹出很多数字,无法维护:一个操作 ... 
- 【2018集训队互测】【XSY3372】取石子
		题目来源:2018集训队互测 Round17 T2 题意: 题解: 显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz! 显然不会无解…… 为了方便计算石子个数,在 ... 
- 【CH 弱省互测 Round #1 】OVOO(可持久化可并堆)
		Description 给定一颗 \(n\) 个点的树,带边权. 你可以选出一个包含 \(1\) 顶点的连通块,连通块的权值为连接块内这些点的边权和. 求一种选法,使得这个选法的权值是所有选法中第 \ ... 
- 洛谷 P4463 - [集训队互测 2012] calc(多项式)
		题面传送门 & 加强版题面传送门 竟然能独立做出 jxd 互测的题(及其加强版),震撼震撼(((故写题解以祭之 首先由于 \(a_1,a_2,\cdots,a_n\) 互不相同,故可以考虑求出 ... 
- 6.13校内互测 (DP 带权二分 斜率优化)
		丘中有麻plant 改自这儿,by ZBQ. 还有隐藏的一页不放了.. 直接走下去的话,如果开始时间确定那么到每个点的时间确定,把time减去dis就可以去掉路程的影响了. 这样对于减去d后的t,如果 ... 
- LOJ3069. 「2019 集训队互测 Day 1」整点计数(min_25筛)
		题目链接 https://loj.ac/problem/3069 题解 复数真神奇. 一句话题意:令 \(f(x)\) 表示以原点 \((0, 0)\) 为圆心,半径为 \(x\) 的圆上的整点数量, ... 
- Alpha2的项目互评互测
		目录 @(Alpha2项目测试) 这个作业属于哪个课程 课程链接 这个作业要求在哪里 作业要求的链接 团队名称 你的代码我的发 这个作业的目标 其他参考文献 软件测试用例 姓名 学号 团队名称 李涵 ... 
- [校内训练19_09_10]sort
		题意 给一个非负整数序列,每次问能否异或上一个正整数使得所有的数单调不减.如果能,输出最小的x,否则输出-1.单点修改.多测.要求最多一个log. 思考 只要考虑相邻的两个数.找到这两个数最高的不同的 ... 
随机推荐
- 高可用OpenStack(Queen版)集群-1. 集群环境
			参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ... 
- 离线人脸识别 ArcFaceSharp -- ArcFace 2.0 SDK C#封装库分享
			ArcFaceSharp ArcFaceSharp 是ArcSoft 虹软 ArcFace 2.0 SDK 的一个 C# 封装库,为方便进行 C# 开发而封装.欢迎 Start & Fork. ... 
- ubuntu下import matplotlib错误解决办法
			环境:ubuntu16.04,python2.7,tensorflow1.4.0 问题: ImportError: No moudule named _tkinter, please install ... 
- Vs2012 编写代码规则
			FxCop编写规则 VS2012 下更方便,所需的DLL在: D:\Program Files (x86)\Microsoft Visual Studio 11.0\Team Tools\Static ... 
- 【转】Java生成plist下载ipa文件
			我们在上传ipa想要安装的时候必须要通过plist文件去下载,并且还要遵循 itms-services协议. 意思就是,第一步我们要生成一个plist文件, 第二步生成一个html文件,用来指向pli ... 
- 软件工程-东北师大站-第十次作业(PSP)
			1.本周PSP 2.本周进度条 3.本周累计进度图 代码累计折线图 博文字数累计折线图 4.本周PSP饼状图 
- Daily Scrum (2015/10/21)
			今天可以说是项目正式开始的第一天,由于大家缺乏做团队项目的经验,对TFS的使用都还不太熟悉,所以今天大家的主要工作是熟悉TFS的使用和对代码进行初步的理解.我们预计需要2-3天时间来理解透彻源代码.以 ... 
- Scrum Meeting 10.31
			成员 今日任务 明日任务 今日工作时长 徐越 整理开发文档,学习ip相关知识,学习servlet相关知识 代码迁移,学习数据库相关知识 5h 赵庶宏 学习学长的servlet代码 进行数据库的连接 4 ... 
- 冲刺One之站立会议5   /2015-5-18
			2015-5-18 服务器部分大体已经完工,现在我们主要是在把登陆界面和服务器组装起来,这个过程是很让人头痛的,以为其中涉及到了很多网络协议.网络编程的知识,由于之前我们没有接触过所以实现起来会觉得很 ... 
- slf4j+log4j的初次使用
			关于这两者的组合应用带来的好处,google都有 就不说了. 首先说下配置, 工作笔记:在myeclipse 中创建一个java project 创建一个 TestSlf4J 类 package co ... 
