Codeforces Gym 100623F Problem F. Fenwick Tree

来源:互联网 发布:nosql数据库入门 编辑:程序博客网 时间:2024/05/31 15:19

题目传送门:http://codeforces.com/gym/100623/attachments


题解:一个找规律的题,b[2]=a[2]要求a[1]=0,b[4]=a[4]要求a[2]+a[3]=0,b[6]=a[6]要求a[5]=0,b[8]=a[8]要求a[4]+a[6]+a[7]=0,到这里就可以看出来规律了,一个偶数可以对2^n取余为0,则要求他前面的n个数和为0,这个n个数的递减规律是1.1.2.4.8.16....2^n,这样,然后写一下就可以了


Code:

#include <iostream>#include <cstdio>using namespace std;int main(){    freopen("fenwick.in","r",stdin);    freopen("fenwick.out","w",stdout);    int t,n,flag;    long long a[100005],sum;    long long n2[16]={2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536};    long long b[16]={1,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384};    while(cin>>n)    {        for(int i=1;i<=n;i++)            scanf("%lld",&a[i]);        for(int i=2;i<=n;i+=2)        {            sum=0;            flag=-1;            t=i;            for(int j=0;j<16;j++)            {                if(i%n2[j]==0)                    flag=j;                else                    break;            }            for(int j=0;j<flag;j++)            {                t-=b[j];                sum+=a[t];            }            t-=b[flag];            a[t]=-sum;        }        for(int i=1;i<=n;i++)            i==n?cout<<a[i]<<endl:cout<<a[i]<<" ";    }    return 0;}


0 0