Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <vector>
- #include <algorithm>
- #include <cassert>
- using namespace std;
- struct Query
- {
- int start, stop, l, c;
- int rasp;
- };
- void CalcRasp(vector<Query> &query, const vector<vector<int> > &qOnLine, int n, int m, const vector<string> &a)
- {
- vector<vector<vector<int> > > dp(2, vector<vector<int> >(n+1, vector<int>(n + 1, 0)));
- vector<vector<int> > sumCol(n+1, vector<int>(m+1));
- for(int i = 1; i <= n; ++i)
- for(int j = 1; j <= m; ++j)
- sumCol[i][j] = sumCol[i-1][j] + (a[i][j-1] == '1');
- int current = 0, last = 1;
- for(int i = n; i >= 1; --i)
- {
- swap(current, last);
- for(int j = i; j <= n; ++j)
- for(int k = 1; k <= j - i + 1; ++k)
- {
- if(i < j)
- dp[current][j][k] = max(dp[current][j-1][k], dp[last][j][k]);
- else
- dp[current][j][k] = 0;
- if(k == j - i + 1)
- {
- vector<int> subSecv(m + 1);
- for(int t = 1; t <= m; ++t)
- {
- subSecv[t] = (sumCol[j][t] - sumCol[i-1][t]) == (j - i + 1) ? subSecv[t-1] + 1 : 0;
- dp[current][j][k] = max(dp[current][j][k], subSecv[t]);
- }
- }
- }
- for(auto ind:qOnLine[i])
- query[ind].rasp = (dp[current][query[ind].stop][query[ind].l] >= query[ind].c);
- }
- }
- int main()
- {
- ifstream in("lcdr.in");
- int n, m, q;
- in >> n >> m >> q;
- vector<string> a(n + 1);
- vector<Query> query(q);
- vector<vector<int> > qOnLine(n + 1); //queryurile cu start = i
- for(int i = 1; i <= n; ++i)
- in >> a[i];
- for(int i = 0; i < q; ++i)
- {
- in >> query[i].l >> query[i].c >> query[i].start >> query[i].stop;
- qOnLine[query[i].start].push_back(i);
- }
- CalcRasp(query, qOnLine, n, m, a);
- in.close();
- ofstream out("lcdr.out");
- for(int i = 0; i < q; ++i)
- out << query[i].rasp << "\n";
- out.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement