zoukankan      html  css  js  c++  java
  • Codeforces 777C

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

    题意:

    给定 $n imes m$ 的一个数字表格,给定 $k$ 次查询,要你回答是否存在某一列 $j$,其对应于询问区间 $[l,r]$ 的 $a[l][j], a[l+1][j], cdots, a[r][j]$ 这个序列,是否为非递减的。

    题解:

    考虑 $f[i][j]$ 表示只考虑第 $j$ 列的情况下,以 $a[i][j]$ 为末尾的单调不减序列的最长长度,这个很容易求出来。

    那么,我们对于某一行 $i$,已经可以知道 $f[i][1],f[i][2], cdots, f[i][m]$ 这些值了,求出它们的最大值 $mx[i]$,这个值即对应一个查询 $[l,r]$,在确定下端为 $r$ 的情况下,其上端最长可以延伸多远。

    时间复杂度为 $O(nm+k)$。

    AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int SIZE=1e5+5;
    int n,m,q;
    int a[SIZE],f[SIZE],mx[SIZE];
    inline idx(int x,int y){return x*m+y;}
    inline x(int idx){return idx/m;}
    inline y(int idx){return idx%m;}
    int main()
    {
        ios::sync_with_stdio(0);
        cin.tie(0), cout.tie(0);
    
        cin>>n>>m;
        for(int i=0;i<n;i++)
        {
            mx[i]=1;
            for(int j=0;j<m;j++)
            {
                cin>>a[idx(i,j)];
    
                if(i==0 || a[idx(i-1,j)]>a[idx(i,j)]) f[idx(i,j)]=1;
                else f[idx(i,j)]=f[idx(i-1,j)]+1;
    
                mx[i]=max(mx[i],f[idx(i,j)]);
            }
        }
    
        cin>>q;
        int l,r;
        while(q--)
        {
            cin>>l>>r; l--,r--;
            if(mx[r]>=r-l+1) cout<<"Yes
    ";
            else cout<<"No
    ";
        }
    }
  • 相关阅读:
    学习进度三
    开课博客之个人介绍
    个人作业--数组
    学习进度二
    开学第一次测试
    实现点击不同的按钮加载不同的css
    Web存储
    HTML5(常用的表单控件)
    JS(获得当前时间并且用2015-01-01格式表示)
    JS(event事件)
  • 原文地址:https://www.cnblogs.com/dilthey/p/10472974.html
Copyright © 2011-2022 走看看