最近北航ACM队内看是流行一款叫做RUSE的即时策略游戏,这款游戏的迷人之处就在于真真假假虚虚实实,对抗性很强。Sbihero是这方面的达人,因为他为了这个游戏构造了一个合适的模型:
将整个战场可以视为为n*m的一个矩阵,每个元素值都代表着这一区域内的战力值,正值代表己方的战力,负值代表敌方的战力,零表示无军事力量。
而Sbihero最喜欢用的国家德国还有一项特殊的战术——闪电战。闪电战必须在一个连续的区域内发动,动员这一区域内的全部己方军事力量向敌方进攻。如果此区域己方的战力总和大于敌方的战力总和,那么这场闪电战就记为胜利,否则为失败。结果即为己方战力和敌方战力的差值。
现在Sbihero算数算不过来了…他麻烦你来写一个程序,计算在已知战场上任意一连续区域内发动闪电战的结果。(每个连续区域用一个封闭的顺时针折线来围成)如下图区域:
可以表示为(6,2)–>(8,2)–>(8,8)–>(2,8)–>(2,4)–>(4,4)–>(4,6)–>(6,6)–>(6,2)
Input
输入第一行为数据组数t(t<=20)。
对于每组数据,第一行包含两个整数X,Y(1
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1e3 + 10;
int a[maxn][maxn];
int dp[maxn][maxn];
int tx[maxn];
int ty[maxn];
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
memset(dp, 0, sizeof(dp));
memset(a, 0, sizeof a);
int x, y;
scanf("%d %d", &x, &y);
for (int i = 1; i <= y; i++)
{
for (int j = 1; j <= x; j++)
{
scanf("%d", &a[i][j]);
}
}
dp[1][1] = a[1][1];
/*for (int i = 1; i <= y; i++)
{
dp[i][1] = dp[i - 1][1] + a[i][1];
}
for (int i = 1; i <= x; i++)
{
dp[1][i] = dp[1][i - 1] + a[1][i];
}*/
for (int i = 1; i <= y; i++)
{
for (int j = 1; j <= x; j++)
{
dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + a[i][j];
}
}
/* cout << endl;
for (int i = 1; i <= y; i++)
{
for (int j = 1; j <= x; j++)
{
cout << dp[i][j] << " ";
}
cout << endl;
}*/
/*cout << dp[0][1] << endl;
cout << dp[5][6] << endl;*/
//cout << dp[6][7] << endl;
//cout << dp[1][2] << endl;
//cout << dp[9][9] << endl;
int k;
scanf("%d", &k);
while (k--)
{
long long int ans = 0;
/*memset(tx, 0, sizeof tx);
memset(ty, 0, sizeof ty);*/
int T;
scanf("%d", &T);
for (int i = 0; i < T; i++)
{
scanf("%d %d", &ty[i], &tx[i]);//excuse me????
//tx[i]--;
//ty[i]--;
}
//ans -= dp[tx[0]][ty[0]];
tx[T] = tx[0];
ty[T] = ty[0];
/*for (int i = 0; i <= T; i++)
{
cout << tx[i] << " " << ty[i] << " ";
}
cout << endl;*/
for (int i = 1; i <= T; i++)
{
if (ty[i] == ty[i - 1])
{
if (tx[i] - tx[i - 1] > 0)
{
ans += 1LL * (dp[tx[i]][ty[i]] - dp[tx[i - 1]][ty[i - 1]]);
}
else if (tx[i] - tx[i - 1] < 0)
{
ans -= 1LL * (dp[tx[i - 1]][ty[i - 1]] - dp[tx[i]][ty[i]]);
}
}
//cout << ans << endl;
}
/*if (tx[T - 1] - tx[0] < 0)
{
ans += 1ll * dp[tx[0]][ty[0]];
}
else if (tx[T - 1] - tx[0] > 0)
{
ans -= 1ll * dp[tx[0]][ty[0]];
}*/
printf("%lld\n", ans);
}
}
//system("pause");
return 0;
}
/*
2
10 9
0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 0 0 0
0 0 0 0 0 1 -1 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
2
8 6 2 8 2 8 8 2 8 2 4 4 4 4 6 6 6
10 5 3 7 3 7 6 4 6 4 4 5 4 5 5 6 5 6 4 5 4
10 9
0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 0 0 0
0 0 0 0 0 1 -2 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
2
8 6 2 8 2 8 8 2 8 2 4 4 4 4 6 6 6
10 5 3 7 3 7 6 4 6 4 4 5 4 5 5 6 5 6 4 5 4
*/