Submission #364505

#TimeUsernameProblemLanguageResultExecution timeMemory
364505r57shellBubble Sort 2 (JOI18_bubblesort2)C++14
0 / 100
960 ms524292 KiB
#include "bubblesort2.h" #include <set> #include <algorithm> using namespace std; static int stupid(vector<int> A) { int res = 0; int n = A.size(); while (true) { bool was = false; for (int i = 1; i < n; ++i) { if (A[i-1] > A[i]) { swap(A[i-1], A[i]); was = true; } } if (was) ++res; else break; } return res; } static int get(vector<int> &f, int x) { int res = 0; for (; x >= 0; x = (x&(x+1))-1) res += f[x]; return res; } static void add(vector<int> &f, int x, int v) { for (; x < f.size(); x |= (x+1)) f[x] += v; } static int stupid1(vector<int> A) { int n = A.size(); int res = 0; for (int i = 1; i < n; ++i) { int c = 0; for (int j = 0; j < i; ++j) if (A[i] < A[j]) ++c; res = max(res, c); } return res; } static int smart(const vector<int> &A, vector<int> &F, const vector<int> &all) { int n = A.size(); int res = 0; for (int i = 0; i < n; ++i) { res = max(res, i - get(F, A[i])); add(F, A[i], 1); } for (int i = 0; i < n; ++i) add(F, A[i], -1); return res; } static int smart1(const vector<int> &A) { int n = A.size(); int res = 0; int p = int(2e9); for (int i = n - 1; i > 0; --i) { if (A[i] < p) { p = A[i]; int c = 0; for (int j = 0; j < i; ++j) if (A[i] < A[j]) ++c; res = max(res, c); } } return res; } void merge(vector<int> &res, const vector<int> &a, const vector<int> &b) { int i, j, k; res.resize(a.size()+b.size()); k = 0; for (i = 0, j = 0; i < a.size() && j < b.size(); ) { if (a[i] <= b[j]) res[k++] = a[i++]; else res[k++] = b[j++]; } for (; i < a.size(); ++i, ++k) res[k] = a[i]; for (; j < b.size(); ++j, ++k) res[k] = b[j]; } static int smart2(const vector<int> &A, vector<vector<int>> &T) { int n = A.size(); int res = 0; int p = int(2e9); for (int i = 0; i < n; ++i) T[i+n].assign(1, A[i]); for (int i = n - 1; i > 0; --i) merge(T[i], T[i*2], T[i*2+1]); for (int i = n - 1; i > 0; --i) { if (A[i] < p) { p = A[i]; int c = 0; int l = 0 + n; int r = i + n; while (l <= r) { if (l&1) c += T[l].size() - (lower_bound(T[l].begin(), T[l].end(), p + 1) - T[l].begin()); if (!(r&1)) c += T[r].size() - (lower_bound(T[r].begin(), T[r].end(), p + 1) - T[r].begin()); l = (l+1)/2; r = (r-1)/2; } res = max(res, c); } } return res; } static int smart3(const vector<int> &A, vector<vector<int>> &T) { int n = A.size(); int res = 0; int p = int(2e9); for (int i = 0; i < n; ++i) T[i].clear(); /*for (int i = 0; i < n; ++i) printf("%d ", A[i]); printf("\n");*/ vector<int> v, v1; for (int i = 0; i < n; ++i) { //for (int x = i; x < n; x = (x|(x+1))) // T[x].push_back(A[i]); //T[x].insert(lower_bound(T[x].begin(), T[x].end(), A[i]), A[i]); v.assign(1, A[i]); v1.clear(); int y = (i&(i+1))-1; for (int x = i - 1; x > y; x = (x&(x+1))-1) { merge(v1, v, T[x]); swap(v1, v); } T[i] = v; } for (int i = n - 1; i > 0; --i) { if (A[i] < p) { p = A[i]; int c = 0; for (int x = i; x >= 0; x = (x&(x+1))-1) c += T[x].size() - (lower_bound(T[x].begin(), T[x].end(), p + 1) - T[x].begin()); res = max(res, c); } } return res; } struct node { node *left; node *right; int h; int v; int sz; }; node * merge(node *a, node *b) { if (!a) return b; if (!b) return a; node *r = new node(); if (a->h < b->h) { r = a; r->right = merge(a->right, b); } else { r = b; r->left = merge(a, b->left); } r->sz = 1; if (r->left) r->sz += r->left->sz; if (r->right) r->sz += r->right->sz; return r; } pair<node*,node*> split(node *a, int x) { if (!a) return pair<node*,node*>((node*)0, (node*)0); pair<node*,node*> tmp; if (x <= a->v) { tmp = split(a->left,x); node * z = new node(); z = a; z->left = NULL; if (a->left) z->sz -= a->left->sz; return pair<node*,node*>(tmp.first, merge(tmp.second,z)); } else { tmp = split(a->right,x); node * z = new node(); z = a; z->right = NULL; if (a->right) z->sz -= a->right->sz; return pair<node*,node*>(merge(z, tmp.first), tmp.second); } } int getsz(node *a, int x) { if (!a) return 0; if (a->v < x) return (a->left ? a->left->sz : 0) + 1 + getsz(a->right, x); return getsz(a->left, x); } static int smart4(const vector<int> &A) { int n = A.size(); int res = 0; int p = int(2e9); vector<node*> D(2*n); { vector<vector<int>> T(2*n); /*for (int i = 0; i < n; ++i) printf("%d ", A[i]); printf("\n");*/ vector<int> v, v1; for (int i = 0; i < n; ++i) { //for (int x = i; x < n; x = (x|(x+1))) // T[x].push_back(A[i]); //T[x].insert(lower_bound(T[x].begin(), T[x].end(), A[i]), A[i]); v.assign(1, A[i]); v1.clear(); int y = (i&(i+1))-1; for (int x = i - 1; x > y; x = (x&(x+1))-1) { merge(v1, v, T[x]); swap(v1, v); } T[i] = v; D[i] = NULL; for (int j = 0; j < v.size(); ++j) { node *nd = new node(); nd->h = rand()*32000+rand(); nd->v = v[j]; nd->left = NULL; nd->right = NULL; nd->sz = 1; D[i] = merge(D[i], nd); } } } for (int i = n - 1; i > 0; --i) { if (A[i] < p) { p = A[i]; int c = 0; for (int x = i; x >= 0; x = (x&(x+1))-1) { //printf("%d %d\n",T[x].size() - (lower_bound(T[x].begin(), T[x].end(), p + 1) - T[x].begin()),D[x]->sz - getsz(D[x], p+1)); c += D[x]->sz - getsz(D[x], p+1); } res = max(res, c); } } return res; } vector<int> countScans(vector<int> A, vector<int> X, vector<int> V) { int Q = X.size(); int N = A.size(); vector<int> answer(Q); //vector<vector<int>> T(N); for (int j = 0; j < Q; ++j) { A[X[j]] = V[j]; answer[j] = smart4(A); } return answer; }

