ACdream 1082 闪电战【细节】

最近北航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
#include
#include
#include
#include
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
*/

你可能感兴趣的:(Mathematics)