Patrickmeme

Pasari - 80p

Mar 23rd, 2023
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.64 KB | None | 0 0
  1. #include <fstream>
  2. using namespace std;
  3.  
  4. ifstream cin("pasari.in");
  5. ofstream cout("pasari.out");
  6.  
  7. #define MAX_LAT 1000
  8. int v[MAX_LAT][MAX_LAT],frv[MAX_LAT][MAX_LAT];
  9. int st[MAX_LAT][MAX_LAT],dr[MAX_LAT][MAX_LAT];
  10. int sus[MAX_LAT][MAX_LAT],jos[MAX_LAT][MAX_LAT];
  11. int grid[MAX_LAT],smen[MAX_LAT];
  12.  
  13. void cons(int lin,int n){
  14.     int poz,col;
  15.     st[lin][0]=1;
  16.     poz=1;
  17.     grid[0]=0;
  18.     for(col=1;col< n;col++){
  19.         if(v[lin][grid[poz-1]]>v[lin][col]){
  20.             st[lin][col]=col-grid[poz-1];
  21.             grid[poz]=col+1;
  22.             poz++;
  23.         }else{
  24.             while(poz>0 && v[lin][grid[poz-1]]<=v[lin][col]){
  25.                 poz--;
  26.             }
  27.             if(poz==0)
  28.                 st[lin][col]=col;
  29.             else
  30.                 st[lin][col]=col-grid[poz-1];
  31.             grid[poz]=col;
  32.             poz++;
  33.         }
  34.     }
  35. }
  36. void cond(int lin,int n){
  37.     int poz,col;
  38.     dr[lin][n-1]=1;
  39.     poz=1;
  40.     grid[0]=n-1;
  41.     for(col=n-2;col>=0;col--){
  42.         if(v[lin][grid[poz-1]]>v[lin][col]){
  43.             dr[lin][col]=grid[poz-1]-col;
  44.             grid[poz]=col;
  45.             poz++;
  46.         }else{
  47.             while(poz>0 && v[lin][grid[poz-1]]<=v[lin][col]){
  48.                 poz--;
  49.             }
  50.             if(poz==0)
  51.                 dr[lin][col]=n-col;
  52.             else
  53.                 dr[lin][col]=grid[poz-1]-col;
  54.             grid[poz]=col;
  55.             poz++;
  56.         }
  57.     }
  58. }
  59. void conjos(int col,int n){
  60.     int poz,lin;
  61.     jos[n-1][col]=1;
  62.     poz=1;
  63.     grid[0]=n-1;
  64.     for(lin=n-2;lin>=0;lin--){
  65.         if(v[grid[poz-1]][col]>v[lin][col]){
  66.             jos[lin][col]=grid[poz-1]-lin;
  67.             grid[poz]=lin;
  68.             poz++;
  69.         }else{
  70.             while(poz>0 && v[grid[poz-1]][col]<=v[lin][col]){
  71.                 poz--;
  72.             }
  73.             if(poz==0)
  74.                 jos[lin][col]=n-lin;
  75.             else
  76.                 jos[lin][col]=grid[poz-1]-lin;
  77.             grid[poz]=lin;
  78.             poz++;
  79.         }
  80.     }
  81. }
  82. void consus(int col,int n){
  83.     int poz,lin;
  84.     sus[0][col]=1;
  85.     poz=1;
  86.     grid[0]=0;
  87.     for(lin=1;lin<n;lin++){
  88.         if(v[grid[poz-1]][col]>v[lin][col]){
  89.             sus[lin][col]=lin-grid[poz-1];
  90.             grid[poz]=lin;
  91.             poz++;
  92.         }else{
  93.             while(poz>0 && v[grid[poz-1]][col]<=v[lin][col]){
  94.                 poz--;
  95.             }
  96.             if(poz==0)
  97.                 sus[lin][col]=lin+1;
  98.             else
  99.                 sus[lin][col]=lin-grid[poz-1];
  100.             grid[poz]=lin;
  101.             poz++;
  102.         }
  103.     }
  104. }
  105. int main()
  106. {
  107.     int cer,n,i,lin,col,max1,ccol,s,l;
  108.     cin>>cer>>n;
  109.     if(cer==1)
  110.         cin>>l;
  111.     for(lin=0;lin<n;lin++)
  112.         for(col=0;col<n;col++)
  113.             cin>>v[lin][col];
  114.     for(i=0;i<n;i++){
  115.             consus(i,n);
  116.             conjos(i,n);
  117.             cons(i,n);
  118.             cond(i,n);
  119.     }
  120.     /*-----debug------
  121.     for(lin=0;lin<n;lin++){
  122.         for(col=0;col<n;col++){
  123.             printf("%d %d: sus %d jos %d dreapta %d stanga %d" ,lin,col,sus[lin][col],jos[lin][col],dr[lin][col],st[lin][col]);
  124.             printf("\n");
  125.         }
  126.     }
  127.     ///-----debug------*/
  128.     if(cer==1){
  129.         lin=l-1;
  130.         max1=ccol=0;
  131.         for(col=0;col<n;col++){
  132.             s=dr[lin][col]+st[lin][col]+jos[lin][col]+sus[lin][col]-3;
  133.             if(s>max1){
  134.                 max1=s;
  135.                 ccol=col+1;
  136.             }
  137.         }
  138.         cout<<ccol;
  139.     }else{
  140.         max1=0;
  141.         for(lin=0;lin<n;lin++){
  142.             for(col=0;col<n;col++){
  143.                 smen[col-st[lin][col]+1]+=1;
  144.                 smen[col+dr[lin][col]]-=1;
  145.             }
  146.             for(col=1;col<n;col++){
  147.                 smen[col]+=smen[col-1];
  148.             }
  149.             for(col=0;col<n;col++){
  150.                 frv[lin][col]+=smen[col];
  151.                 if(frv[lin][col]>max1)
  152.                     max1=frv[lin][col];
  153.                 smen[col]=0;
  154.             }
  155.         }
  156.         for(col=0;col<n;col++){
  157.             for(lin=0;lin<n;lin++){
  158.                 smen[lin-sus[lin][col]+1]+=1;
  159.                 smen[lin+jos[lin][col]]-=1;
  160.             }
  161.             for(lin=1;lin<n;lin++){
  162.                 smen[lin]+=smen[lin-1];
  163.             }
  164.             for(lin=0;lin<n;lin++){
  165.                 frv[lin][col]+=smen[lin];
  166.                 if(frv[lin][col]>max1)
  167.                     max1=frv[lin][col];
  168.                 smen[lin]=0;
  169.             }
  170.         }
  171.         col=lin=0;
  172.         while(frv[lin][col]!=max1){
  173.             col++;
  174.             if(col==n){
  175.                 col=0;
  176.                 lin++;
  177.             }
  178.         }
  179.         cout<<lin+1<<" "<<col+1;
  180.     }
  181.     return 0;
  182. }
Add Comment
Please, Sign In to add comment