제출 #613876

#제출 시각아이디문제언어결과실행 시간메모리
613876Vladth11Global Warming (CEOI18_glo)C++14
100 / 100
324 ms23924 KiB
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "

using namespace std;
typedef long long ll;
typedef pair <ll, ll> pii;
typedef pair <long double, pii> muchie;

const ll NMAX = 400001;
const ll VMAX = 10;
const ll INF = (1LL << 60);
const ll MOD = 998244353;
const ll BLOCK = 447;
const ll base = 117;
const ll nr_of_bits = 21;

int n, x;
int v[NMAX];
int aib[NMAX];
int lis[NMAX];
int acum[NMAX];
int maxim = 0;
int lds[NMAX];

int query(int x){
    int maxim = 0;
    for(; x > 0; x -= x&(-x))
        maxim = max(maxim, aib[x]);
    return maxim;
}

void update(int node, int x){
    assert(node != 0);
    for(; node < NMAX; node += node&(-node))
        aib[node] = max(aib[node], x);
}

unordered_map <int, int> mp;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int i;
    cin >> n >> x;
    vector <int> nrm;
    for(i = 1; i <= n; i++){
        cin >> v[i];
        nrm.push_back(v[i]);
        if(v[i] + x - 1 > 0){
            nrm.push_back(v[i] + x - 1);
        }
        int r = 0, pas = (1 << nr_of_bits);
        while(pas){
            if(r + pas <= maxim && lis[r + pas] <= v[i])
                r += pas;
            pas /= 2;
        }
        if(lis[r] != v[i])
        r++;
        lis[r] = v[i];
        acum[i] = r;
        maxim = max(maxim, r);
    }
    sort(nrm.begin(), nrm.end());
    int cnt = 0;
    for(int i = 0; i < nrm.size(); i++){
        if(i == 0 || nrm[i] != nrm[i - 1])
            cnt++;
        mp[nrm[i]] = cnt;
    }
    for(i = 0; i <= maxim; i++){
        lis[i] = 0;
    }
    maxim = 0;
    for(i = n; i >= 1; i--){
        int r = 0, pas = (1 << nr_of_bits);
        while(pas){
            if(r + pas <= maxim && lis[r + pas] >= v[i])
                r += pas;
            pas /= 2;
        }
        if(lis[r] != v[i])
        r++;
        lis[r] = v[i];
        maxim = max(maxim, r);
        lds[i] = r;
    }
    maxim = 0;
    for(i = 1; i <= n; i++){
        maxim = max(maxim, lds[i] + query(mp[v[i] + x - 1]));
        update(mp[v[i]], acum[i]);
    }
    cout << maxim;
    return 0;
}

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

glo.cpp: In function 'int main()':
glo.cpp:68:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |     for(int i = 0; i < nrm.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...