• *hdu 5536(字典树的运用)



    Input
    The first line of input contains an integer T indicating the total number of test cases.

    The first line of each test case is an integer n, indicating the number of chips produced today. The next line has n integers s1,s2,..,sn, separated with single space, indicating serial number of each chip.

    1T1000
    3n1000
    0si109
    There are at most 10 testcases with n>100
     
    Output
    For each test case, please output an integer indicating the checksum number in a line.
     
    Sample Input
    2 3 1 2 3 3 100 200 300
     
    Sample Output
    6 400


    题意:求下面这个公式的最大值:
    maxi,j,k(si+sj)sk

    思路:如果用普通方法你要分别枚举3个数,n^3感觉会超时的。

    然而完全莫有想到能用字典树,你先把所有的数保存下来,然后删去要用的i和j,再在里面找出能和a[i]+a[j]异或

    出的最大值。相当于值需要枚举i和j即可。          /*好机智


    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <queue>
    #include <vector>
    #include <algorithm>
    #include <functional>
    typedef long long ll;
    using namespace std;
    
    int a[1005];
    
    struct node
    {
        int number;
        int flag;
        int next[2];
        void ini()
        {
            next[0] = next[1] = 0;
            flag = 0;
        }
    } pnode[1000005];
    int root = 0;
    int tot;
    
    void inser(int x)
    {
        int tt = root;
        for(int i = 30; i >= 0; i --)
        {
            int t;
            if(x & (1<<i))t = 1;
            else  t = 0;
            if(!pnode[tt].next[t])
            {
                pnode[tt].next[t] = ++tot;
                pnode[tot].number = t;
            }
            tt = pnode[tt].next[t];
            pnode[tt].flag++;
        }
    }
    
    void delet(int x)
    {
        int tt = root;
        for(int i = 30; i >= 0; i--)
        {
            int t;
            if(x & (1<<i))t = 1;
            else  t = 0;
            tt = pnode[tt].next[t];
            pnode[tt].flag --;
        }
    }
    
    int query(int x)
    {
        int tt = root;
        for(int i = 30; i >= 0; i--)
        {
            int t;
            if(x & (1<<i)) t = 1;
            else t = 0;
            if(t == 1)
            {
                int nex = pnode[tt].next[0];
                if(pnode[nex].flag > 0 && nex) tt = pnode[tt].next[0];
                else
                {
                    tt = pnode[tt].next[1];
                    x ^= (1<<i);
                }
            }
            else
            {
                int nex = pnode[tt].next[1];
                if(pnode[nex].flag > 0 && nex)
                {
                    tt = pnode[tt].next[1];
                    x ^= (1<<i);
                }
                else tt = pnode[tt].next[0];
            }
        }
        return x;
    }
    
    int main()
    {
        int T,n;
        scanf("%d",&T);
        while(T--)
        {
            int ans = 0;
            scanf("%d",&n);
            tot = 0;
            for(int i = 0; i < n; i++)   scanf("%d",a+i);
            for(int i = 0; i < n; i++)   inser(a[i]);
    
            for(int i = 0; i < n; i++)
            {
                delet(a[i]);
                for(int j = i+1; j < n; j++)
                {
                    delet(a[j]);
                    ans = max(ans,query(a[i] + a[j]));
                    inser(a[j]);
                }
                inser(a[i]);
            }
            for(int i = 0;i < tot;i++)
            {
                pnode[i].ini();
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    PyCharm 的使用(二)
    redis数据库
    mysql大全
    Python 模块详解及import本质
    logging模块
    redis详细配置
    千万 PV,百万PV什么意思?
    elasticsearch集群添加节点
    elasticsearch集群安全重启节点
    记一次redis-cluster的切换
  • 原文地址:https://www.cnblogs.com/Przz/p/5409689.html
Copyright © 2020-2023  润新知