NOIP训练营动态规划内部训练题!

Posted 信息学竞赛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIP训练营动态规划内部训练题!相关的知识,希望对你有一定的参考价值。

点击上面微信号关注我关注我哟 定期推送帐号信息学新闻竞赛自主招生信息学专业知识信息学疑难解答信息学训练营信息等诸多优质内容的微信平台,欢迎分享文章给你的朋友或者朋友圈!有任何问题请联系小编!

  

清北学堂2018年1月省选强化班模拟考试

NOIP训练营动态规划内部训练题!


#include<cstdio>

#include<iostream>

using namespace std;

typedef long long LL;

#define N 100001


int bit[31];

int tr[N*30][2],sum[N*30];

int k;

int tot=1,root=1;

LL ans;


void read(int &x)

{

    x=0; char c=getchar();

    while(!isdigit(c)) c=getchar();

    while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }

}


void insert(int x)

{

    int now=root;

    bool j;

    for(int i=30;i>=0;--i)

    {

        j=x&bit[i];

        if(!tr[now][j]) tr[now][j]=++tot;

        now=tr[now][j];

        sum[now]++;

    }

}


void query(int x)

{

    int now=root;

    bool l,r;

    for(int i=30;i>=0;--i)

    {

        if(!now) return;

        l=x&bit[i];

        r=l^1;

        if(k&bit[i])

        {

            ans+=sum[tr[now][l]];

            now=tr[now][r];

        }

        else now=tr[now][l];

    }

}


int main()

{

    freopen("bit.in","r",stdin);

    freopen("bit.out","w",stdout);

    bit[0]=1;

    for(int i=1;i<=30;++i) bit[i]=bit[i-1]<<1;

    int n,x;

    read(n); read(k);

    insert(0);

    int pre=0;

    for(int i=1;i<=n;++i)

    {

        read(x);

        pre^=x;

        query(pre);

        insert(pre);

    }

    cout<<ans;

}

sum[r]^sum[l-1]<k

对前缀异或和建trie树

假设当前是第i位,sum[r]的地i位是l

如果k的第i位为1,累加l,当前指针转到sum[r]的l^1

否则,当前指针直接转到sum[r]的l

NOIP训练营动态规划内部训练题!

NOIP训练营动态规划内部训练题!

往期精选

清北金牌教研团队助你圆梦OI!





(1)

(2)

(3)

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.


(9)

关注「信息学竞赛」

看更多信息学趣闻与知识

↓↓

以上是关于NOIP训练营动态规划内部训练题!的主要内容,如果未能解决你的问题,请参考以下文章

动态规划复习(持续更新)

2018年暑假ACM个人训练题9(动态规划)解题报告

动态规划训练之三

cqyz oj | 训练题HB办证 P1419 | DP动态规划

LeetCode动态规划训练营(1~5天)

动态规划训练之十八