Educational Codeforces Round 28 D. Monitor

题意:给出个n*m的矩阵,然我们求什么时候我们可以得到一个k*k的全坏矩阵,给出q个坐标和他们坏的时间

思路:RQM预处理

 1 #include<bits/stdc++.h>
 2 typedef long long ll;
 3 using namespace std;
 4 const ll INF=1e18;
 5 
 6 ll d[503][503];
 7 ll dp[503][503];
 8 ll c[503][503];
 9 int n,m,k,q;
10 
11 int kk;
12 void hh(int x){
13     for(int i=0;i<m;i++)
14         dp[i][0]=d[x][i];
15     for(int j=1;(1<<j)<=m;j++)
16         for(int i=0;i+(1<<j)-1<m;i++)
17         dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
18     for(int i=0;i<=m-k;i++)
19         c[x][i]=max(dp[i][kk],dp[i+k-(1<<kk)][kk]);
20 }
21 
22 int RMQ(int l,int r){
23     int kk=0;
24     while((1<<(kk+1))<=r-l+1) kk++;
25     return kk;;
26 }
27 
28 int main(){
29     cin>>n>>m>>k>>q;
30     kk=RMQ(1,k);
31     for(int i=0;i<n;i++)
32         for(int j=0;j<m;j++) d[i][j]=INF;
33     for(int i=1;i<=q;i++){
34         int x,y;ll t;
35         scanf("%d%d%lld",&x,&y,&t);
36         d[x-1][y-1]=t;
37     }
38     for(int i=0;i<n;i++)
39         hh(i);
40     ll MMax=INF;
41     for(int i=0;i<=n-k;i++){
42         for(int j=0;j<=m-k;j++){
43             ll Max=-1;
44             for(int kk=i;kk<=i+k-1;kk++){
45                  Max=max(Max,c[kk][j]);
46                  if(Max==INF) break;
47             }
48             MMax=min(MMax,Max);
49         }
50     }
51     if(MMax==INF) cout<<-1<<endl;
52     else cout<<MMax<<endl;
53 }

 

posted on 2017-09-08 14:53  hhhhx  阅读(112)  评论(0编辑  收藏  举报

导航