在芬威克树中的计算

时间:2016-10-11 10:02:19

标签: c fenwick-tree

在fenwick树中,要计算直到给定索引的总和,您将获得二进制字符串形式的索引,现在您必须计算使用树计算总和所涉及的步骤数?时间限制为1秒,字符串长度为< = 1000002000

实施例。输入: 4 001 100 011 4 1000 1101 100 3 1010 001 101 4 010 101 000 4 输出: 6 12 8 10

约束

1≤t≤300; 1≤长度(Li)≤1000; 1≤n≤10^ 6

我的方法:

#include <stdio.h>
#include <string.h>
int main(void)
{
    int t,i,j,n,length,flag,pos,finalpos,zero,one;
    char L1[1001],L2[1001],L3[1001];
    long long int count;
    scanf("%d",&t);
    while(t--)
    {
        finalpos=0;
        count=0;
        scanf("%s %s %s %d",L1,L2,L3,&n);
        length = strlen(L1)+n*strlen(L2)+strlen(L3)+1;
        char L[length];
        L[0]='\0';
        strcat(L,L1);
        for(i=0;i<n;i++)
            strcat(L,L2);
        strcat(L,L3);
        for(i=0;i<=length-2;i++)
        {
            if(L[i]=='1')
            {
                finalpos=i;
                break;
            }
        }
        pos = length-2;
        while(L[finalpos]=='1')
        {
            for(i=pos;i>=finalpos;i--)
            {
                if(L[i]=='0')
                {
                    break;
                }
                else
                    L[i]='0';
            }
            if(L[finalpos]=='0')
                break;
            for(i=pos;i>=finalpos;i--)
            {
                if(L[i]=='1')
                {
                    L[i]='0';
                    pos = i;
                    break;
                }
                else
                    L[i]='1';
            }

            count++;
        }
        printf("%lld\n",count+1);
    }
    return 0;
}   

0 个答案:

没有答案