CodeForces 777C Alyona and Spreadsheet【一维数组模拟二维】

During the lesson small girl Alyona works with one famous spreadsheet computer program and learns how to edit tables.

Now she has a table filled with integers. The table consists of n rows and m columns. By ai, j we will denote the integer located at the i-th row and the j-th column. We say that the table is sorted in non-decreasing order in the column j if ai, j ≤ ai + 1, j for all i from 1 to n - 1.

Teacher gave Alyona k tasks. For each of the tasks two integers l and r are given and Alyona has to answer the following question: if one keeps the rows from l to r inclusive and deletes all others, will the table be sorted in non-decreasing order in at least one column? Formally, does there exist such j that ai, j ≤ ai + 1, j for all i from l to r - 1 inclusive.

Alyona is too small to deal with this task and asks you to help!

Input
The first line of the input contains two positive integers n and m (1 ≤ n·m ≤ 100 000) — the number of rows and the number of columns in the table respectively. Note that your are given a constraint that bound the product of these two integers, i.e. the number of elements in the table.

Each of the following n lines contains m integers. The j-th integers in the i of these lines stands for ai, j (1 ≤ ai, j ≤ 109).

The next line of the input contains an integer k (1 ≤ k ≤ 100 000) — the number of task that teacher gave to Alyona.

The i-th of the next k lines contains two integers li and ri (1 ≤ li ≤ ri ≤ n).

Output
Print “Yes” to the i-th line of the output if the table consisting of rows from li to ri inclusive is sorted in non-decreasing order in at least one column. Otherwise, print “No”.

Example
Input
5 4
1 2 3 5
3 1 3 2
4 5 2 3
5 5 3 2
4 4 3 4
6
1 1
2 5
4 5
3 5
1 3
1 5
Output
Yes
No
Yes
Yes
Yes
No
Note
In the sample, the whole table is not sorted in any column. However, rows 1–3 are sorted in column 1, while rows 4–5 are sorted in column 3.

题意:n行m列k个询问,每个询问[L, R]行区间是否存在非递减的列;
分析:
思维性模拟,由于nm范围未定,我用的一维数组存储,模拟的时候(i - 1)/ m + 1来表示二维;

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
typedef long long LL;

const int MAXN = 200000;
int a[MAXN], b[MAXN], c[MAXN];

int main() {
    int n, m;
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= n * m; ++i) {
        scanf("%d", &a[i]);
    }
    for(int j = 0; j < m; ++j) {
        for(int i = 1 + j; i <= n * m; i += m) {
            int L = i, R = i + m;
            while(a[R] >= a[R - m]) {
                R += m;
            }
            i = R - m;
            for(int k = L; k < R; k += m) {
                b[k] = i;
            }
        }
    }
    for(int i = 1; i <= n * m; i += m) {
        int ans = 0;
        for(int j = 0; j < m; ++j) {
            ans = max((b[i + j] - 1)/ m + 1, ans);
        }
        c[(i - 1)/ m + 1] = ans;
    }
    int L, R, k;
    scanf("%d", &k);
    while(k--) {
        scanf("%d %d", &L, &R);
        if(c[L] >= R) puts("Yes");
        else puts("No");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二维数组灯泡开关问题是一个关于矩阵中灯泡状态改变和查询的问题。给定一个n*m的矩阵,矩阵中有一些灯泡,这些灯泡连成了k条互不重叠的链。每个灯泡都有一定的权值w,但只有当灯泡打开时才会产生贡献。有两种操作:①Switch i——表示将编号为i的链所有的灯泡取反(即开变关,关变开)。②Ask x1,y1,x2,y2——表示询问以(x1,y1)和(x2,y2)为两个端点的子矩形所产生的贡献。 根据引用\[2\]的解释,这个问题不适合使用递推的方法解决,因为状态改变会涉及到整个行和列,无法直接递推。而根据引用\[3\]的解释,数据范围较小,可以使用暴力枚举的方法解决。具体来说,我们可以枚举所有的开关状态,共有2^(n*m)种情况,然后判断每种情况下是否能将整个灯泡亮起来。 因此,对于这个问题,可以使用暴力枚举的方法来解决。 #### 引用[.reference_title] - *1* [codeforces 707E Garlands (离线、二维树状数组)](https://blog.csdn.net/dieyi9889/article/details/101867233)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [[枚举] aw116. 飞行员兄弟(二维递推+开关问题+二进制枚举)](https://blog.csdn.net/yl_puyu/article/details/119068619)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值