HDU 5715

原创 2016年05月31日 14:45:44

看的别人的博客写的很好点击打开链接

代码如下

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>

using namespace std;
typedef long long ll;
#define rep(i,n) for(int i = 0 ; i<(int)n;i++)
#define rep1(i,x,y) for(int i=(int)x;i<=(int)y;i++)
#define lowbit(x) (x&-x)

const int N =10010;

struct trie{
    int son[N*32][2], tim[N*32], tot;
    void init(){
        son[0][0] = son[0][1] = tot = 0;
        tim[0] = 1;
    }
    void insert(int val){
        int t = 0;
        for(int i = 30; i >= 0; --i){
            int c = (val >> i) & 1;
            if(son[t][c] == 0){
                son[t][c] = ++tot;
                son[tot][0] = son[tot][1] = tim[tot] = 0;
            }
            t = son[t][c];
            tim[t]++;
        }
    }
    void del(int val){
        int t = 0;
        for(int i = 30; i >= 0; --i){
            int c = (val >> i) & 1;
            int tt = t;
            t = son[t][c];
            tim[t]--;
            if(tim[t] == 0){
                son[tt][c] = 0;
                break;
            }
        }
    }
    int query(int val){
        int ret = 0, t = 0;
        for(int i = 30; i >= 0; --i){
            int c = (val >> i) & 1;
            if(son[t][c^1]){
                t = son[t][c^1];
                ret += (1 << i);
            }
            else {
                t = son[t][c];
            }
        }
        return ret;
    }
}tree[15];

int n,m,L;
bool d[N][11];
int a[N];
bool judge(int x){
    memset(d , 0 , sizeof(d));
    d[0][0] = 1;
    rep(i , m + 1) tree[i].init();
    tree[0].insert(0);

    for(int i = 1 ; i<=n ; i++){
         rep(j , m){
             if(i > L && d[i - L - 1][j])
                   tree[j].del(a[i - L - 1]);
         }
         for(int j = m ; j>=1 ; j--){
             if(tree[j - 1].query(a[i]) >= x){
                    d[i][j] = true;
                    tree[j].insert(a[i]);
             }
         }
    }
    return d[n][m];
}
int main()
{
    int T , kase = 1;
    scanf("%d",&T);
    while(T--){
        scanf("%d %d %d",&n,&m,&L);
        rep1(i,1,n) scanf("%d",&a[i]) , a[i]^=a[i-1];
        int l = 0 , r = 1e9 + 100;
        while(l < r){
            //cout<<l <<" "<<r<<endl;
            int mid =(l + r)/2;
            if(judge(mid)) l = mid + 1;
            else r = mid;
        }
        printf("Case #%d:\n%d\n",kase++,l - 1);
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

HDU 5715 & 2016"百度之星" 复赛(Astar Round3)1004 XOR游戏(Trie)

题意:众所周知,度度熊喜欢XOR运算(XOR百科)。 今天,它发明了一种XOR新游戏,最开始,它有一个长度为N的数组,度度熊可以任意添加分割线,将数组划分为M段,且每段长度小于等于L。 当然这是个...

TV5715.视频处理芯片

  • 2013-11-25 18:37
  • 135KB
  • 下载

hdu2000-2012(C++)答案

【2017多校】HDU6035 Colorful Tree 【听说是树形DP】

官方题解:单独考虑每一种颜色,答案就是对于每种颜色至少经过一次这种的路径条数之和。反过来思考只需要求有多少条路径没有经过这种颜色即可。直接做可以采用虚树的思想(不用真正建出来),对每种颜色的点按照 d...

.net作业源代码hdu

  • 2013-08-08 19:50
  • 1.84MB
  • 下载

hdu1290解题报告

  • 2014-07-10 20:42
  • 17KB
  • 下载

hdu5520 最小费用最大流

hdu5520 Number LinkTime Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth...

hdu acm1166线段树

HDU 2000-2099 解题报告

  • 2012-08-09 10:38
  • 831KB
  • 下载

hdu3507 斜率优化

Problem Description Zero has an old printer that doesn’t work well sometimes. As it is antique, he ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)