N. Best Solution Unknown 题解

N. Best Solution Unknown 题解

[ N. Best Solution Unknown ]( Problem - N - Codeforces )

怎么也没想到竟然是线段树!

我是大笨蛋呜呜~

参考大佬博客: N. Best Solution Unknown(线段树+思维)_2020-2021 winter petrozavodsk camp, day 5: almost -CSDN博客

大佬讲得非常棒,博主实力不够,遂题解以后再补~~

思路

代码如下

#include <bits/stdc++.h>
using namespace std;
//-------------------------------------------------------------------------------------------
#define int long long 
#define lost_R ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define P pair<int,int>
#define lowbit(x) (x&(-x))
#define dbg1(x) cout<<"# "<<x<<endl
#define dbg2(x,y) cout<<"# "<<x<<" "<<y<<endl
#define endl '\n'
const int mod=998244353;
const int N=2e6+10;
const int INF=0x3f3f3f3f3f3f3f3f;
const int inf=0x3f3f3f3f;
using ar3=array<int,3>;
using ar2=array<int,2>;
//--------------------------------------------------------------------------------------
int n;
int a[N];
int tr[N<<2];
#define ls id<<1
#define rs id<<1|1
int MAX(int x,int y){
    if(a[x]>=a[y]) return x;
    else return y;
}
void bui(int id,int l,int r){
    tr[id]=0;
    if(l==r){
        tr[id]=l;
        return;
    }
    int mid=l+r>>1;
    bui(ls,l,mid);
    bui(rs,mid+1,r);
    tr[id]=MAX(tr[ls],tr[rs]);
}
int query(int id,int l,int r,int ql,int qr){
    if(ql<=l&&qr>=r) return tr[id];
    int ans=0;
    int mid=l+r>>1;
    if(ql<=mid) ans=query(ls,l,mid,ql,qr);
    if(qr>mid) ans=MAX(ans,query(rs,mid+1,r,ql,qr));
    return ans;
}
int ok[N];
void dfs(int l,int r,int c){
    if(l>r) return;
    if(l==r){
        if(a[l]>=c) ok[l]=1;
        return;
    }
    int mx_id=query(1,1,n,l,r);
    if(a[mx_id]+r-l>=c){
        ok[mx_id]=1;
        int cc=max(a[mx_id],c+mx_id-r-1);
        dfs(l,mx_id-1,cc);
        cc=max(a[mx_id],c+l-mx_id-1);
        dfs(mx_id+1,r,cc);
    }
}
void solve(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }    
    if(n==1){
        cout<<1<<endl<<1<<endl;
        return;
    }
    bui(1,1,n);
    dfs(1,n,0);
    int ans=0;
    for(int i=1;i<=n;i++){
        if(ok[i]) ans++;
    }
    cout<<ans<<endl;
    for(int i=1;i<=n;i++){
        if(ok[i]) cout<<i<<' ';
    }
    cout<<endl;
}
signed main(){
    lost_R;
    // freopen("jia.in","r",stdin);
    // freopen("jia.out","w",stdout);
    int T=1;
    //cin>>T;
    for(int i=1;i<=T;i++){
        solve();
    }
    return 0;
}
posted @ 2025-08-08 22:37  RYRYR  阅读(2)  评论(0)    收藏  举报