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;
}

浙公网安备 33010602011771号