どこでもドア:http://codeforces.com/problemset/problem/777/C
开始以为是动态规划,不过要查找的时候就不知道怎么做了,普通搜 的话到第100组测试数据超时了。 方法:
用二维数组d[i][j]存每一列到第i行递增开始的行数。如果让要查询l,r,只要满足r行最小的那个开始递增的行数<=l就是YES 比如对应题中的数据所得到的d[i][j]:
1 1 1 1 1 2 1 2 1 2 3 2 1 2 3 4 5 5 3 4直接用数组的话会超内存。用别的容器就会有很多方法。
code:
typedef long long LL; const int INF = 0x3f3f3f3f; const double PI=acos(-1); const double cha=10e-8; const int MAX = 100000; int n,m,a,b,mem[MAX],d[MAX],ans[MAX]; int main(){ scanf("%d%d",&n,&m); for(int i=0;i<n;i++){ int minx=INF; for(int j=0;j<m;j++){ scanf("%d",&a); if(i==0){ mem[j]=a; d[j]=1; } else{ if(a<mem[j]) d[j]=i+1; mem[j]=a; } if(minx>d[j]) minx=d[j]; } ans[i]=minx; } scanf("%d",&n); while(n--){ scanf("%d%d",&a,&b); if(ans[b-1]<=a) printf("Yes\n"); else printf("No\n"); } return 0; }