本腊鸡没什么想法,一开始想构建个二维数组淦,但题目给的数据是,爆掉了

于是换个思路:构建两个二维数组分别记录操作及该操作的序号,对查询进行从后搜索


Description

转眼间,奥运走向了尾声。QWQ要策划一场闭幕式演出。

QWQ策划的是一个方阵表演。在表演中,运动员们将排成一个 的方阵,做出各种各样的动作。

方便起见,本题中我们用正整数来指代各种动作。初始时,运动员们都没有动作,记为动作。接下来会发生次事件:

  • QWQ选取方阵的一行 / 一列,并让这一行 / 这一列的运动员们统一做出某个动作;

  • QWQ想知道,现在位于第 行第 列的选手做的是什么动作。

QWQ还忙着其他工作。你能帮帮他,回答他的问题吗?

Input

第一行两个正整数 分别表示需要维护的矩阵的大小和操作的数量。

接下来 行,每行首先是一个字符 ,表示操作的类型。 的取值及对应的意义如下:

  • :这一行接下来两个整数 表示第 行的运动员全部做出 动作。

  • :这一行接下来两个整数 表示第 列的运动员全部做出 动作。

  • :这一行接下来两个整数 你需要回答第行第 列的运动员做了什么动作。

    Output

    对于每组询问输出一个整数表示答案。
#include <stdio.h>

#define LL long long
#define IN freopen("in.txt", "r", stdin)
#define OUT freopen("out.txt", "w", stdout)
#define scan(x) scanf("%d", &x)
#define sqr(x) (x) * (x)
#define f(i, a, b) for (int i = a; i <= b; i++)
#define pn(x) printf("%d", x)
#define pr1(x) printf("Case %d: ", x)
#define pn1(x) printf("Case %d:\n", x)
#define pr2(x) printf("Case #%d: ", x)
#define pn2(x) printf("Case #%d:\n", x)
#define lowbit(x) (x & (-x))
int h[100000][3], l[100000][3], cnth = 0, cntl = 0, cnt = 0;

int check(int x, int y)
{
    int jg = -1, mid = -1;
    for (int j = cntl - 1; j >= 0; j--)
    {
        if (y == l[j][0])
        {
            jg = l[j][1];
            mid = l[j][2];
            break;
        }
    }
    for (int j = cnth - 1; j >= 0; j--)
    {
        if (x == h[j][0])
        {
            if (mid > h[j][2])
            {
                printf("%d\n", jg);
                return 0;
            }
            else
            {
                printf("%d\n", h[j][1]);
                return 0;
            }
        }
    }
    if (jg != -1)
        printf("%d\n", jg);
    else
        printf("0\n");
    return 0;
}

int main()
{
    //IN;
    //OUT;
    int n, q;
    scan(n);
    scan(q);
    f(i, 1, q)
    {
        char c[3];
        scanf("%s", c);
        if (c[0] == 'R')
        {
            int i, v;
            scan(i);
            scan(v);
            h[cnth][2] = cnt++;
            h[cnth][0] = i;
            h[cnth++][1] = v;
        }
        else if (c[0] == 'C')
        {
            int i, v;
            scan(i);
            scan(v);
            l[cntl][2] = cnt++;
            l[cntl][0] = i;
            l[cntl++][1] = v;
        }
        else if (c[0] == 'Q')
        {
            int x, y;
            scan(x);
            scan(y);
            check(x, y);
        }
    }
    return 0;
}
此文章已被阅读次数:正在加载...更新于