AtCoder Grand Contest 012 E - Camel and Oases 状压dp
題意
平面上有n個(gè)點(diǎn)。初始有V的權(quán)值,每次可以從一個(gè)點(diǎn)走到與他距離不超過V的點(diǎn),當(dāng)V>0時(shí)也可以讓V/2且到達(dá)任意一個(gè)點(diǎn)。問從每個(gè)點(diǎn)出發(fā)能否遍歷所有點(diǎn)。
n,V<=200000
分析
顯然只有O(logV)O(logV)種不同的步數(shù)。
當(dāng)權(quán)值VV被固定后,整條鏈被分成若干個(gè)區(qū)間,每個(gè)區(qū)間內(nèi)的點(diǎn)可以互達(dá)。
把每一種VV對應(yīng)的所有區(qū)間求出來后,不難發(fā)現(xiàn)兩個(gè)區(qū)間要么是相離關(guān)系,要么是包含關(guān)系。
從某個(gè)點(diǎn)出發(fā)能否遍歷所有點(diǎn),就相當(dāng)于把該點(diǎn)能通過權(quán)值VV到達(dá)的點(diǎn)去掉,問能否用除了VV以外的權(quán)值對應(yīng)的區(qū)間去覆蓋整條線段。
這個(gè)可以狀壓dp:
設(shè)f[S]f[S]表示用SS里面的權(quán)值從左往右覆蓋數(shù)軸,最大能到達(dá)的右端點(diǎn)。
g[S]g[S]表示最小能到達(dá)的左端點(diǎn)。
然后答案就很好求了。
代碼
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define MAX(x,y) x=max(x,y) #define MIN(x,y) x=min(x,y) #define inf 0x3f3f3f3f using namespace std;const int N=400005;int n,v,g[N*2],f[N*2],bin[25],tot,len[25],lef[25][N],rig[25][N],a[N],bel[N],p1[N],p2[N]; bool ans[N];int read() {int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f; }void dp() {bin[0]=1;for (int i=1;i<=tot;i++) bin[i]=bin[i-1]*2;for (int i=0;i<bin[tot];i++) g[i]=n+1;for (int i=0;i<bin[tot];i++)for (int j=0;j<=tot;j++)if (!(i&bin[j])) MAX(f[i+bin[j]],rig[j][f[i]+1]),MIN(g[i+bin[j]],lef[j][g[i]-1]);for (int i=0;i<bin[tot];i++){int l=f[i],r=g[i^(bin[tot]-1)];if (l+1>=r){for (int j=1;j<=n;j++) ans[j]=1;return;}if (p1[bel[l+1]]<=l+1&&p2[bel[l+1]]>=r-1) ans[bel[l+1]]=1;} }int main() {n=read();v=read();for (int i=1;i<=n;i++) a[i]=read();tot=0;len[0]=0;while (v) len[++tot]=v,v>>=1;sort(len,len+tot+1);memset(lef,inf,sizeof(lef));for (int i=0;i<tot;i++)for (int j=1;j<=n;j++){int l=j;while (l<n&&a[l+1]-a[l]<=len[i]) l++;rig[i][j]=l;lef[i][l]=j;j=l;}int id=0;for (int j=1;j<=n;j++){int l=j;bel[j]=++id;while (l<n&&a[l+1]-a[l]<=len[tot]) l++,bel[l]=id;p1[id]=j;p2[id]=l;j=l;}dp();for (int i=1;i<=n;i++) puts(ans[bel[i]]?"Possible":"Impossible");return 0; }總結(jié)
以上是生活随笔為你收集整理的AtCoder Grand Contest 012 E - Camel and Oases 状压dp的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 旧电脑装什么系统最快_旧电脑装什么系统好
- 下一篇: WebService的知识总结(一)