agc012E Camel and Oases(状压dp+思路题)
生活随笔
收集整理的這篇文章主要介紹了
agc012E Camel and Oases(状压dp+思路题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這題神啊。狀壓dp你敢信?思維難度爆表還有一堆細節要注意???orz Visjiao
原題鏈接:http://agc012.contest.atcoder.jp/tasks/agc012_e
大神題解:http://blog.csdn.net/vicjiao/article/details/78405844
tips:dp數組大小要開到2*V,因為最多可以飛log2v+1次,所以是2log2v+1?1,而不是v。坑啊orz
#include <bits/stdc++.h> using namespace std; #define ll long long #define inf 0x3f3f3f3f #define N 200010 inline 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; } int n,v,tot=-1,bin[22],R[22][N],num[22],f1[N<<3],f2[N<<3],a[N];//R[i][k],第i層的第k條線段的右端點 //num[i],第i層的線段條數 f1[s],選擇s狀態的層數,左邊從1開始最遠能覆蓋到哪里 int main(){ // freopen("a.in","r",stdin);n=read();v=read();bin[0]=1;for(int i=1;i<=20;++i) bin[i]=bin[i-1]<<1;for(int i=1;i<=n;++i) a[i]=read();int x=v*2;while(x){x/=2;tot++;for(int i=1;i<=n-1;++i){if(a[i+1]-a[i]<=x) continue;R[tot][++num[tot]]=i;}R[tot][++num[tot]]=n;}if(num[0]>tot+1){for(int i=1;i<=n;++i) puts("Impossible");return 0;}for(int s=0;s<=bin[tot]-1;++s) f2[s]=n+1;for(int s=0;s<=bin[tot]-1;++s)for(int i=1;i<=tot;++i){if(s&bin[i-1]) continue;f1[s|bin[i-1]]=max(f1[s|bin[i-1]],*upper_bound(R[i]+1,R[i]+num[i]+1,f1[s]));f2[s|bin[i-1]]=min(f2[s|bin[i-1]],R[i][lower_bound(R[i]+1,R[i]+num[i]+1,f2[s]-1)-R[i]-1]+1);}for(int i=1;i<=num[0];++i){bool flag=0;for(int s=0;s<=bin[tot]-1;++s)if(f1[s]>=R[0][i-1]&&f2[bin[tot]-1-s]<=R[0][i]+1){flag=1;break;}for(int j=R[0][i-1]+1;j<=R[0][i];++j) puts(flag?"Possible":"Impossible");}return 0; }總結
以上是生活随笔為你收集整理的agc012E Camel and Oases(状压dp+思路题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: displayTag使用详解
- 下一篇: 起点小说网小说爬取