제출 #789766

#제출 시각아이디문제언어결과실행 시간메모리
7897661075508020060209tc서열 (APIO23_sequence)C++17
100 / 100
1173 ms152004 KiB
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx,popcnt,sse4,abm")
#include <bits/stdc++.h>
using namespace std;

vector<int>vpl[500005];
vector<int>vplv[500005];
int ar[500005];
int n;
struct SEGMENT_TREE{

struct SGTR{
int l;int r;
int lz;
int mx;int mn;
};
vector<SGTR>tr;
void init(int n){
for(int i=0;i<=n*4+10;i++){
    tr.push_back({0,0,0,0,0});
}
}


void buildtr(int nw,int l,int r){
tr[nw].l=l;tr[nw].r=r;
tr[nw].lz=0;tr[nw].mx=0;tr[nw].mn=0;
if(l==r){return;}
int mi=(l+r)/2;
buildtr(nw*2,l,mi);
buildtr(nw*2+1,mi+1,r);
}

void psh(int nw){
int ad=tr[nw].lz;
tr[nw].lz=0;
tr[nw*2].lz+=ad;tr[nw*2+1].lz+=ad;
tr[nw*2].mx+=ad;tr[nw*2+1].mx+=ad;
tr[nw*2].mn+=ad;tr[nw*2+1].mn+=ad;
}

void upd(int nw,int l,int v){
if(tr[nw].l>=l){
    tr[nw].mx+=v;
    tr[nw].mn+=v;
    tr[nw].lz+=v;
    return;
}
if(tr[nw].r<l){return;}
if(tr[nw].lz){psh(nw);}
upd(nw*2,l,v);
upd(nw*2+1,l,v);
tr[nw].mx=max(tr[nw*2].mx,tr[nw*2+1].mx);
tr[nw].mn=min(tr[nw*2].mn,tr[nw*2+1].mn);
}
int qmx(int nw,int l,int r){
if(tr[nw].l>=l&&tr[nw].r<=r){
    return tr[nw].mx;
}
if(tr[nw].l>r||tr[nw].r<l){return -1e9;}
if(tr[nw].lz){psh(nw);}
return max(qmx(nw*2,l,r),qmx(nw*2+1,l,r));
}
int qmn(int nw,int l,int r){
if(tr[nw].l>=l&&tr[nw].r<=r){
    return tr[nw].mn;
}
if(tr[nw].l>r||tr[nw].r<l){return 1e9;}
if(tr[nw].lz){psh(nw);}
return min(qmn(nw*2,l,r),qmn(nw*2+1,l,r));
}

};

SEGMENT_TREE A;
SEGMENT_TREE B;

int ok(int l,int r){
int rv=A.qmx(1,r,n);
int lv=(l==1)?0:A.qmn(1,1,l-1);
lv=min(lv,0);
if(rv-lv<0){return 0;}
rv=B.qmx(1,r,n);
lv=(l==1)?0:B.qmn(1,1,l-1);
lv=min(lv,0);
if(rv-lv<0){return 0;}
return 1;
}

int fslv(){
    //cin>>n;
    for(int i=1;i<=n;i++){
      //  cin>>ar[i];
        vpl[ar[i]].push_back(i);
    }
    int ans=1;
    A.init(n);
    B.init(n);
    A.buildtr(1,1,n);
    B.buildtr(1,1,n);
    for(int i=1;i<=n;i++){
        A.upd(1,i,-1);
        B.upd(1,i,1);
    }
    for(int nw=1;nw<=n;nw++){
        for(int i=0;i<vpl[nw].size();i++){
            A.upd(1,vpl[nw][i],2);
        }
        int lit=0;
        for(int i=0;i<vpl[nw].size();i++){
            while(!ok(vpl[nw][lit],vpl[nw][i])){lit++;}
            ans=max(ans,i-lit+1);
        }
        for(int i=0;i<vpl[nw].size();i++){
            B.upd(1,vpl[nw][i],-2);
        }
    }
   // cout<<ans;
return ans;

}


int sequence(int N, std::vector<int> A) {
    n=N;
    for(int i=0;i<n;i++){
        ar[i+1]=A[i];
        vpl[i+1].clear();
        vplv[i+1].clear();
    }
return fslv();

  return 0;
}
/*

signed main()
{




    return 0;
}

*/

컴파일 시 표준 에러 (stderr) 메시지

sequence.cpp: In function 'int fslv()':
sequence.cpp:106:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  106 |         for(int i=0;i<vpl[nw].size();i++){
      |                     ~^~~~~~~~~~~~~~~
sequence.cpp:110:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  110 |         for(int i=0;i<vpl[nw].size();i++){
      |                     ~^~~~~~~~~~~~~~~
sequence.cpp:114:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  114 |         for(int i=0;i<vpl[nw].size();i++){
      |                     ~^~~~~~~~~~~~~~~
#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...