
Examples
input
4 5
1 1
4 4
4 3
3 2
2 4
output
1
8
16
13
4
input
5 4
2 1
4 2
3 3
3 4
output
16
9
7
20
题意:有一个n*n的方格,先给行(i)、列(j)相加为偶数的格子依次填上编号,再给行列相加为奇数的格子填上编号。现要求某行某列的方格中填的数是多少。
分析:看懂了题目就能做了,并不知道为什么有人会WA。注意这里要用long long。
下面贴代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <string>
#include <map>
#define ll long long
using namespace std;
int main()
{
ll n;
int q;
scanf("%I64d%d",&n,&q);
ll x1=n/2+(n%2==1?1:0);
ll x2=n/2;
ll en=(x1+x2)*(n/2)+(n%2==1?x1:0); //最后一个偶数格子里填的数
ll x,y;
while(q--)
{
scanf("%I64d%I64d",&x,&y);
if((x+y)%2==0)
{
ll num=(x1+x2)*((x-1)/2)+((x-1)%2==1?x1:0);
if(x%2==1)
num+=(y+1)/2;
else
num+=y/2;
printf("%I64d\n",num);
}
else
{
ll num=en+(x1+x2)*((x-1)/2)+((x-1)%2==1?x2:0);
if(x%2==1)
num+=y/2;
else
num+=(y+1)/2;
printf("%I64d\n",num);
}
}
return 0;
}
本文介绍了一个针对n*n矩阵的特殊填充算法,该算法首先按行和列相加为偶数的条件进行编号填充,随后填充其余格子。通过具体实例展示了输入输出样例,并提供了一段C++代码实现,用于求解特定位置的编号。
1294

被折叠的 条评论
为什么被折叠?



