一道画风清奇的数位dp

来源:互联网 发布:龙泉驾校网络上课流程 编辑:程序博客网 时间:2024/06/05 10:25



这道题画风清奇,标程跑的样例都不对,我深感困惑

理解了2h最后无功而返(其实还是基本看懂了 /捂脸熊)

最后不知道怎么搞来发篇blog 等我会了 就好好写题解 上面的不够好。


#include<cmath>#include<ctime>#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<iomanip>#include<vector>#include<string>#include<bitset>#include<queue>#include<set>#include<map>using namespace std;typedef long long ll;inline ll read(){ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}void print(ll x){if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');}const int N=200100;const ll inf=0X3f3f3f3f3f3f3f3f;ll f[61][N][2],a[N],b[2][N];int len[2],cnt[2];int main(){int n=read();register int i,j,k,sum;register bool t;ll tmp,mn=inf;for(i=1;i<=n;++i)a[i]=read(),mn=min(mn,a[i]);for(i=1;i<=n;++i){t=a[i]&1;cnt[t]++;b[t][++len[t]]=a[i];}if(!(cnt[1]&1))mn&1?f[0][0][0]=1:f[0][0][1]=1;if(!(cnt[0]&1))mn&1?f[0][cnt[0]][0]=1:f[0][cnt[0]][1]=1;for(i=1;i<=len[0];++i)a[i]=b[0][i];for(i=1;i<=len[1];++i)a[i+len[0]]=b[1][i];len[0]=len[1]=0;for(i=1;i<60;++i){cnt[0]=cnt[1]=0;sum=0;tmp=1ll<<i;for(j=1;j<=n;++j)a[j]&tmp?cnt[1]++:cnt[0]++;for(j=0;j<=n;++j){for(k=0;k<2;++k){if(!(cnt[1]&1))mn&tmp?f[i][sum][0]+=f[i-1][j][k]:f[i][sum][k]+=f[i-1][j][k];if(!(cnt[0]&1))mn&tmp?f[i][cnt[0]+sum][k]+=f[i-1][j][k]:f[i][cnt[0]+sum][1]+=f[i-1][j][k];}if(a[j+1]&tmp)cnt[0]++,cnt[1]--;else cnt[0]--,cnt[1]++,sum++;if(j){t=a[j]&tmp;b[t][++len[t]]=a[j];}}for(j=1;j<=len[0];++j)a[j]=b[0][j];for(j=1;j<=len[1];++j)a[j+len[0]]=b[1][j];len[0]=len[1]=0;}cout<<f[59][0][0]<<endl;return 0;}/*44 6 8 102*/

原创粉丝点击