日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

agc012E Camel and Oases(状压dp+思路题)

發布時間:2023/12/14 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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??影rz

#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+思路题)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。