-
条件:二维数组区间和
-
题目:无
-
原理:无
-
代码:
/** * mootable */ #include <iostream> #include <iomanip> #include <algorithm> //sort #include <map> #include <queue> #include <deque> //双端队列,头可插,尾可插 #include <string> #include <cstring> #include <stack> #include <cmath> #include <fstream> #include <ctime> #include <climits> //数值的限制范围 //(double)clock() / CLOCKS_PER_SEC <= 0.95 限制0.95s跑完 using namespace std; class Solver { //通用属性 public: Solver() { //取消和c输出输入的同步,加快读取 ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); } //通用方法 public: void SaveCpp(string name) const { fstream input; fstream output; input.open("moota.cpp", ios::in); const string file = name + ".cpp"; output.open(file.c_str(), ios::out); char c = 'O'; while (!input.eof()) { input.get(c); output << c; } input.close(); output.close(); } protected: //待实现方法 virtual void BeginPlay() { }; virtual void Playing() { }; virtual void EndPlay() { }; public: //外观模式 void Play() { BeginPlay(); Playing(); EndPlay(); } }; //和一维前缀和同理,画图永远是最好的老师之一。 class SpecialSolver : public Solver { public: typedef long long lld; static const lld MAX = static_cast<lld>(1e4); static const lld INF = static_cast<lld>(1e18); private: //实例属性 lld n, m, times; private: //实例方法 lld sum2D[MAX][MAX]; protected: virtual void BeginPlay() override { Solver::BeginPlay(); cin >> n >> m >> times; lld pre = 0; for (lld i = 1; i <= n; ++i) { for (lld j = 1; j <= n; ++j) { cin >> pre; sum2D[i][j] = sum2D[i - 1][j] + sum2D[i][j - 1] - sum2D[i - 1][j - 1] + pre; } } }; virtual void Playing() override { Solver::Playing(); lld x1, y1, x2, y2; //(x1<=x2&&y1<=y2) while (times--) { cin >> x1 >> y1 >> x2 >> y2; cout << sum2D[x2][y2] - sum2D[x1 - 1][y2] - sum2D[x2][y1 - 1] + sum2D[x1 - 1][y1 - 1] << "\n"; } }; virtual void EndPlay() override { Solver::EndPlay(); }; }; SpecialSolver specialSolver; int main() { //注意改名字 //specialSolver.SaveCpp("二维前缀和模板"); specialSolver.Play(); }
数据结构与算法-二维前缀和
最新推荐文章于 2024-09-28 15:33:25 发布