Submission #877748

#TimeUsernameProblemLanguageResultExecution timeMemory
877748dimashhhSequence (APIO23_sequence)C++17
100 / 100
1237 ms70676 KiB
#include <bits/stdc++.h> #include "sequence.h" using namespace std; const int N = 5e5 + 1; typedef long long ll; int n; struct segtree{ int mn[N * 4],mx[N * 4],add[N * 4]; void build(int v = 1,int tl = 1,int tr = n){ add[v] = mn[v] = mx[v] = 0; if(tl == tr) return; int tm = (tl + tr) >> 1; build(v + v,tl,tm);build(v + v + 1,tm + 1,tr); } void inc(int v,int val){ add[v] += val; mn[v] += val; mx[v] += val; } void push(int v){ if(add[v]){ inc(v + v,add[v]); inc(v + v +1,add[v]); add[v] = 0; } } void upd(int l,int r,int val,int v = 1,int tl = 1,int tr = n){ if(l > r || tl > r || l > tr){ return; } if(tl >= l && tr <= r){ inc(v,val); }else{ push(v); int tm = (tl + tr) >> 1; upd(l,r,val,v+v,tl,tm); upd(l,r,val,v+v+1,tm+1,tr); mn[v] = min(mn[v + v],mn[v + v + 1]); mx[v] = max(mx[v + v],mx[v + v + 1]); } } int get_min(int l,int r,int v = 1,int tl = 1,int tr = n){ if(l > r || tl > r || l > tr) return 1e9; if(tl >= l && tr <= r) return mn[v]; push(v); int tm = (tl + tr) >> 1; mn[v] = min(mn[v + v],mn[v + v + 1]); mx[v] = max(mx[v + v],mx[v + v + 1]); return min(get_min(l,r,v+v,tl,tm),get_min(l,r,v+v+1,tm+1,tr)); } int get_max(int l,int r,int v = 1,int tl = 1,int tr = n){ if(l > r || tl > r || l > tr) return -1e9; if(tl >= l && tr <= r) return mx[v]; push(v); int tm = (tl + tr) >> 1; mn[v] = min(mn[v + v],mn[v + v + 1]); mx[v] = max(mx[v + v],mx[v + v + 1]); return max(get_max(l,r,v+v,tl,tm),get_max(l,r,v+v+1,tm+1,tr)); } }T,T1; vector<int> pos[N]; bool inter(int l,int r,int l1,int r1){ return (min(r,r1) - max(l,l1) >= 0); } int sequence(int nn, std::vector<int> a) { n = nn; int mn = 1e9; for(int i = 0;i < nn;i++){ mn = min(mn,a[i]); pos[a[i]].push_back(i + 1); } T.build(); T1.build(); for(int i = 1;i <= n;i++){ T.upd(i,n,1); T1.upd(i,n,1); } int res = 1; for(int i = 1;i <= n;i++){ for(int j:pos[i - 1]){ T.upd(j,n,-2); } for(int j:pos[i]){ T1.upd(j,n,-2); } int it = 0; for(int j = 0;j < (int)pos[i].size();j++){ while(it < (int)pos[i].size()){ ll mn_sum = T1.get_min(pos[i][it],n) - max(0,T1.get_max(1,pos[i][j] - 1)); ll mx_sum = T.get_max(pos[i][it],n) - min(0,T.get_min(1,pos[i][j] - 1)); int len = (it - j + 1); if(mn_sum * mx_sum <=0 ){ it++; }else{ break; } } res = max(res,it - j); } } return res; } // int main() { // int N; // assert(1 == scanf("%d", &N)); // std::vector<int> A(N); // for (int i = 0; i < N; ++i) { // assert(1 == scanf("%d", &A[i])); // } // int result = sequence(N, A); // printf("%d\n", result); // return 0; // }

Compilation message (stderr)

sequence.cpp: In function 'int sequence(int, std::vector<int>)':
sequence.cpp:92:21: warning: unused variable 'len' [-Wunused-variable]
   92 |                 int len = (it - j + 1);
      |                     ^~~
#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...