Submission #1054598

#TimeUsernameProblemLanguageResultExecution timeMemory
1054598ItamarFinancial Report (JOI21_financial)C++14
100 / 100
671 ms82220 KiB
using namespace std;
#include <iostream>
#include<map>
#include <vector>
#define vi vector<int>
#define pi pair<int,int>
#define ll long long
#include<set>
#define ckmin(a,b) a = min(a,b)
#define ckmax(a,b) a = max(a,b)
const int siz = 3e5+2;
int n,d;
int A[siz];
int r[siz];

map<int,vi> m;
set<int> s;
struct dsu{
    int pad[siz];
    dsu(){
        for(int i =0 ; i < siz; i++)pad[i]=i;
    }
    int root(int a){
        if(pad[a]==a)return a;
        return pad[a] = root(pad[a]);
    }
    void connect(int a, int b){
        a = root(a), b = root(b);
        if(a==b)return;
        pad[min(a,b)]=max(a,b);
    }
};
vi getlr(int i){
    auto it1 = s.lower_bound(i);
    int af = (it1 == s.end() ? -1 : *it1);
    if(it1 == s.begin())return {-1,af};
    it1--;
    return {*it1,af};
}
dsu ds;
void findr(){
    for(auto[a,v] : m){
        for(int i : v){
            auto adj = getlr(i);
            for(int prev : adj){
                if(prev!=-1 && abs(prev-i)<=d){
                ds.connect(i,prev);
                }
            }
            s.insert(i);
        }
        for(int i : v)r[i] = ds.root(i);
    }
    
}
struct node{
  int l,r,mid,maxi;
  node* sl,*sr;
  node(int li, int ri){
    l = li, r = ri, mid = (l+r)/2, maxi = 0;
    if(l<r){
        sl = new node(l,mid);
        sr = new node(mid+1,r);
    }
  }  
  void update(int i, int val){
    if(l == r){
        maxi = val;
    }else{
        if(i <= mid)sl->update(i,val);
        else sr->update(i,val);
        maxi = max(sl->maxi,sr->maxi);
    }
  }
  int query(int a, int b){
    if(a > r || b < l)return 0;
    if(a <= l && b>=r)return maxi;
    return max(sl->query(a,b),sr->query(a,b));
  }
};
int ans = 0;
node* seg;
void dp(){
    for(auto it = m.rbegin(); it != m.rend(); it++){
        auto [a,v] = *it;
        int si  = v.size();
        vi up(si);
        for(int i = 0; i < si; i++){
            up[i] = seg->query(v[i]+1,r[v[i]])+1;
        }
        for(int i = 0; i < si; i++){
            ans = max(ans,up[i]);
            seg->update(v[i],up[i]);
        }
    }
}
int main(){
    cin >> n >> d;
    for(int i = 0; i < n; i++)cin >> A[i];

    for(int i = 0; i < n; i++)m[A[i]].push_back(i);
    findr();
    for(int i = 0; i < n;i++)r[i] = min(r[i]+d,n-1);

    seg = new node(0,n-1);
    dp();
    
    cout << ans;
        

}

Compilation message (stderr)

Main.cpp: In function 'void findr()':
Main.cpp:42:13: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   42 |     for(auto[a,v] : m){
      |             ^
Main.cpp: In function 'void dp()':
Main.cpp:85:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   85 |         auto [a,v] = *it;
      |              ^
#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...