zoukankan      html  css  js  c++  java
  • [AGC012E] Camel and Oases

    #include <bits/stdc++.h>
    const int N=200005;
    int n,v,a[N],dl[N][20],dr[N][20],pre[1<<20],suf[1<<20],dp[N],W;
    int main(){
    	scanf("%d%d",&n,&v);
    	for (int i=1;i<=n;i++) scanf("%d",&a[i]);
    	W=0;
    	while (v>>W) W++;
    	W++;
    	for (int i=0;i<W;i++) dl[1][i]=1,dr[n][i]=n,dr[n+1][i]=n,dl[0][i]=1;
    	for (int i=2;i<=n;i++)
    		for (int k=0;k<W;k++)
    			if (a[i]-a[i-1]<=(v>>k)) dl[i][k]=dl[i-1][k];
    			else dl[i][k]=i;
    	for (int i=n-1;i>=1;i--)
    		for (int k=0;k<W;k++)
    			if (a[i+1]-a[i]<=(v>>k)) dr[i][k]=dr[i+1][k];
    			else dr[i][k]=i;
    	for (int i=0;i<(1<<W);i++)
    		for (int k=0;k<W;k++){
    			if (i&(1<<k)) continue;
    			pre[i|(1<<k)]=std::max(pre[i|(1<<k)],dr[pre[i]+1][k]);
    		}
    	for (int i=0;i<(1<<W);i++) suf[i]=n+1;
    	for (int i=0;i<(1<<W);i++)
    		for (int k=0;k<W;k++){
    			if (i&(1<<k)) continue;
    			suf[i|(1<<k)]=std::min(suf[i|(1<<k)],dl[suf[i]-1][k]);
    		}
    	int all=(1<<W)-1-1;
    	memset(dp,0x3f,sizeof(dp));
    	for (int i=0;i<(1<<W);i+=2)
    		dp[pre[i]]=std::min(dp[pre[i]],suf[all^i]);
    	for (int i=n;i>=0;i--) dp[i]=std::min(dp[i],dp[i+1]); 
    	for (int i=1;i<=n;i++){
    		if (dp[dl[i][0]-1]<=dr[i][0]+1) puts("Possible");
    		else puts("Impossible");
    	}
    }
    
    * 生而自由 爱而无畏 *
  • 相关阅读:
    2017 多校联合训练 8 题解
    2017 多校联合训练 7 题解
    2017 多校联合训练 6 题解
    2017 多校联合训练 5 题解
    2017 多校联合训练 4 题解
    windows 安装python
    pygame 使用
    python 发布
    面向对象的思维方法
    python 基础
  • 原文地址:https://www.cnblogs.com/flyfeather6/p/14380971.html
Copyright © 2011-2022 走看看