Submission #874664

#TimeUsernameProblemLanguageResultExecution timeMemory
874664ItamarSequence (APIO23_sequence)C++17
100 / 100
1242 ms97436 KiB
#include "sequence.h" #include <vector> using namespace std; #define vi vector<int> const int siz = 5e5 + 1; vi his[siz]; #define pi pair<int,int> #define x first #define y second struct node { int l, r, mid, minl, minr, maxl, maxr,sum1,sum2; node* sl, * sr; node(int li, int ri) { l = li, r = ri, mid = (l + r) / 2, minl = -(r - l + 1), minr = -(r - l + 1), maxl = 0, maxr = 0,sum1=minr,sum2=minr; if (l < r) { sl = new node(l, mid); sr = new node(mid + 1, r); } } void update(int i, int p) { if (l == r) { if (p == 2) { sum1 = 1, minl = 0, minr = 0; } else { sum2 = 1, maxl = 1, maxr = 1; } } else { if (i <= mid)sl->update(i, p); else sr->update(i, p); if (p == 2) { sum1 = sl->sum1 + sr->sum1; minl = min(sl->minl, sl->sum1 + sr->minl); minr = min(sr->minr, sr->sum1 + sl->minr); } else { sum2 = sl->sum2 + sr->sum2; maxl = max(sl->maxl, sl->sum2 + sr->maxl); maxr = max(sr->maxr, sr->sum2 + sl->maxr); } } } int query1(int a, int b) { if (a <= l && b >= r)return sum1; if (b <= mid)return min(sl->query1(a, b), sl->query1(a, mid) + sr->minl); if (a > mid)return min(sr->query1(a, b), sr->query1(mid + 1, b) + sl->minr); return sl->query1(a, mid) + sr->query1(mid+1, b); } int query2(int a, int b) { if (a <= l && b >= r)return sum2; if (b <= mid)return max(sl->query2(a, b), sl->query2(a, mid) + sr->maxl); if (a > mid)return max(sr->query2(a, b), sr->query2(mid + 1, b) + sl->maxr); return sl->query2(a, mid) + sr->query2(mid+1, b); } }; int sequence(int N, std::vector<int> A) { for (int i = 0; i < N; i++)his[A[i]].push_back(i); int ans = 1; node* seg = new node(0, N-1); for (int i = 0; i <= N; i++) { if (his[i].empty())continue; int it1 = 0, it2 = 0; for (int a : his[i])seg->update(a, 1); while (it2+1 < his[i].size()) { if (his[i].size() - it1 <= ans)break; pi p = { seg->query1(his[i][it1], his[i][it2 + 1]),seg->query2(his[i][it1],his[i][it2 + 1]) }; if (p.x> 0 || p.y< 0) { it1++; } else { it2++; } if (it1 > it2)it2++; ans = max(ans, it2 - it1 + 1); } for (int a : his[i])seg->update(a, 2); } return ans; }

Compilation message (stderr)

sequence.cpp: In function 'int sequence(int, std::vector<int>)':
sequence.cpp:71:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |   while (it2+1 < his[i].size()) {
      |          ~~~~~~^~~~~~~~~~~~~~~
sequence.cpp:72:28: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   72 |    if (his[i].size() - it1 <= ans)break;
      |        ~~~~~~~~~~~~~~~~~~~~^~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...