HDU 6059
题意略。
思路:我们要想令 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的更多相关文章
- HDU 6059 - Kanade's trio | 2017 Multi-University Training Contest 3
思路来自题解(看着题解和标程瞎吉尔比划了半天) /* HDU 6059 - Kanade's trio [ 字典树 ] | 2017 Multi-University Training Conte ...
- hdu 6059 Kanade's trio
题 OwO http://acm.hdu.edu.cn/showproblem.php?pid=6059 解 由于每个数字最多是30位,枚举数字每一位考虑, 建一棵记录前缀(位的前缀,比如10拆成10 ...
- 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 ...
- hdu 6059 Kanade's trio(字典树)
Kanade's trio Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)T ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 4006The kth great number(K大数 +小顶堆)
The kth great number Time Limit:1000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64 ...
随机推荐
- 一位 iOS 大牛的 BAT面试心得与经验总结,送给正在迷茫 的你!
前言: 目前形势,参加到 iOS 队伍的人是越来越多,可以说是已经达到了供过于求的地步了. 今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,之前实习的时候就想着写一篇面经,后来忙就给忘了, ...
- 月薪12k的零基础自学前端必备手册
随着互联网的深入发展,前端开发工程师一跃成为市场上非常抢手的人才.很多同学,包括以前做UI的.Java的.或者对于IT完全零基础的同学都想学习前端.下图是网上流传甚广的一张前端学习思维导图,很多初学者 ...
- 【Java中级】(三)IO
1. 流分为字节流和字符流 2. 字节流下面常用的又有数据流和对象流 3. 字符流下面常用的又有缓存流 文件对象 文件和文件夹都用File表示 //file path : 文件的绝对路径或相对路径Fi ...
- ThinkPHP 添加数据到数据库失败
ThinkPHP 添加数据到数据库失败 一般情况下会先检查一下几个方面 检查控制器或Model名是否有误 检查需要插入的数据是否为空或者缺失参数 检查数据表名及字段名称(大部分下都是字段名有误出错的) ...
- HTML页面中的布局问题
在做网站中,给整个大的框架宽度设置为100%,然后设置body的最小宽度是网站的内容部分的宽度.网站内容的宽度是固定的.
- linux初学者-swap分区篇
linux初学者-swap分区篇 swap是虚拟内存,是在硬盘中分区一块区域,当内存占满但是又急迫需要时临时当作内存使用,使用效率低于内存.本文将对linux系统中swap分区的建立做一个简要介绍. ...
- vue.js带复选框表单的增删改查
近段时间由于公司项目要求,前端开始使用VUE框架进行开发,最近刚开始学习,做了一个表单的增删改查,和大家分享一下. 页面模型代码设计如下 <template> <div id=&qu ...
- 《Scalable IO in Java》译文
<Scalable IO in Java> 是java.util.concurrent包的作者,大师Doug Lea关于分析与构建可伸缩的高性能IO服务的一篇经典文章,在文章中Doug L ...
- Hexo结合github制作博客
https://blog.csdn.net/Hoshea_chx/article/details/78826689 hexo(themes) vuePress jekylly
- Java学习多线程第一天
内容介绍 Thread 线程创建 线程池 线程状态图 1 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序 ...