Submission #1126125

#TimeUsernameProblemLanguageResultExecution timeMemory
1126125qwewqFinancial Report (JOI21_financial)C++20
0 / 100
4097 ms58256 KiB
#include <bits/stdc++.h>

#define ll long long
using namespace std;
const int N = 3e5 + 2;
int par[N + 2];
int cc[N + 2];
vector < int > vt;
set < int > s;
int find_par(int u){
    if(par[u] < 0)return u;
    return par[u] = find_par(par[u]);
}
void union_set(int u , int v){
    u = find_par(u);
    v = find_par(v);
    if(u != v){
        if(par[u] > par[v])swap(u , v);
        par[u]  += par[v];
        par[v] = u;
        cc[u] = max(cc[u] , cc[v]);
    }
}
int a[N + 2];
multiset< int > sx[N + 2]; 
bool cmp(int g , int h){
    if(a[g]  != a[h])return a[g] < a[h];
    return g > h;
}
int nxt[N + 2];
int st[4  * N + 2];
int n , d;
vector < pair < int , int > > query[N + 2];
void update(int id , int l , int r  , int p , int val , bool cc){
    if(l > p || r  < p)return;
    if(l == r){
        if(cc){
            sx[l].insert(val);
        }
        else{
            sx[l].erase(sx[l].find(val));
        }
        if(sx[l].size())st[id] =  *sx[l].rbegin();
        else st[id] =  0;
        return;
    }
    int mid = (l  + r) / 2;
    update(id * 2 , l , mid , p , val , cc);
    update(id * 2 + 1 , mid  + 1 , r , p , val ,cc);
    st[id] = max(st[id  * 2] , st[id  * 2 + 1]);
}
int get(int id , int l  , int r , int u , int v){
    if(l > v ||  r < u)return  0;
    if(u <= l && r  <= v){
        return st[id];
    }
    int mid = (l + r) / 2;
    return max(get(id * 2 , l , mid , u , v) , get(id * 2 + 1 , mid + 1 , r , u , v)); 
}
void pre(){
    sort(vt.begin() , vt.end());
    vt.erase(unique(vt.begin() , vt.end()) ,  vt.end());
    vector <int > res;
    for(int  i = 1; i <= n ; i ++){
        a[i] = upper_bound(vt.begin()  ,vt.end() , a[i]) - vt.begin();
        res.push_back(i);
        cc[i] = i + d;
    }
    memset(par , -1 , sizeof(par));
    sort(res.begin()  , res.end() , cmp);
    for(auto v: res){
        if(s.size()){
            auto it = s.lower_bound(v);
            if(it != s.begin()){
                it--;
               if(v - *it <= d) union_set(v , *it);
            }
            it = s.upper_bound(v);
            if(it != s.end()){
                if(*it -  v <= d) union_set(v , *it);
            }
        }
        nxt[v] = cc[find_par(v)];
        s.insert(v);
    }
}
void solve() {
    cin >> n >> d;
    for(int  i =1; i <= n ; i ++){
        cin >> a[i];
        vt.push_back(a[i]);
    }
    pre();
    int ans = 0;
    for(int i = 1; i <= n ;i ++){
        int val = get(1 , 1 , n , 1 , a[i] - 1) + 1;
        ans = max(ans , val);
        update(1 , 1 , n , a[i]  , val , 1);
        query[nxt[i]].push_back({i , val});
        for(auto[u , val] : query[i]){
            update(1 , 1 , n , u , val , 0);
        }
    }
    cout << ans;
}

signed main() {
    ios::sync_with_stdio(0), cin.tie(0);
    
    #define _ "GRAPHZIP."
    if (fopen(_ "inp", "r")) {
        freopen(_ "inp", "r", stdin);
        freopen(_ "out", "w", stdout);
    }
    
    solve();
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:112:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  112 |         freopen(_ "inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
Main.cpp:113:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  113 |         freopen(_ "out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#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...