[计蒜客] n 子棋

Posted kaike

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[计蒜客] n 子棋相关的知识,希望对你有一定的参考价值。

 n 子棋

Description

小 A 和小 B 在玩 nn 子棋, nn 子棋游戏的规则是,两人在一个左上角是 (1,1)(1,1),右下角是 (n,n)(n,n) 的 n imes nn×n 棋盘中交替落子,只要有一方的 nn 个棋子在同一行或者同一列或者同一条对角线上,对方就输了。

游戏由小 A 先手,一共进行了 mm 回合,请你来当裁判,帮他们裁定胜负。

游戏结束的条件是:

  • 出现胜负;
  • 所有回合结束。

一旦满足上述任意一个条件,游戏立即结束,后续回合无效。

Input

第一行两个整数 n,mn,m ,表示棋盘大小和回合数 。

接下来 mm 行,每行两个数 x,yx,y,表示当前轮到的人会在第 xx 行第 yy 列放一个棋子。

output

输出一行,包含一个整数 xx ,表示游戏结束的回合,和一个字符串 SS 表示游戏结果,用一个空格隔开。

若小 A 赢了 SS 为"milk!";小 B 赢了 SS 为"juice!";否则 SS 为"drawn!"

 

对于前 10\%10% 的数据,保证 n=1n=1;

对于前 30\%30% 的数据,保证 1leq n leq 21n2;

对于前 70\%70% 的数据,保证 1leq n leq 501n50;

对于前 90\%90% 的数据,保证 1leq nleq 5001n500;

对于 100\%100% 的数据,保证 1leq nleq 10^5, 0leq m leq min(3 imes 10^5, n^2)1n105,0mmin(3×105,n2)。

保证最初棋盘是空的且游戏结束前所有操作均合法。

Examples

Input

2 4
1 1
2 2
2 1
1 2

Output

3 milk!

正确解法:

对每行、每列,两条对角线各用一个变量维护(初值为0) ,

轮到小 A 就++对应变量、轮到小 B 则--,同时检查对应变量绝对值是否为 n。

技术图片
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<string>
 6 using namespace std;
 7 const int N=100000+100;
 8 int n,m,x,y;
 9 int a[N]={0},b[N]={0},cnt1=0,cnt2=0;
10 int f=1;
11 int main()
12 {
13     cin>>n>>m;
14     for(int i=1;i<=m;i++,f=-f)
15     {
16         cin>>x>>y;
17         a[x]+=f;
18         b[y]+=f;
19         if(x==y)
20             cnt1+=f;
21         if(x==n-y+1)
22             cnt2+=f;
23         if(abs(a[x])==n||abs(b[y])==n||abs(cnt1)==n||abs(cnt2)==n)
24         {    cout<<i<<" ";
25             if(f==1)    cout<<"milk!"<<endl;
26              else cout<<"juice!"<<endl;
27               return 0;
28         }
29     }
30     cout<<m<<" "<<"drawn!"<<endl;
31     return 0;
32 }
View Code

 

 

以上是关于[计蒜客] n 子棋的主要内容,如果未能解决你的问题,请参考以下文章

计蒜客 17414 Exponial 指数降幂公式

计蒜客练习题:互质数个数

计蒜客--蒜头君开公司

计蒜客 身高接近

计蒜客 蒜头君的数轴

计蒜客 蓝桥模拟 B.素数个数