제출 #1347926

#제출 시각아이디문제언어결과실행 시간메모리
1347926kokokaiFinancial Report (JOI21_financial)C++20
100 / 100
1505 ms24492 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define fi first
#define se second
#define task "financial"
const int N = 3e5+5;
int a[N];
pair<int,int> arr[N];
int n,D;
struct node{
        int pref,suf,mx,len;
}st[4*N],emp;
struct segtree{

    void merg(node &res,node &lef,node &rig){
        if(lef.pref == 1e9){
            res=rig;
            return;
        }
        if(rig.pref == 1e9){
            res=lef;
            return;
        }
        if(lef.pref == lef.len) res.pref=rig.pref+lef.pref;
        else res.pref=lef.pref;

        if(rig.suf == rig.len) res.suf=rig.suf+lef.suf;
        else res.suf=rig.suf;

        res.mx=max(lef.mx,rig.mx);
        res.mx=max(res.mx,lef.suf+rig.pref);
        res.len=lef.len+rig.len;
    }
    void build(int id,int l,int r){
        if(l==r){
            st[id].len=1;
            st[id].pref=st[id].suf=1;
            st[id].mx=1;
            return;
        }
        int mid=(l+r)>>1;
        build(id<<1,l,mid);
        build(id<<1|1,mid+1,r);
        merg(st[id],st[id<<1],st[id<<1|1]);
    }
    void update(int id,int l,int r,int p){
        if(l==r){
            st[id].len=1;
            st[id].mx=0;
            st[id].pref=st[id].suf=0;
            return;
        }
        int mid=(l+r)>>1;
        if(mid<p) update(id<<1|1,mid+1,r,p);
        else update(id<<1,l,mid,p);
        merg(st[id],st[id<<1],st[id<<1|1]);
    }
    node get(int id,int l,int r,int u,int v){
        if(r<u || v<l) return emp;
        if(u<=l && r<=v) return st[id];
        int mid=(l+r)>>1;
        node lef=get(id<<1,l,mid,u,v);
        node rig=get(id<<1|1,mid+1,r,u,v);
        node res;
        merg(res,lef,rig);
        return res;
    }
}ste;
struct seg{
    int st[4*N];
    void update(int id,int l,int r,int p,int val){
        if(l==r){
            st[id]=val;
            return;
        }
        int mid=(l+r)>>1;
        if(mid<p) update(id<<1|1,mid+1,r,p,val);
        else update(id<<1,l,mid,p,val);
        st[id]=max(st[id<<1],st[id<<1|1]);
    }
    int get(int id,int l,int r,int u,int v){
        if(r<u || v<l) return 0;
        if(u<=l && r<=v) return st[id];
        int mid=(l+r)>>1;
        return max(get(id<<1,l,mid,u,v),get(id<<1|1,mid+1,r,u,v));
    }
}stt;
int main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    if(fopen(task".inp","r")){
        freopen(task".inp","r",stdin);
        freopen(task".out","w",stdout);
    }
    cin>>n>>D;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        arr[i]={a[i],i};
    }
    sort(arr+1,arr+1+n,[&](pair<int,int> a,pair<int,int> b){
        if(a.fi == b.fi) return a.se > b.se;
        return a.fi < b.fi;
    });
    emp.pref=1e9;
    ste.build(1,1,n);
    int answer=0;

    for(int i=1;i<=n;i++){
        int p=arr[i].se;
        ste.update(1,1,n,p);
        int l=1,r=p,ans=r;
        while(l<=r){
            int mid=(l+r)>>1;
            node res=ste.get(1,1,n,mid,p);
            if(res.mx+1 > D){
                l=mid+1;
            }else{
                ans=mid;
                r=mid-1;
            }
        }
        int res=1+stt.get(1,1,n,ans,p);
        //cerr<<p<<' '<<res<<'\n';
        stt.update(1,1,n,p,res);
        answer=max(answer,res);
    }
    cout<<answer<<'\n';
}



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

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