zoukankan      html  css  js  c++  java
  • codeforces 777C.Alyona and Spreadsheet 解题报告

    题目链接:http://codeforces.com/problemset/problem/777/C

    题目意思:给出一个 n * m 的矩阵,然后问 [l, r] 行之间是否存在至少一列是非递减序列

    解析:

    (1)原输入: 

       ——》  

    (2)统计第 i 行里第 j 列 的最长非递减序列数

    ——》

    (3)每列非递减序列在第 i 行的最长值

         

    然后有两种方法:  二维数组 和 一维数组的处理。个人偏向一维数组

    方法 一 (一维数组)

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 using namespace std;
     6 
     7 /*  一维数组做法
     8 (1)up[0-m]:上一行输入数,每输入一行更新一次
     9 (2)cnt[0-m]: 如果当前输入数 a 与 up[0-m] 构成非递减序列,则cnt[0-m]累加1   (if  a >= up[x], cnt[x]=cnt[x-1]+1   0 < x < n)
    10 (3)max_row[j]:每列非递减序列在第 j 行的最长值
    11 */
    12 
    13 const int maxn = 1e5 + 5;
    14 int up[maxn];
    15 int cnt[maxn], max_row[maxn];
    16 
    17 
    18 int main()
    19 {
    20     #ifndef ONLINE_JUDGE
    21         freopen("in.txt", "r", stdin);
    22     #endif // ONLINE_JUDGE
    23 
    24     int n, m;
    25     while (scanf("%d%d", &n, &m) !=EOF) {
    26         memset(cnt, 0, sizeof(cnt));
    27         memset(max_row, 0, sizeof(max_row));
    28 
    29         for (int i = 0; i < m; i++) {    // 第 1 行
    30             scanf("%d", &up[i]);
    31             max_row[i] = cnt[i] = 1;
    32         }
    33 
    34         int a;    // 第 2 行 ~ 第 n 行
    35         for (int i = 1; i < n; i++) {
    36             for (int j = 0; j < m; j++) {
    37                 scanf("%d", &a);
    38                 cnt[j] = (a >= up[j] ? cnt[j]+1 : 1);
    39                 up[j] = a;    // 更新
    40                 max_row[i] = max(max_row[i], cnt[j]);
    41             }
    42         }
    43     
    44         int k, l, r;
    45         scanf("%d", &k);
    46         while (k--) {
    47             scanf("%d%d", &l, &r);
    48             printf("%s
    ", max_row[r-1] >= r-l+1 ? "Yes" : "No");
    49         }
    50     }
    51     return 0;
    52 }
    View Code

    方法二 (二维数组)

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <vector>
     6 using namespace std;
     7 
     8 int main()
     9 {
    10     #ifndef ONLINE_JUDGE
    11         freopen("in.txt", "r", stdin);
    12     #endif // ONLINE_JUDGE
    13 
    14     int n, m;
    15     while (scanf("%d%d", &n, &m) !=EOF) {
    16         vector<vector<int> > a, cnt;
    17         a.resize(n);
    18         cnt.resize(n);
    19         for (int i = 0; i < n; i++) {
    20             a[i].resize(m);
    21             cnt[i].resize(m);
    22             for (int j = 0; j < m; j++) {
    23                 scanf("%d", &a[i][j]);
    24             }
    25         }
    26 
    27         for (int i = 0; i < m; i++) {
    28             cnt[0][i] = 1;
    29             for (int j = 1; j < n; j++) {
    30                 cnt[j][i] = (a[j][i] >= a[j-1][i] ? cnt[j-1][i]+1 : 1);
    31             }
    32         }
    33         int maxr[100005];
    34         for (int i = 0; i < n; i++) {
    35             maxr[i] = 0;
    36             for (int j = 0; j < m; j++) {
    37                 maxr[i] = max(maxr[i], cnt[i][j]);
    38             }
    39         }
    40         int k, l, r;
    41         scanf("%d", &k);
    42         for (int i = 0; i < k; i++) {
    43             scanf("%d%d", &l, &r);
    44             printf("%s
    ", r-l+1 <= maxr[r-1] ? "Yes" : "No");
    45         }
    46     }
    47     return 0;
    48 }
    View Code
  • 相关阅读:
    118/119. Pascal's Triangle/II
    160. Intersection of Two Linked Lists
    168. Excel Sheet Column Title
    167. Two Sum II
    172. Factorial Trailing Zeroes
    169. Majority Element
    189. Rotate Array
    202. Happy Number
    204. Count Primes
    MVC之Model元数据
  • 原文地址:https://www.cnblogs.com/windysai/p/6911942.html
Copyright © 2011-2022 走看看