Compilation message (stderr)

bubblesort2.cpp: In function 'void add(std::vector<int>&, int, int)':
bubblesort2.cpp:40:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |  for (; x < f.size(); x |= (x+1))
      |         ~~^~~~~~~~~~
bubblesort2.cpp: In function 'void merge(std::vector<int>&, const std::vector<int>&, const std::vector<int>&)':
bubblesort2.cpp:98:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |  for (i = 0, j = 0; i < a.size() && j < b.size(); )
      |                     ~~^~~~~~~~~~
bubblesort2.cpp:98:39: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |  for (i = 0, j = 0; i < a.size() && j < b.size(); )
      |                                     ~~^~~~~~~~~~
bubblesort2.cpp:105:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  105 |  for (; i < a.size(); ++i, ++k)
      |         ~~^~~~~~~~~~
bubblesort2.cpp:107:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  107 |  for (; j < b.size(); ++j, ++k)
      |         ~~^~~~~~~~~~
bubblesort2.cpp: In function 'int smart4(const std::vector<int>&)':
bubblesort2.cpp:280:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  280 |    for (int j = 0; j < v.size(); ++j)
      |                    ~~^~~~~~~~~~
bubblesort2.cpp: In function 'std::vector<int> countScans(std::vector<int>, std::vector<int>, std::vector<int>)':
bubblesort2.cpp:312:6: warning: unused variable 'N' [-Wunused-variable]
  312 |  int N = A.size();
      |      ^
bubblesort2.cpp: At global scope:
bubblesort2.cpp:143:12: warning: 'int smart3(const std::vector<int>&, std::vector<std::vector<int> >&)' defined but not used [-Wunused-function]
  143 | static int smart3(const vector<int> &A, vector<vector<int>> &T)
      |            ^~~~~~
bubblesort2.cpp:111:12: warning: 'int smart2(const std::vector<int>&, std::vector<std::vector<int> >&)' defined but not used [-Wunused-function]
  111 | static int smart2(const vector<int> &A, vector<vector<int>> &T)
      |            ^~~~~~
bubblesort2.cpp:73:12: warning: 'int smart1(const std::vector<int>&)' defined but not used [-Wunused-function]
   73 | static int smart1(const vector<int> &A)
      |            ^~~~~~
bubblesort2.cpp:59:12: warning: 'int smart(const std::vector<int>&, std::vector<int>&, const std::vector<int>&)' defined but not used [-Wunused-function]
   59 | static int smart(const vector<int> &A, vector<int> &F, const vector<int> &all)
      |            ^~~~~
bubblesort2.cpp:44:12: warning: 'int stupid1(std::vector<int>)' defined but not used [-Wunused-function]
   44 | static int stupid1(vector<int> A)
      |            ^~~~~~~
bubblesort2.cpp:7:12: warning: 'int stupid(std::vector<int>)' defined but not used [-Wunused-function]
    7 | static int stupid(vector<int> A)
      |            ^~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...