제출 #1360824

#제출 시각아이디문제언어결과실행 시간메모리
1360824sim_ple서열 (APIO23_sequence)C++20
컴파일 에러
0 ms0 KiB
/*
    written by sim_ple
*/
#include <bits/stdc++.h>
#include "sequence.h"
using namespace std;

// #define int long long
#define N 1009
#define itn int
#define all(x) x.begin() , x.end()
int pref1[N] , pref2[N] , pref3[N];
int v1[N] , v2[N] , v3[N] , v4[N];
int mx1[N << 2] , mx2[N << 2] , mx3[N << 2] , mx4[N << 2];

void build1(int node , int l , int r){
    if(l == r){
        mx1[node] = v1[l];
        return;
    }
    int md = (l + r) / 2;
    build1(node << 1 , l , md);
    build1(node << 1 | 1 , md + 1 , r);
    mx1[node] = max(mx1[node << 1] , mx1[node << 1 | 1]);
}

void build2(int node , int l , int r){
    if(l == r){
        mx2[node] = v2[l];
        return;
    }
    int md = (l + r) / 2;
    build2(node << 1 , l , md);
    build2(node << 1 | 1 , md + 1 , r);
    mx2[node] = max(mx2[node << 1] , mx2[node << 1 | 1]);
}

void build3(int node , int l , int r){
    if(l == r){
        mx3[node] = v3[l];
        return;
    }
    int md = l + r >> 1;
    build3(node << 1 , l , md);
    build3(node << 1 | 1 , md + 1 , r);
    mx3[node] = max(mx3[node << 1] , mx3[node << 1 | 1]);
}

void build4(int node , int l , int r){
    if(l == r){
        mx4[node] = v4[l];
        return;
    }
    int md = l + r >> 1;
    build4(node << 1 , l , md);
    build4(node << 1 | 1 , md + 1 , r);
    mx4[node] = max(mx4[node << 1] , mx4[node << 1 | 1]);
}

int find1(int node , int l , int r, int idx , int val){
    if(l > idx) return -1;
    if(l == r) return mx1[node];
    int md = l + r >> 1;
    if(mx1[node << 1] >= val){
        return find1(node << 1 , l , md , idx , val);
    }
    else{
        return find1(node << 1 | 1 , md + 1 , r , idx , val);
    }
}

int find2(int node , int l , int r, int idx , int val){
    if(l > idx) return -1;
    if(l == r) return mx2[node];
    int md = l + r >> 1;
    if(mx2[node << 1] >= val){
        return find2(node << 1 , l , md , idx , val);
    }
    else{
        return find2(node << 1 | 1 , md + 1 , r , idx , val);
    }
}

int find3(int node , int l , int r, int idx , int val){
    if(l > idx) return -1;
    if(l == r) return mx3[node];
    int md = l + r >> 1;
    if(mx3[node << 1] >= val){
        return find3(node << 1 , l , md , idx , val);
    }
    else{
        return find3(node << 1 | 1 , md + 1 , r , idx , val);
    }
}

int find4(int node , int l , int r , int idx , int val){
    if(l > idx) return -1;
    if(l == r) return mx4[node];
    int md = l + r >> 1;
    if(mx4[node << 1] >= val){
        return find4(node << 1 , l , md , idx ,val);
    }
    else{
        return find4(node << 1 | 1 , md + 1 , r , idx , val);
    }
}

int sequence(int n , vector<int> a){
    for(int i = 1; i <= n; i++){
        pref1[i] = pref1[i - 1];
        pref2[i] = pref2[i - 1];
        pref3[i] = pref3[i - 1];
        if(a[i] == 1) pref1[i]++;
        else if(a[i] == 2) pref2[i]++;
        else pref3[i]++;
        v1[i] = pref2[i] + pref3[i] - pref1[i];
        v2[i] = pref1[i] + pref2[i] - pref3[i];
        v3[i] = pref3[i] - pref1[i] - pref2[i];
        v4[i] = pref1[i] - pref3[i] - pref2[i];
    } 
    build1(1 , 1 , n);
    build2(1 , 1 , n);
    build3(1 , 1 , n);
    build4(1 , 1 , n);
    int ans = 0;
    for(int i = 2; i <= n; i++){
        int r1 = find1(1 , 1 , n , i - 1 , v1[i]);
        int r2 = find2(1 , 1 , n , i - 1 , v2[i]);
        int r3 = find3(1 , 1 , n , i - 1 , v3[i]);
        int r4 = find4(1 , 1 , n , i - 1 , v4[i]);
        if(r1 > 0) ans = max(ans , pref1[i] - pref1[r1]);
        if(r3 > 0) ans = max(ans , pref2[i] - pref2[r3]);
        if(r4 > 0) ans = max(ans , pref2[i] - pref2[r4]);
        if(r2 > 0) ans = max(ans , pref3[i] - pref3[r2]);
        if(pref1[i] >= pref2[i] + pref3[i]) ans = max(ans , pref1[i]);
        if(pref3[i] >= pref1[i] + pref2[i]) ans = max(ans , pref3[i]);
        if(pref2[i] >= abs(pref1[i] - pref3[i])) ans = max(ans , pref2[i]);
     }
     return ans;
}


void solve1(){
    int n;
    cin >> n;
    vector<int> a(n + 1);
    for(int i = 0; i < n; i++){
        cin >> a[i];
    }
    cout << sequence(n , a) << endl;
}

int32_t main() {
    ios::sync_with_stdio(0); cin.tie(0);


    freopen("a.in", "r", stdin);
    freopen("a.out", "w", stdout);

    int t = 1;
    //cin >> t;
    while(t--) solve1();
    return 0;
}

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

sequence.cpp: In function 'int32_t main()':
sequence.cpp:157:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  157 |     freopen("a.in", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~
sequence.cpp:158:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  158 |     freopen("a.out", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
/usr/bin/ld: /tmp/cceKkvPQ.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccAsqP5U.o:sequence.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status