Advertisement
Guest User

Untitled

a guest
Feb 27th, 2020
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.77 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <omp.h>
  3.  
  4. using namespace std;
  5.  
  6. class CFabricData;
  7. class CFabricData0;
  8. class CFabricData1;
  9.  
  10. time_t t1, t2;
  11.  
  12. class CComplexVector
  13. {
  14. public:
  15.     CComplexVector() {
  16.         sz = 0;
  17.         arr.resize(0);
  18.     }
  19.  
  20.     CComplexVector(const vector <pair <int, int> > & mas) {
  21.         sz = mas.size();
  22.         arr.resize(sz);
  23.         for (size_t i = 0; i < sz; ++i) {
  24.             arr[i] = mas[i];
  25.         }
  26.     }
  27.  
  28.     CComplexVector(const CComplexVector& obj) {
  29.         sz = obj.sz;
  30.         arr.resize(sz);
  31.         for (size_t i = 0; i < sz; ++i) {
  32.             arr[i] = obj.arr[i];
  33.         }
  34.     }
  35.  
  36.     CComplexVector(int sz_, pair <int, int> comp) {
  37.         sz = sz_;
  38.         arr.resize(sz);
  39.         for (size_t i = 0; i < sz; ++i) {
  40.             arr[i] = comp;
  41.         }
  42.     }
  43.  
  44.     virtual ~CComplexVector() {
  45.         arr.resize(0);
  46.     }
  47.  
  48.     static CComplexVector* create (int Type, vector <pair <int, int> > vec, string Filename_, CFabricData** f);
  49.  
  50.     CComplexVector& operator=( const CComplexVector & obj) {
  51.         if (this == &obj) {
  52.             return *this;
  53.         }
  54.         sz = obj.sz;
  55.         arr.resize(sz);
  56.         for (size_t i = 0; i < sz; ++i)
  57.             arr[i] = obj.arr[i];
  58.         return *this;
  59.     }
  60.  
  61.     friend ostream & operator << (ostream &out, const CComplexVector & obj) {
  62.         out << obj.sz << endl;
  63.         for (size_t i = 0; i < obj.sz; ++i) {
  64.             out << obj.arr[i].first << ' ' << obj.arr[i].second << endl;
  65.         }
  66.         return out;
  67.     }
  68.  
  69.     virtual void output (string Filename_) = 0;
  70.     virtual string get_name() = 0;
  71.  
  72. protected:
  73.     vector <pair <int, int> > arr;
  74.     int sz;
  75. };
  76.  
  77. class CComplexVector0:public CComplexVector {
  78. public:
  79.     CComplexVector0(const vector <pair <int, int> >&x, string Filename_) : CComplexVector(x), Filename(Filename_) {}
  80.     CComplexVector0(string Filename_) : CComplexVector(), Filename(Filename_) {}
  81.     CComplexVector0(const CComplexVector0& obj) : CComplexVector(obj.arr),  Filename{obj.Filename} {}
  82.     CComplexVector0(int sz_, pair <int, int> comp, string Filename_) : CComplexVector(sz_, comp), Filename(Filename_) {}
  83.  
  84.     CComplexVector0 operator- (const CComplexVector0 &obj) {
  85.         int new_sz = max(obj.sz, sz);
  86.         vector <pair <int, int> > vec(new_sz);
  87.         for (size_t i = 0; i < new_sz; ++i) {
  88.             if (obj.sz > i && sz > i) {
  89.                 vec[i].first = arr[i].first - obj.arr[i].first;
  90.                 vec[i].second = arr[i].second - obj.arr[i].second;
  91.             } else if (obj.sz > i) {
  92.                 vec[i].first = -obj.arr[i].first;
  93.                 vec[i].second = -obj.arr[i].second;
  94.             } else {
  95.                 vec[i].first = arr[i].first;
  96.                 vec[i].second = arr[i].second;
  97.             }
  98.         }
  99.         CComplexVector0 res(vec, this->Filename);
  100.         return res;
  101.     }
  102.  
  103.     CComplexVector0 operator+ (const CComplexVector0 &obj) {
  104.         int new_sz = max(obj.sz, sz);
  105.         vector <pair <int, int> > vec(new_sz);
  106.         for (size_t i = 0; i < new_sz; ++i) {
  107.             if (obj.sz > i && sz > i) {
  108.                 vec[i].first = obj.arr[i].first + arr[i].first;
  109.                 vec[i].second = obj.arr[i].second + arr[i].second;
  110.             } else if (obj.sz > i) {
  111.                 vec[i].first = obj.arr[i].first;
  112.                 vec[i].second = obj.arr[i].second;
  113.             } else {
  114.                 vec[i].first = arr[i].first;
  115.                 vec[i].second = arr[i].second;
  116.             }
  117.         }
  118.         CComplexVector0 res(vec, this->Filename);
  119.         return res;
  120.     }
  121.  
  122.     CComplexVector0& operator+= (const CComplexVector0 &obj) {
  123.         *this = *this + obj;
  124.         return *this;
  125.     }
  126.  
  127.     CComplexVector0& operator-= (const CComplexVector0 &obj) {
  128.         *this = *this - obj;
  129.         return *this;
  130.     }
  131.  
  132.     CComplexVector0 operator* (const CComplexVector0 &obj) {
  133.         int new_sz = max(obj.sz, sz);
  134.         vector <pair <int, int> > vec(new_sz);
  135.         #pragma omp parallel for
  136.         for (size_t i = 0; i < min(obj.sz, sz); ++i) {
  137.             pair <int, int> tmp = obj.arr[i];
  138.             vec[i].first = arr[i].first * tmp.first - arr[i].second * tmp.second;
  139.             vec[i].second = arr[i].first * tmp.second + arr[i].second * tmp.first;
  140.         }
  141.         for (size_t i = min(obj.sz, sz); i < max(obj.sz, sz); ++i)
  142.             vec[i] = {0, 0};
  143.         CComplexVector0 res(vec, this->Filename);
  144.         return res;
  145.     }
  146.  
  147.     CComplexVector0& operator*= (const CComplexVector0 &obj) {
  148.         *this = *this * obj;
  149.         return *this;
  150.     }
  151.  
  152.     virtual string get_name() {
  153.         return this->Filename;
  154.     }
  155.  
  156.     virtual void output (string Filename_) {
  157.         ofstream out;
  158.         out.open(Filename_.c_str(), ofstream::out | ofstream::app);
  159.         out << sz << ' ';
  160.         for (size_t i = 0; i < sz; ++i) {
  161.             out << arr[i].first << ' ' << arr[i].second << ' ';
  162.         }
  163.         out.close();
  164.     }
  165.  
  166. private:
  167.     string Filename;
  168. };
  169.  
  170.  
  171. class CComplexVector1:public CComplexVector {
  172. public:
  173.     CComplexVector1(const vector <pair <int, int> >&x, string Filename_) : CComplexVector(x), Filename(Filename_) {}
  174.     CComplexVector1(string Filename_) : CComplexVector(), Filename(Filename_) {}
  175.     CComplexVector1(const CComplexVector1& obj, string Filename_) : CComplexVector(obj), Filename(Filename_) {}
  176.     CComplexVector1(int sz_, pair <int, int> comp, string Filename_) : CComplexVector(sz_, comp), Filename(Filename_) {}
  177.  
  178.     CComplexVector1 operator- (const CComplexVector1 &obj) {
  179.         int new_sz = max(obj.sz, sz);
  180.         vector <pair <int, int> > vec(new_sz);
  181.         for (size_t i = 0; i < new_sz; ++i) {
  182.             if (obj.sz > i && sz > i) {
  183.                 vec[i].first = arr[i].first - obj.arr[i].first;
  184.                 vec[i].second = arr[i].second - obj.arr[i].second;
  185.             } else if (obj.sz > i) {
  186.                 vec[i].first = -obj.arr[i].first;
  187.                 vec[i].second = -obj.arr[i].second;
  188.             } else {
  189.                 vec[i].first = arr[i].first;
  190.                 vec[i].second = arr[i].second;
  191.             }
  192.         }
  193.         CComplexVector1 res(vec, this->Filename);
  194.         return res;
  195.     }
  196.  
  197.     CComplexVector1 operator+ (const CComplexVector1 &obj) {
  198.         int new_sz = max(obj.sz, sz);
  199.         vector <pair <int, int> > vec(new_sz);
  200.         for (size_t i = 0; i < new_sz; ++i) {
  201.             if (obj.sz > i && sz > i) {
  202.                 vec[i].first = obj.arr[i].first + arr[i].first;
  203.                 vec[i].second = obj.arr[i].second + arr[i].second;
  204.             } else if (obj.sz > i) {
  205.                 vec[i].first = obj.arr[i].first;
  206.                 vec[i].second = obj.arr[i].second;
  207.             } else {
  208.                 vec[i].first = arr[i].first;
  209.                 vec[i].second = arr[i].second;
  210.             }
  211.         }
  212.         CComplexVector1 res(vec, this->Filename);
  213.         return res;
  214.     }
  215.  
  216.     CComplexVector1& operator+= (const CComplexVector1 &obj) {
  217.         *this = *this + obj;
  218.         return *this;
  219.     }
  220.  
  221.     CComplexVector1& operator-= (const CComplexVector1 &obj) {
  222.         *this = *this - obj;
  223.         return *this;
  224.     }
  225.  
  226.     CComplexVector1 operator* (const CComplexVector1 &obj) {
  227.         int new_sz = max(obj.sz, sz);
  228.         vector <pair <int, int> > vec(new_sz);
  229.         for (size_t i = 0; i < min(obj.sz, sz); ++i) {
  230.             pair <int, int> tmp = obj.arr[i];
  231.             vec[i].first = arr[i].first * tmp.first - arr[i].second * tmp.second;
  232.             vec[i].second = arr[i].first * tmp.second + arr[i].second * tmp.first;
  233.         }
  234.         for (size_t i = min(obj.sz, sz); i < max(obj.sz, sz); ++i)
  235.             vec[i] = {0, 0};
  236.         CComplexVector1 res(vec, this->Filename);
  237.         return res;
  238.     }
  239.  
  240.     CComplexVector1& operator*= (const CComplexVector1 &obj) {
  241.         *this = *this * obj;
  242.         return *this;
  243.     }
  244.  
  245.     virtual string get_name() {
  246.         return this->Filename;
  247.     }
  248.  
  249.     virtual void output(string Filename_) {
  250.         ofstream out;
  251.         out.open(Filename_.c_str(), ofstream::app);
  252.         out << sz << endl;
  253.         for (size_t i = 0; i < sz; ++i) {
  254.             out << arr[i].first << ' ' << arr[i].second << endl;
  255.         }
  256.         out.close();
  257.     }
  258. private:
  259.     string Filename;
  260. };
  261.  
  262. class CFabricData {
  263. public:
  264.     virtual CComplexVector* create(vector <pair<int, int> > vec, string Filename_) = 0;
  265. };
  266.  
  267. class CFabricData0:public CFabricData {
  268. public:
  269.     virtual CComplexVector0* create(vector <pair <int, int> > vec, string Filename_) {
  270.         return new CComplexVector0(vec, Filename_);
  271.     }
  272. };
  273.  
  274. class CFabricData1:public CFabricData {
  275. public:
  276.     virtual CComplexVector1* create(vector <pair <int, int> > vec, string Filename_) {
  277.         return new CComplexVector1(vec, Filename_);
  278.     }
  279. };
  280.  
  281. CComplexVector* CComplexVector::create(int Type, vector <pair <int, int> > vec, string Filename_, CFabricData** f) {
  282.         CComplexVector* t = f[Type]->create(vec, Filename_);
  283.         return t;
  284. }
  285.  
  286. int main()
  287. {
  288.     /*
  289.     ifstream in;
  290.     in.open("files.txt");
  291.     int n;
  292.     in >> n;
  293.     vector <CComplexVector0> vec0;
  294.     for (size_t i = 0; i < n; ++i) {
  295.         int type, n;
  296.         string out_file;
  297.         in >> type >> out_file >> n;
  298.         vector <pair <int, int> > tmp(n);
  299.         for (size_t j = 0; j < n; ++j) {
  300.             int x, y;
  301.             in >> x >> y;
  302.             tmp[j].first = x;
  303.             tmp[j].second = y;
  304.         }
  305.         if (type) {
  306.             CComplexVector1 a(tmp, out_file);
  307.         } else {
  308.             CComplexVector0 a(tmp, out_file);
  309.             vec0.push_back(a);
  310.         }
  311.     }
  312.     in.close();
  313.     vec0[0].output(vec0[0].get_name());*/
  314.     CComplexVector** t;
  315.     ifstream in;
  316.     in.open("files.txt");
  317.     int n;
  318.     in >> n;
  319.     t = new CComplexVector*[n];
  320.     CFabricData* f[2] = {new CFabricData0(), new CFabricData1()};
  321.     for (size_t i = 0; i < n; ++i) {
  322.         int type, sz;
  323.         string out_file;
  324.         in >> type >> out_file >> sz;
  325.         vector <pair <int, int> > tmp(sz);
  326.         for (size_t j = 0; j < sz; ++j) {
  327.             int x, y;
  328.             in >> x >> y;
  329.             tmp[j].first = x;
  330.             tmp[j].second = y;
  331.         }
  332.         t[i] = CComplexVector::create(type, tmp, out_file, f);
  333.     }
  334.     for (size_t i = 0; i < n; ++i) {
  335.         t[i]->output(t[i]->get_name());
  336.     }
  337.     CComplexVector0 a(10000, {1, 1}, "x"), b(10000, {1, 1}, "x");
  338.     clock_t begin_time1 = clock();
  339.     CComplexVector0 c = a * b;
  340.     cout << float(clock() - begin_time1)/ CLOCKS_PER_SEC;
  341.     CComplexVector1 a1(10000, {1, 1}, "x"), b1(10000, {1, 1}, "x");
  342.     begin_time1 = clock();
  343.     CComplexVector1 c1 = a1 * b1;
  344.     cout << float(clock() - begin_time1)/ CLOCKS_PER_SEC;
  345.     return 0;
  346. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement