CF-777C Alyona and Spreadsheet

Problem Description
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

不能挨个搜,到第六十个就会Tl;
事先查找每行(i)能按非递减顺序到达的最大行序号b【i】,但是要做一定的优化,就是记住每一列(j)已经按非递减序到达的最大行数c【j】,如果测试这列的时候行数(i)小于这个最大值c【j】,则这个最大值就是i在此列能到达的最大行,再拿它来和原来的最大行做比较,大的赋值给b【i】。

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int b[100010]={0},c[100010]={0};
int main()
{
    int l,r,row,con,n,k;int i,j;
    cin>>row>>con;
    int a[row+10][con+10]={0};
    for( i=1;i<=row;i++)
        for( j=1;j<=con;j++){
            cin>>a[i][j];
        }
    for( i=1;i<=row;i++)
    for( j=1;j<=con;++j){
        k=i;
        if(i<=c[j]) k=c[j];
        else
            while(a[k][j]<=a[k+1][j]&&k<row) k++;
        b[i]=max(b[i],k);//从i行开始以非递减序能到达的最大行序号
        c[j]=k;//第j列非递减序到达的最大行号
    }
    cin>>n;
    for(int k=1;k<=n;k++){
        cin>>l>>r;
        if(b[l]>=r)
            cout<<"Yes\n";
        else
            cout<<"No\n";
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值