萌新求调qwq
查看原帖
萌新求调qwq
536362
baibaieee楼主2025/1/12 17:26

rt。

#include<bits/stdc++.h>
using namespace std;
const int MAXN=200005;
int pos[MAXN];
int vv[25],cnt;
int n,V;
int segl[MAXN][25],segr[MAXN][25],ans[MAXN];
int dp[2][MAXN];
int main() {
    cin>>n>>V;
    for(int i=1;i<=n;i++)cin>>pos[i];
    int tmp=V; 
    while(tmp){
		tmp>>=1;
        vv[cnt]=tmp; 
		cnt++;
    }
	vv[cnt]=V;
    for(int i=0;i<=cnt;i++){
        int id=1;
        int tmp=0;
        for(int j=1;j<=n;j++){
            if(j==1||pos[j]-pos[j-1]>vv[i])segl[j][i]=j,tmp++;
            else segl[j][i]=segl[j-1][i];
        }
        for(int j=n;j>=1;j--){
            if(j==n||pos[j+1]-pos[j]>vv[i])segr[j][i]=j;
            else segr[j][i]=segr[j+1][i];
        }
        if(i==cnt&&tmp>=25){
        	for(int j=1;j<=n;j++)cout<<"Impossible\n";
        	return 0;
		}      
    }
    for(int i=0;i<(1<<cnt);i++)dp[1][i]=n+1;
    for(int i=0;i<(1<<cnt);i++){
        for(int j=0;j<=cnt;j++){
            if((1<<j)&i)continue;
            int new_state=i|(1<<j);
            dp[0][new_state]=max(dp[0][new_state],segr[dp[0][i]+1][j]);
            dp[1][new_state]=min(dp[1][new_state],segl[dp[1][i]-1][j]); 
        }
    }
    for(int i=1;i<=n;i++){
        bool flag=0;
        for(int j=0;j<(1<<cnt);j++){
            int state1=j,state2=((1<<cnt)-1)^j;
            if(dp[0][j]>=segl[i][cnt]-1&&dp[1][state2]<=segr[i][cnt]+1){
                flag=1;
                break;
            }
        }
        for(int j=i;j<=segr[i][cnt];j++)ans[j]=flag;
        i=segr[i][cnt];
    }
    for(int i=1;i<=n;i++)cout<<(ans[i]?"Possible":"Impossible")<<endl;
    return 0;
}

2025/1/12 17:26
加载中...