Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.14 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <cassert>
  7.  
  8. using namespace std;
  9.  
  10. struct Query
  11. {
  12.     int start, stop, l, c;
  13.     int rasp;
  14. };
  15.  
  16. void CalcRasp(vector<Query> &query, const vector<vector<int> > &qOnLine, int n, int m, const vector<string> &a)
  17. {
  18.     vector<vector<vector<int> > > dp(2, vector<vector<int> >(n+1, vector<int>(n + 1, 0)));
  19.     vector<vector<int> > sumCol(n+1, vector<int>(m+1));
  20.     for(int i = 1; i <= n; ++i)
  21.         for(int j = 1; j <= m; ++j)
  22.             sumCol[i][j] = sumCol[i-1][j] + (a[i][j-1] == '1');
  23.     int current = 0, last = 1;
  24.     for(int i = n; i >= 1; --i)
  25.     {
  26.         swap(current, last);
  27.         for(int j = i; j <= n; ++j)
  28.             for(int k = 1; k <= j - i + 1; ++k)
  29.             {
  30.                 if(i < j)
  31.                     dp[current][j][k] = max(dp[current][j-1][k], dp[last][j][k]);
  32.                 else
  33.                     dp[current][j][k] = 0;
  34.                 if(k == j - i + 1)
  35.                 {
  36.                     vector<int> subSecv(m + 1);
  37.                     for(int t = 1; t <= m; ++t)
  38.                     {
  39.                         subSecv[t] = (sumCol[j][t] - sumCol[i-1][t]) == (j - i + 1) ? subSecv[t-1] + 1 : 0;
  40.                         dp[current][j][k] = max(dp[current][j][k], subSecv[t]);
  41.                     }
  42.                 }
  43.             }
  44.         for(auto ind:qOnLine[i])
  45.             query[ind].rasp = (dp[current][query[ind].stop][query[ind].l] >= query[ind].c);
  46.     }
  47. }
  48.  
  49.  
  50. int main()
  51. {
  52.     ifstream in("lcdr.in");
  53.     int n, m, q;
  54.     in >> n >> m >> q;
  55.     vector<string> a(n + 1);
  56.     vector<Query> query(q);
  57.     vector<vector<int> > qOnLine(n + 1); //queryurile cu start = i
  58.     for(int i = 1; i <= n; ++i)
  59.         in >> a[i];
  60.     for(int i = 0; i < q; ++i)
  61.     {
  62.         in >> query[i].l >> query[i].c >> query[i].start >> query[i].stop;
  63.         qOnLine[query[i].start].push_back(i);
  64.     }
  65.     CalcRasp(query, qOnLine, n, m, a);
  66.     in.close();
  67.  
  68.     ofstream out("lcdr.out");
  69.     for(int i = 0; i < q; ++i)
  70.         out << query[i].rasp << "\n";
  71.     out.close();
  72.     return 0;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement