BZOJ1534/POI2005 Fibonacci sums

首先把两个序列相加得到初始序列.之后就对初始序列进行调整:
对于f[i]>=2的情况可以根据2*f[i]=f[i]+f[i-1]+f[i-2]=f[i+1]+f[i-2]转化为f[i-2]++,f[i+1]++.
对于f[i]=1&&f[i+1]=1,根据f[i+2]=f[i]+f[i-1]转化为给f[i+2]赋值.

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int M=1e6+5;
int n,m,A[M],B[M],C[M];
inline void sc(int x){
    if(x)putchar('1');
    else putchar('0');
}
inline void rd(int &res){
    res=0;char c;
    while(c=getchar(),c<48);
    do res=(res<<1)+(res<<3)+(c^48);
    while(c=getchar(),c>=48);
}
void Up(int k){
    while(C[k]){
        C[k]=0;
        C[k-1]=0;
        C[k+1]++;
        k=k+2;
    }
}
void trans(int i){
    if(C[i]<2)return;
    int k=i-2;
    if(i==2)k++;
    if(i>1)C[k]++;
    C[i+1]++;
    C[i]-=2;
}
int main(){
    int tot=0,i,j,k,len;
    rd(n);
    for(i=1;i<=n;i++)rd(A[i]);
    rd(m);
    for(j=1;j<=m;j++)rd(B[j]);
    len=max(n,m);
    int L=0,R=0;
    for(i=len;i>=1;i--){
        C[i]+=A[i]+B[i];
        if(C[i]>=2){
            trans(i);
            trans(i+1);
            if(i==1)trans(1);
        }
        if(C[i])Up(i+1);
        if(C[i+1])Up(i+2);
        if(C[i+2])Up(i+3);// 
    }
    while(C[len+1])len++;
    if(C[len+2])len+=2;
    while(C[len+1])len++;
    printf("%d ",len);
    for(i=1;i<len;i++){
        sc(C[i]);
        putchar(' ');
    }
    sc(C[len]);
    return 0;
}
展开阅读全文

没有更多推荐了,返回首页