Cod sursa(job #2284827)

Utilizator ivan.tudorIvan Tudor ivan.tudor Data 17 noiembrie 2018 17:14:36
Problema Struti Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <iostream>
#include<queue>
#include<cstdio>
#include<string.h>
#include<limits.h>
using namespace std;
priority_queue<int> hmax;
priority_queue<int> hmin;
int frecv[8005];
int mat[1005][1005];
int altmin,nraltmin,n,m;
void rezolva(int l,int c){
  int i,j;
  int altaux;
  int conti;
  for(conti=l;conti<=n;conti++){
    memset(frecv,0,sizeof(frecv));
    hmax=priority_queue<int> ();
    hmin=priority_queue<int> ();
    for(i=conti-l+1;i<=conti;i++){
      for(j=1;j<=c;j++){
        hmax.push(mat[i][j]);
        hmin.push(-mat[i][j]);
        frecv[mat[i][j]]++;
        }
    }
    altaux=hmax.top()+hmin.top();
    if(altmin>altaux){
        altmin=altaux;
        nraltmin=1;
      }
    else{
      if(altmin==altaux)
        nraltmin++;
    }
    for(j=c+1;j<=m;j++){
      for(i=conti-l+1;i<=conti;i++){
        frecv[mat[i][j-c]]--;
        frecv[mat[i][j]]++;
        hmax.push(mat[i][j]);
        hmin.push(-mat[i][j]);
      }
       while(frecv[hmax.top()]==0){
        hmax.pop();
      }
      while(frecv[-hmin.top()]==0){
        hmin.pop();
      }
      altaux=hmax.top()+hmin.top();
      if(altmin>altaux){
        altmin=altaux;
        nraltmin=1;
      }
      else{
        if(altmin==altaux)
          nraltmin++;
      }
    }
  }
}
int main()
{
  FILE*fin,*fout;
  fin=fopen("struti.in","r");
  fout=fopen("struti.out","w");
  int j,p,i;
  fscanf(fin,"%d%d%d",&n,&m,&p);
  for(i=1;i<=n;i++){
    for(j=1;j<=m;j++){
      fscanf(fin,"%d",&mat[i][j]);
    }
  }
  int dx,dy;
  for(i=1;i<=p;i++){
    fscanf(fin,"%d%d",&dx,&dy);
    altmin=INT_MAX;
    nraltmin=0;
    rezolva(dx,dy);
    if(dy!=dx)
      rezolva(dy,dx);
    fprintf(fout,"%d %d\n",altmin,nraltmin);
  }
  return 0;
}