题意略。

思路:我们要想令 A[i] ^ A[j] < A[j] ^ A[k](i < j < k),由于A[i]和A[k]都要 ^ A[j],所以我们只需研究一下i,k这两个数之间的关系即可。

我们按位来考虑这两个数之间的关系,可以想到,A[i]和A[k]这两个数的最高不相同位决定了A[i] ^ A[j]与A[j] ^ A[k]的大小关系:

(下面用high[ ]来表示A[i]和A[k]这两个数的最高不相同位)

1.如果high[i] = 1,high[k] = 0,那么A[j]的这一位应该是1。

2.如果high[i] = 0,high[k] = 1,那么A[j]的这一位应该是0。

那么,对于每一个A[k],我们枚举它与前面数的最高不相同位来计算它对最后答案的贡献。

现在看看怎么来达到这个目的:

1.我们需要知道A[i]的个数c1,对A[i]的约束即是在最高不相同位的更高位上与A[k]相同,在最高不相同位上与A[k]相异,这个个数我们可以用字典树来维护。

2.我们需要知道A[j]的个数c2,A[j]需要满足的条件是在最高不同位上与A[k]相异,这个我们可以用一个二维数组Cnt[31][2]来维护,

里面记录着从A[1]~A[k - 1]这k - 1个数中在第i位为j的项的个数。

那A[k]的贡献是不是就是c1 * c2了呢?并不是。

有两个不合理的条件:

1.c2中包含了c1,也就是说c1 * c2中有可能有同一个数选了两次的情况。

2.c1 * c2只保证了i < k && j < k,未能保证i < j这个条件。

为了去掉1中的不合理因素,我们只需要减去c1即可。

为了去掉2中的不合理因素,我们可以用illegal[ ]来记录字典树上这个结点的不合理数。怎么记录呢?

每当我们插入这个结点的时候,当前Cnt[ ][ ]数组中存的值都是在当前结点之前出现过的,它们都是当前结点的不合理数。

所以,A[k]的贡献是c1 * c2 - c1 - illegal[cur_node]。

详见代码:

#include<bits/stdc++.h>
#define maxn 500000 * 31
using namespace std;
typedef long long LL; int Cnt[][]; struct Trie{
int relation[maxn][],info[maxn];
LL illegal[maxn]; int root,cnt;
int newnode(){
relation[cnt][] = relation[cnt][] = -;
info[cnt] = illegal[cnt] = ;
return cnt++;
}
void init(){
cnt = ;
root = newnode();
}
void insert(int x){
int cur = root;
++info[cur];
for(int i = ;i >= ;--i){
if(relation[cur][(x>>i) & ] == -)
relation[cur][(x>>i) & ] = newnode();
cur = relation[cur][(x>>i) & ];
illegal[cur] += (Cnt[i][(x>>i) & ]);
++Cnt[i][(x>>i) & ];
++info[cur];
}
}
LL query(int x){
LL ret = ;
int cur = root;
for(int i = ;i >= ;--i){
int numb = ((x>>i) & ),another = - numb;
int idx = relation[cur][another];
LL c = info[idx];
LL temp = c * (Cnt[i][another]) - c - illegal[idx];
ret += temp;
cur = relation[cur][numb];
if(cur == -) break;
}
return ret;
}
}; Trie trie; int main(){
int T;
scanf("%d",&T);
while(T--){
LL ans = ;
int n;
scanf("%d",&n);
trie.init();
memset(Cnt,,sizeof(Cnt));
for(int i = ;i < n;++i){
int temp;
scanf("%d",&temp);
ans += trie.query(temp);
trie.insert(temp);
}
printf("%lld\n",ans);
}
return ;
} /*
1
4
9 8 7 3
*/

HDU 6059的更多相关文章

  1. HDU 6059 - Kanade's trio | 2017 Multi-University Training Contest 3

    思路来自题解(看着题解和标程瞎吉尔比划了半天) /* HDU 6059 - Kanade's trio [ 字典树 ]  |  2017 Multi-University Training Conte ...

  2. hdu 6059 Kanade's trio

    题 OwO http://acm.hdu.edu.cn/showproblem.php?pid=6059 解 由于每个数字最多是30位,枚举数字每一位考虑, 建一棵记录前缀(位的前缀,比如10拆成10 ...

  3. HDU 6059 17多校3 Kanade's trio(字典树)

    Problem Description Give you an array A[1..n],you need to calculate how many tuples (i,j,k) satisfy ...

  4. hdu 6059 Kanade's trio(字典树)

    Kanade's trio Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)T ...

  5. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  7. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  8. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  9. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

随机推荐

  1. Windows系统配置java环境

    1:下载jdk  网址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2:下载 ...

  2. C#汽车租赁系统 完整版

      Truck.cs类 //卡车类 public class Truck : Vehicle1 { //重载 public int Load { get; set; } //构造函数 public T ...

  3. Python解释器安装教程和环境变量配置

    Python解释器安装教程和环境变量配置 Python解释器安装 登录Python的官方网站   https://www.python.org/  进行相应版本的下载. 第一步:根据电脑系统选择软件适 ...

  4. GDB 基本用法

    1.编译文件时需要加上 -g 选项,并非是将源码嵌入可执行文件,只是加入源代码的信息.eg:gcc -g main.c -o main 2.直接按回车键会重复上一条命令 3.基本指令 help,可以查 ...

  5. jboss反序列化漏洞复现(CVE-2017-7504)

    jboss反序列化漏洞复现(CVE-2017-7504) 一.漏洞描述 Jboss AS 4.x及之前版本中,JbossMQ实现过程的JMS over HTTP Invocation Layer的HT ...

  6. redis订阅者与发布者

    #conding=utf-8 #一.创建redis类 文件名 RedisHelper import redis # conn=redis.Redis(host='127.0.0.1')# import ...

  7. nginx 301跳转https后post请求失效问题解决

    app本地请求是http端口,后来升级https强制301跳转,设置如下 server { listen 80; server name www.XXX.com; rewrite ^/(.*)$ ht ...

  8. 以太坊solidity智能合约-生成随机数

    Solidity随机数生成 在以太坊的只能合约中,没有提供像其他面向对象编程一样的生成随机数的工具类或方法.其实,所谓的随机数也是伪随机的,没有哪一种语言能够真正的生成随机数. 对于solidity来 ...

  9. Linux常用的命令及使用方法

    1.请用命令查出ifconfig命令程序的绝对路径 [root@localhost ~]# which ifconfig(ifconfig是linux中用于显示或配置网络设备(网络接口卡)的命令) / ...

  10. 以太坊RLPx传输协议

    本文主要内容翻译自:The RLPx Transport Protocol,其中添加了一些个人的理解,由于密码学水平有限,不正确之处望指正.另外原文可能已经更新,最新内容请直接阅读原文. 本文档定义了 ...