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. 思考 只要考虑相邻的两个数.找到这两个数最高的不同的 ...
随机推荐
- JavaScript学习(1)之JavaScript基础
JavaScript学习(1)之JavaScript基础 由于工作原因,开发语言逐渐以JavaScript为主,所以,抽空学习了下JavaScript语法.等现阶段的工作稳定之后,陆续会分享下自己在学 ...
- XSS-DVWA
1.反射型 LOW: 没有过滤,直接键入PAYLOAD 查看源码 这里没有任何过滤,使用htmlspecialchars()过滤 结果不弹窗 MEDIUM: LOW等级的方法不奏效了 观察输出可能是过 ...
- js传输txt文档内容
要求:实现修改text文档内容,即可将text修改内容传到页面显示: HTML: <!doctype html> <html lang="en"> < ...
- eclipse在线安装maven插件
http://blog.csdn.net/xiaoxiaoyeyaya/article/details/17200987 在安装插件的时候将下面的contact all update sites du ...
- 作业 20181127-3 互评Beta版本
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2448 组名:可以低头,但没必要 组长:付佳 组员:张俊余 李文涛 孙赛佳 ...
- “Hello World!”团队第五周第六次会议
“Hello World!”团队第五周第六次会议 博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.checkout& ...
- Daily Scrumming 2015.10.20(Day 1)
一.今明两天任务表 Member Today’s Task Tomorrow’s Task 江昊 购买服务器,搭建服务器,配置服务器端用户与权限管理 配置ruby与rails环境 配置mysql与数据 ...
- SqlServer中的dbo是什么意思
出处:http://andylin02.iteye.com/blog/486296 SqlServer中的dbo是什么意思? DBO是每个数据库的默认用户,具有所有者权限,即DbOwner 通过用DB ...
- 解决nginx+uWSGI部署Django时遇到的static文件404的问题
昨天是利用Django自带的runserver部署的服务器,但是由于runserver比较不稳定,因此决定采用uWSGI+nginx进行部署. 昨天已经安装好了uwsgi和nginx,使用该指令打开8 ...
- angular入门学习文档之一
一.数据双向绑定 angular(下面统一简称ng)强大的地方莫过于它内置的数据双向绑定功能,下面我们通过一个简单的例子来演示ng强大的双向绑定数据的能力. 代码如下: 1.dom结构: 1.< ...