题目链接:http://codeforces.com/problemset/problem/1027/B
思路:
找规律,特判左上角的四个数,由他们可以推出全部的数据。
代码:
//这道题数据范围很大 n 的范围是 1e9 而且是一个二维矩阵
//直接打表肯定内存超限
#include <stdio.h>
typedef long long LL;
int main () {
LL n, m;
while (scanf ("%lld %lld", &n, &m) != EOF) {
while (m --) {
LL sum_1 = 1, sum_2 = (n % 2 == 0 ? (n * n / 2) : ((n * n + 1) / 2)) + 1;
LL sum_4 = (n % 2 == 0 ? (n / 2 + 1) : ((n + 1) / 2 + 1));
LL sum_3 = sum_2 + (n % 2 == 0 ? (n / 2) : ((n - 1) / 2));
// printf ("%lld %lld %lld %lld\n", sum_1, sum_2, sum_3,sum_4);
LL x, y;
scanf ("%lld %lld", &x, &y);
if (x <= 2 && y <= 2) {
if (x == 1 && y == 1) printf ("%lld\n", sum_1);
if (x == 1 && y == 2) printf ("%lld\n", sum_2);
if (x == 2 && y == 1) printf ("%lld\n", sum_3);
if (x == 2 && y == 2) printf ("%lld\n", sum_4);
continue;
}
if (y % 2) {
sum_1 += (y - 1) / 2;
sum_3 += (y - 1) / 2;
if (x % 2) {
sum_1 += ((x - 1) / 2) * n;
printf ("%lld\n", sum_1);
}
else {
sum_3 += (x / 2 - 1) * n;
printf ("%lld\n", sum_3);
}
}
else {
sum_2 += y / 2 - 1;
sum_4 += y / 2 - 1;
if (x % 2) {
sum_2 += ((x - 1) / 2) * n;
printf ("%lld\n", sum_2);
}
else {
sum_4 += (x / 2 - 1) * n;
printf ("%lld\n", sum_4);
}
}
}
}
return 0;
}