Advertisement
georgiy110802

Stress test

Nov 2nd, 2021
667
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.35 KB | None | 0 0
  1. //#include<stdio.h>
  2.  
  3. #include <bits/stdc++.h>
  4.  
  5. using namespace std;
  6.  
  7. inline int f(int a, int b) {
  8.     // любая функция
  9.     return a + b;
  10. }
  11.  
  12. int n;
  13. vector<int> tree(2 * 10000 + 1);
  14.  
  15. inline int get(int left, int right) {
  16.     left += n;
  17.     right += n;
  18.     int ans = -1;
  19.     while (left <= right) {
  20.         // 0101 = 1 + 4 = 5
  21.         // 0001
  22.         if ((left & 1) != 0) { // если отрезок из ДО входит в наш запрос - добавим его
  23.             if (ans == -1) {
  24.                 ans = tree[left];
  25.             } else {
  26.                 ans = f(ans, tree[left]);
  27.             }
  28.             ++left;
  29.         }
  30.         if ((right & 1) == 0) { // если отрезок из ДО входит в наш запрос - добавим его
  31.             if (ans == -1) {
  32.                 ans = tree[right];
  33.             } else {
  34.                 ans = f(ans, tree[right]);
  35.             }
  36.             --right;
  37.         }
  38.         left >>= 1;
  39.         right >>= 1;
  40.     }
  41.     return ans;
  42. }
  43.  
  44. //void setValue(int i, int value, vector<int>& tree) {
  45. //    i += n; // добавляется размер массива
  46. //    tree[i] = value;
  47. //    i >>= 1;
  48. //    while(i > 0) {
  49. //        tree[i] = f(tree[i << 1], tree[(i << 1) + 1]);
  50. //        i >>= 1;
  51. //    }
  52. //}
  53.  
  54. std::mt19937 ran(time(0));
  55.  
  56. int irand(int a, int b) {
  57.     return a + ran() % (b - a + 1);
  58. }
  59.  
  60. struct Request {
  61.     char type;
  62.     int a, b;
  63.     void print() {
  64.         cout << type << " " << a << " " << b << "\n";
  65.     }
  66. };
  67.  
  68. struct Test {
  69.     int n, m;
  70.     vector<int> elements;
  71.     vector<Request> q;
  72.  
  73.     Test(int _n, int _m, vector<Request> &_q) {
  74.         n = _n;
  75.         m = _m;
  76.         q = _q;
  77.     }
  78.  
  79.     Test() {}
  80.  
  81.     void print() {
  82.         cout << n << " " << m << "\n";
  83.         for (int i : elements) {
  84.             cout << i << " ";
  85.         }
  86.         cout << "\n";
  87.         for (auto &i : q) {
  88.             i.print();
  89.         }
  90.     }
  91. };
  92.  
  93. Test gen() {
  94.     Test test;
  95.     test.n = irand(3, 10);
  96.     test.m = irand(3, 10);
  97.     test.elements.resize(test.n);
  98.     test.q.resize(test.m);
  99.     for (int &i : test.elements) {
  100. //        cout << "fdfd";
  101.         i = irand(2, 10);
  102.     }
  103.     for (int i = 0; i < test.m; ++i) {
  104. //        cout << "opop";
  105.         Request req;
  106.         test.q[i].type = 'Q';
  107. //        req.type = 'Q';
  108. //        if (test.q[i].type == 'A') {
  109. //            test.q[i].a = irand(1, test.n);
  110. //            test.q[i].b = irand(1, 10);
  111. //        } else {
  112.             test.q[i].a = irand(1, test.n / 2);
  113.             test.q[i].b = irand(req.a, test.n);
  114. //        }
  115.     }
  116.     return test;
  117. }
  118.  
  119. struct Answer {
  120.     int _size;
  121.     vector<int> answers;
  122. };
  123.  
  124. bool checker(Answer &right, Answer &wrong, Test &test) {
  125.     if (wrong._size != right._size) {
  126.         cout << "wrong answer\n";
  127.         cout << "right size:" << right._size << " wrong size:" << wrong._size;
  128.         test.print();
  129.         return false;
  130.     }
  131.     int _size = right._size;
  132.     vector<string> ans(_size);
  133.     bool mistake = false;
  134.     for (int i = 0; i < _size; ++i) {
  135. //        cout << "tt";
  136.         if (right.answers[i] != wrong.answers[i]) {
  137.             mistake = true;
  138.             ans[i] = "WA";
  139.         } else {
  140.             ans[i] = "OK";
  141.         }
  142.     }
  143.     if (mistake) {
  144.         test.print();
  145.         for (int i = 0; i < ans.size(); ++i) {
  146. //            cout << "yt";
  147.             if (ans[i] == "OK") {
  148.                 cout << "OK: " << right.answers[i] << "\n";
  149.             } else {
  150.                 cout << "WA: " << "r: " << right.answers[i] << " w: " << wrong.answers[i] << "\n";
  151.             }
  152.         }
  153.         return false;
  154.     }
  155.     return true;
  156. }
  157.  
  158. Answer genRightAnswer(const Test &test) {
  159.     Answer ans;
  160.     ans.answers = {};
  161.     ans._size = 0;
  162.     vector<int> v = test.elements;
  163.     for (auto q : test.q) {
  164.         cout << 'f';
  165. //        cin >> q.type >> q.a >> q.b;
  166.         if (q.type == 'Q') {
  167.             int sum = 0;
  168.             for (int j = q.a - 1; j <= q.b - 1; ++j) {
  169. //                cout << q.a << " " << q.b << "\n";
  170. //                cout << 'y';
  171.                 sum += v[j];
  172.             }
  173.             ans.answers.push_back(sum);
  174.             ans._size++;
  175.         }
  176. //            v[q.a - 1] = q.b;
  177. //        } else {
  178. //            v[q.a - 1] = q.b;
  179.  
  180. //        }
  181.     }
  182.     cout << ans._size << "try\n ";
  183.     return ans;
  184. }
  185.  
  186. Answer genTryAnswer(const Test &test) {
  187.     Answer ans;
  188.     ans.answers = {};
  189.     ans._size = 0;
  190.     n = test.n;
  191.     for (int i = test.n; i < 2 * test.n; ++i)  {
  192.         tree[i] = test.elements[i - test.n]; // считываем массив
  193.     }
  194.     for (int i = test.n - 1; i >= 1; --i)
  195.         tree[i] = f(tree[i << 1], tree[(i << 1) + 1]); // построение дерева отрезков \/\/\/\/\/\/\/
  196.     for (auto q : test.q) {
  197.         if (q.type == 'Q') {
  198.             ans.answers.push_back(get(q.a - 1, q.b - 1));
  199.         }
  200.     }
  201.     cout << ans._size << "try\n ";
  202.     tree.assign(2 * 10000 + 1, 0);
  203.     return ans;
  204. }
  205.  
  206. int main() {
  207.     int count;
  208.     cout << "count tests: ";
  209.     cin >> count;
  210.     while (count--) {
  211.         Test test = gen();
  212.         Answer right = genRightAnswer(test);
  213.         Answer wrong = genTryAnswer(test);
  214.         if (!checker(right, wrong, test)) {
  215.             return 0;
  216.         }
  217.     }
  218.     cout << "OK!";
  219. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement