AtCoder Grand Contest 012 E Camel and Oases 状压dp
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                AtCoder Grand Contest 012 E Camel and Oases 状压dp
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                Description
有一個容量為V的包,n個接水點,坐標分別為x[]
 有兩種移動方式:
對于每一個接水處作為出發(fā)點,分別回答能否到達所有其余接水點
 n,V≤105n,V\le 10^5n,V≤105
 ?i≤n,  xi≤109\forall i\le n,\; x_i\le10^9?i≤n,xi?≤109
Solution
操作2最多只有l(wèi)ogV次,而同一個v能走到的位置是若干不相交的線段
 問題變成:我們在V最大的時候強制選一個線段,每一個v最多選一個線段,問能否選出一個線段的集合覆蓋整個數(shù)軸
考慮狀壓dp,設(shè)f[x]表示選擇v狀態(tài)為x的時候,從1起能覆蓋到的最右邊,g[x]表示從n起能覆蓋到的最左邊,當f[x]和g[x]在某一個V的線段內(nèi)部時就是可行的
一個小trick就是記錄left[j]表示j往右最多到哪里,這樣轉(zhuǎn)移就非常方便了。最后統(tǒng)計答案的時候要注意一下,一開始寫萎T掉了
Code
#include <stdio.h> #include <string.h> #include <algorithm> #define rep(i,st,ed) for (int i=st;i<=ed;++i) #define fill(x,t) memset(x,t,sizeof(x))const int N=400005;int f[N],g[N],p[N],L[N],R[N],ans[N]; int left[25][N],righ[25][N],bel[N]; int n,V,tot;int read() {int x=0,v=1; char ch=getchar();for (;ch<'0'||ch>'9';v=(ch=='-')?(-1):(v),ch=getchar());for (;ch<='9'&&ch>='0';x=x*10+ch-'0',ch=getchar());return x*v; }void pre(int v,int id) {for (int i=1,j;i<=n;i=j+1) {for (j=i;j<n&&p[j+1]-p[j]<=v;) j++;rep(k,i,j) left[id][i]=j,righ[id][j]=i;} }void solve() {for (int i=0,lim=(1<<tot);i<lim;++i) {g[i]=n+1;}for (int i=0,lim=(1<<tot);i<lim;++i) {rep(j,0,tot-1) if ((i>>j)&1) {f[i]=std:: max(f[i],left[j][f[i-(1<<j)]+1]);g[i]=std:: min(g[i],righ[j][g[i-(1<<j)]-1]);}}for (int i=0,lim=(1<<tot);i<lim;++i) {int j=lim-i-1;if (f[i]+1>=L[bel[f[i]+1]]&&g[j]-1<=R[bel[f[i]+1]]) {ans[bel[f[i]+1]]=1;}} }int main(void) {fill(righ,63);n=read(),V=read();rep(i,1,n) p[i]=read();for (int v=V/2;;v>>=1) {pre(v,tot++);if (!v) break;}for (int i=1,j;i<=n;i=j+1) {bel[i]=++bel[0];for (j=i;j<n&&p[j+1]-p[j]<=V;) bel[++j]=bel[0];L[bel[0]]=i,R[bel[0]]=j;}solve();rep(i,1,n) if (ans[bel[i]]) puts("Possible");else puts("Impossible");return 0; }
總結(jié)
以上是生活随笔為你收集整理的AtCoder Grand Contest 012 E Camel and Oases 状压dp的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: python爬取起点中文网小说
- 下一篇: CF375C Circling Roun
