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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

AtCoder Grand Contest 012 E Camel and Oases 状压dp

發布時間:2023/12/14 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AtCoder Grand Contest 012 E Camel and Oases 状压dp 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description


有一個容量為V的包,n個接水點,坐標分別為x[]
有兩種移動方式:

  • 若兩個接水點之間的距離不超過此時包的容量v,那么就可以移動
  • 若此時v不等于0,那么可以使v=v/2(下取整),然后跳到任意一個位置
  • 對于每一個接水處作為出發點,分別回答能否到達所有其余接水點
    n,V≤105n,V\le 10^5n,V105
    ?i≤n,  xi≤109\forall i\le n,\; x_i\le10^9?in,xi?109

    Solution


    操作2最多只有logV次,而同一個v能走到的位置是若干不相交的線段
    問題變成:我們在V最大的時候強制選一個線段,每一個v最多選一個線段,問能否選出一個線段的集合覆蓋整個數軸

    考慮狀壓dp,設f[x]表示選擇v狀態為x的時候,從1起能覆蓋到的最右邊,g[x]表示從n起能覆蓋到的最左邊,當f[x]和g[x]在某一個V的線段內部時就是可行的

    一個小trick就是記錄left[j]表示j往右最多到哪里,這樣轉移就非常方便了。最后統計答案的時候要注意一下,一開始寫萎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; }

    總結

    以上是生活随笔為你收集整理的AtCoder Grand Contest 012 E Camel and Oases 状压dp的全部內容,希望文章能夠幫你解決所遇到的問題。

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