Codeforces-777C. Alyona and Spreadsheet

Posted xFANx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于Codeforces-777C. Alyona and Spreadsheet的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 740A Alyona and copybooks

codeforces 777 A

codeforces 777 B

Codeforces 777D:Cloud of Hashtags(水题)

Codeforces 777A Shell Game

Codeforces 682C Alyona and the Tree (树上DFS+DP)