题意略。

思路:我们要想令 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. springboot-权限控制shiro(一)

    1. 场景描述 (1)权限控制是IT项目特别是企业项目,绕不开的重要模块,接下来结合springboot介绍下权限控制框架shiro. (2)springboot集成shiro的东西有点多,一篇博客完 ...

  2. ironic+nova详解

    ironic+nova详解 说明: Openstack 的安装步骤省略,按照社区的文档即可搭建出一套相对稳定的使用环境.本文档基于Newton版本. 假设现在已经有一套可用的Newton环境, 以下的 ...

  3. 基于SpringBoot从零构建博客网站 - 新增创建、修改、删除专栏功能

    守望博客是支持创建专栏的功能,即可以将一系列相关的文章归档到专栏中,方便用户管理和查阅文章.这里主要讲解专栏的创建.修改和删除功能,至于专栏还涉及其它的功能,例如关注专栏等后续会穿插着介绍. 1.创建 ...

  4. BGP属性控制实验

    目录 实验拓扑 实验需求 实验步骤 个人小结: 实验拓扑 实验需求 更改BGP路由的属性让R4访问R1优先选R2这条路 实验步骤 1. 按照图示配置IP地址及环回口地址 R1 [R1]int g0/0 ...

  5. spring注解不支持静态变量注入

    spring注解不支持静态变量注入:今天敲代码  自动配置 配置: Animal.java package study01_autoconfig.beanConfig; import org.spri ...

  6. C# Winform 自定义控件——TextBox

    效果:   描述: 类似html标签里input标签里的placeHolder属性,控件继承TextBox,拥有一个描述提示信息的字段_txtPlaceHolder,重写了消息处理函数WndProc, ...

  7. 爬虫环境搭建及 scrapy 启动

    创建虚拟环境 C:\Users\Toling>mkvirtualenv article 这个是普通的创建虚拟环境,但是实际开发中可能会使用python2或python3所以我们需要指定开发的环境 ...

  8. CentOS7.6源码编译安装PHP 7.3.8

    安装步骤 PHP官网下载链接:https://www.php.net/downloads.php 1. 使用wget命令下载源码安装包 wget https://www.php.net/distrib ...

  9. linux环境下搭建自动化Jenkins管理工具

    一.搭建一个jak--tomcat服务器到自己的linux服务器上 具体的服务器搭建这里可以参考华华大佬的博客:https://www.cnblogs.com/liulinghua90/p/46614 ...

  10. 牛客多校训练第八场C.CDMA(思维+构造)

    题目传送门 题意: 输入整数m( m∈2k ∣ k=1,2,⋯,10),构造一个由1和-1组成的m×m矩阵,要求对于任意两个不同的行的内积为0. 题解: Code: #include<bits/ ...