题意略。

思路:我们要想令 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. Java EE.Servlet.生成响应

    Servlet的核心职责就是根据客户端的请求生成动态响应. 1.编码类型 2.流操作(下载文件) servlet支持两种格式的输入/输出流.一种是字符输入输出流.另一种是字节输入输出流. 3.重定向

  2. 把Asp.net Core程序代码部署到Ubuntu(不含数据库)

    今天记录一下第一次把.net core 程序发布到linux系统.linux用的是ubuntu Server 18.04版本.运行的IDE是vs 2019,发布出来是.net core 2.2版本. ...

  3. 分析了京东内衣销售记录,告诉你妹子们的真Size!

    >今天闲暇之余写了一个爬虫例子.通过爬虫去爬取京东的用户评价,通过分析爬取的数据能得到很多结果,比如,哪一种颜色的胸罩最受女性欢迎,以及中国女性的平均size(仅供参考哦~) 打开开发者工具-n ...

  4. jsp数据交互(一).3

    引入的文件如果是jsp则应定义为***.jspf文件,如果其他文件可定义为***.inc文件,即include file. jsp:include是既可以静态包含又可以动态包含,用jsp:includ ...

  5. D3学习之画布制作

    最近大半个月都和d3斗争,学习艰辛(呜呜……)如果觉得作者写的对你有用,可以打赏作者哦!owo 起言:结合自己的学习之路,我认为要想使用d3画图搞清楚布局很重要,层次分明,就给了你很大的灵活性,写起代 ...

  6. Angular JS 中 ng-controller 值复制和引用复制

    我们知道在使用ng-app或者ng-controller指令的时候,都会创建一个新的作用域($rootScope或者是$scope),并且在使用ng-controller指令创建的作用域会继承父级作用 ...

  7. Docker 容器基本操作[Docker 系列-2]

    ​Docker 入门及安装[Docker 系列-1] 镜像就像是一个安装程序,而容器则是程序运行时的一个状态. 查看容器 查看容器 启动 docker 后,使用 docker ps 命令可以查看当前正 ...

  8. 【iOS】更新 CocoaPods 后 Podfile 报错

    更新了 CocoaPods 后,再执行 "pod install" 时报了如下错误: [!] The dependency `AFOnoResponseSerializer` is ...

  9. 【iOS】copy 关键字

    以前没注意过 iOS 的 copy, nonatomic, assign, weak, strong 等关键字. 偏偏今天遇到了一个问题,恰恰是关键字的问题,如图: 之前用的是 assign, 没有用 ...

  10. Charles PC端和手机端抓取HTTP和HTTPS协议请求、HTTPS通用抓包规则

    一:HTTP和HTTPS的区别 HTTP是超文本传输协议,被用在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,因此HTTP协议不适合传输一些敏感信息, ...