Codeforces-777C. Alyona and Spreadsheet

传送门

 

n*m维矩阵,Q次询问,查询行数为[l,r]的矩阵内是否有某一列满足自上而下数据非减

其中1 ≤ n·m ≤ 100 000

 

对于某一行的任一列,记录其对应能满足数据非减的最小行(B[i][j]),进而得出每一行能满足条件的最小行(bst[i]),查询时判断bst[r]与l的关系即可

显然当aij>a(i-1)j,B[i][j]=B[i-1][j], 否则B[i][j]=i;

在每一行结束时记录下bst[i],就可以重复利用数组B了,只使用一维数组了

 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #define INF 0x3f3f3f3f
 6 #define MOD 1000000007
 7 using namespace std;
 8 typedef long long LL;
 9 
10 int N, M, Q;
11 const int maxn = 1e5 + 10;
12 int A[3][maxn];
13 int B[maxn];
14 int bst[maxn];
15 
16 int main() {
17     for (int j = 1; j <= M; j++) {
18         B[j] = 1;
19     }
20     scanf("%d%d", &N, &M);
21     for (int i = 1; i <= N; i++) {
22         int t = i & 1;
23         for (int j = 1; j <= M; j++) {
24             scanf("%d", &A[t][j]);
25         }
26         for (int j = 1; j <= M; j++) {
27             B[j] = A[t][j] >= A[!t][j] ? B[j] : i;
28         }
29         bst[i] = N + 1;
30         for (int j = 1; j <= M; j++) {
31             bst[i] = min(bst[i], B[j]);
32         }
33     }
34     scanf("%d", &Q);
35     int dn, up;
36     while (Q--) {
37         scanf("%d%d", &dn, &up);
38         if (bst[up] <= dn) {
39             puts("Yes");
40         } else {
41             puts("No");
42         }
43     }
44     return 0;
45 }

 

posted @ 2018-02-04 15:14  xFANx  阅读(302)  评论(0编辑  收藏  举报