Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //#include<stdio.h>
- #include <bits/stdc++.h>
- using namespace std;
- inline int f(int a, int b) {
- // любая функция
- return a + b;
- }
- int n;
- vector<int> tree(2 * 10000 + 1);
- inline int get(int left, int right) {
- left += n;
- right += n;
- int ans = -1;
- while (left <= right) {
- // 0101 = 1 + 4 = 5
- // 0001
- if ((left & 1) != 0) { // если отрезок из ДО входит в наш запрос - добавим его
- if (ans == -1) {
- ans = tree[left];
- } else {
- ans = f(ans, tree[left]);
- }
- ++left;
- }
- if ((right & 1) == 0) { // если отрезок из ДО входит в наш запрос - добавим его
- if (ans == -1) {
- ans = tree[right];
- } else {
- ans = f(ans, tree[right]);
- }
- --right;
- }
- left >>= 1;
- right >>= 1;
- }
- return ans;
- }
- //void setValue(int i, int value, vector<int>& tree) {
- // i += n; // добавляется размер массива
- // tree[i] = value;
- // i >>= 1;
- // while(i > 0) {
- // tree[i] = f(tree[i << 1], tree[(i << 1) + 1]);
- // i >>= 1;
- // }
- //}
- std::mt19937 ran(time(0));
- int irand(int a, int b) {
- return a + ran() % (b - a + 1);
- }
- struct Request {
- char type;
- int a, b;
- void print() {
- cout << type << " " << a << " " << b << "\n";
- }
- };
- struct Test {
- int n, m;
- vector<int> elements;
- vector<Request> q;
- Test(int _n, int _m, vector<Request> &_q) {
- n = _n;
- m = _m;
- q = _q;
- }
- Test() {}
- void print() {
- cout << n << " " << m << "\n";
- for (int i : elements) {
- cout << i << " ";
- }
- cout << "\n";
- for (auto &i : q) {
- i.print();
- }
- }
- };
- Test gen() {
- Test test;
- test.n = irand(3, 10);
- test.m = irand(3, 10);
- test.elements.resize(test.n);
- test.q.resize(test.m);
- for (int &i : test.elements) {
- // cout << "fdfd";
- i = irand(2, 10);
- }
- for (int i = 0; i < test.m; ++i) {
- // cout << "opop";
- Request req;
- test.q[i].type = 'Q';
- // req.type = 'Q';
- // if (test.q[i].type == 'A') {
- // test.q[i].a = irand(1, test.n);
- // test.q[i].b = irand(1, 10);
- // } else {
- test.q[i].a = irand(1, test.n / 2);
- test.q[i].b = irand(req.a, test.n);
- // }
- }
- return test;
- }
- struct Answer {
- int _size;
- vector<int> answers;
- };
- bool checker(Answer &right, Answer &wrong, Test &test) {
- if (wrong._size != right._size) {
- cout << "wrong answer\n";
- cout << "right size:" << right._size << " wrong size:" << wrong._size;
- test.print();
- return false;
- }
- int _size = right._size;
- vector<string> ans(_size);
- bool mistake = false;
- for (int i = 0; i < _size; ++i) {
- // cout << "tt";
- if (right.answers[i] != wrong.answers[i]) {
- mistake = true;
- ans[i] = "WA";
- } else {
- ans[i] = "OK";
- }
- }
- if (mistake) {
- test.print();
- for (int i = 0; i < ans.size(); ++i) {
- // cout << "yt";
- if (ans[i] == "OK") {
- cout << "OK: " << right.answers[i] << "\n";
- } else {
- cout << "WA: " << "r: " << right.answers[i] << " w: " << wrong.answers[i] << "\n";
- }
- }
- return false;
- }
- return true;
- }
- Answer genRightAnswer(const Test &test) {
- Answer ans;
- ans.answers = {};
- ans._size = 0;
- vector<int> v = test.elements;
- for (auto q : test.q) {
- cout << 'f';
- // cin >> q.type >> q.a >> q.b;
- if (q.type == 'Q') {
- int sum = 0;
- for (int j = q.a - 1; j <= q.b - 1; ++j) {
- // cout << q.a << " " << q.b << "\n";
- // cout << 'y';
- sum += v[j];
- }
- ans.answers.push_back(sum);
- ans._size++;
- }
- // v[q.a - 1] = q.b;
- // } else {
- // v[q.a - 1] = q.b;
- // }
- }
- cout << ans._size << "try\n ";
- return ans;
- }
- Answer genTryAnswer(const Test &test) {
- Answer ans;
- ans.answers = {};
- ans._size = 0;
- n = test.n;
- for (int i = test.n; i < 2 * test.n; ++i) {
- tree[i] = test.elements[i - test.n]; // считываем массив
- }
- for (int i = test.n - 1; i >= 1; --i)
- tree[i] = f(tree[i << 1], tree[(i << 1) + 1]); // построение дерева отрезков \/\/\/\/\/\/\/
- for (auto q : test.q) {
- if (q.type == 'Q') {
- ans.answers.push_back(get(q.a - 1, q.b - 1));
- }
- }
- cout << ans._size << "try\n ";
- tree.assign(2 * 10000 + 1, 0);
- return ans;
- }
- int main() {
- int count;
- cout << "count tests: ";
- cin >> count;
- while (count--) {
- Test test = gen();
- Answer right = genRightAnswer(test);
- Answer wrong = genTryAnswer(test);
- if (!checker(right, wrong, test)) {
- return 0;
- }
- }
- cout << "OK!";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement