思路来自题解(看着题解和标程瞎吉尔比划了半天)

/*
HDU 6059 - Kanade's trio [ 字典树 ]  |  2017 Multi-University Training Contest 3
题意:
给出数组 a[N],问满足 (i<j<k) && ((A[i] xor A[j])<(A[j] xor A[k])) 的三元组数数量
限制 N<=5e5, a[i] <= 2^30
分析:
对于某一对 ai, ak ,满足条件的 aj 为:
对于 ai 和 ak 的最高的不同位 p ,满足 aj[p] == ai[p] 也就是 aj[p] != ak[p] 首先把 ak 插入字典树(从后往前),不考虑 ai 的情况下对于某个 ak 的前缀 ak[1..p],满足条件的 ak,aj 对的数目 = (j < k && ak[p] != aj[p])
这可以预处理 1 到 k-1 第 p 位为 0 or 1 的数字的个数,然后每插一个ak,就累加 aj
然后就是对于每个 ai,枚举 p ,满足条件的ak则是前缀与ai相同,第 p 位不同的个数
ans += ak[1..p]所对应的j,k对 - 不合法的即 j<=i 的 j,k 对
*/
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 5e5+5;
const int SIZE = N*31;
int sum[N][30][2];
int bin[30];
namespace Trie {
int ch[SIZE][2], tot, num[SIZE];
LL ss[SIZE];//j,k对
int init(int n) {
tot = 0;
for (int i = 0; i <= n; i++)
ch[i][0] = ch[i][1] = ss[i] = num[i] = 0;
}
void insert(int x, int i) {
int now = 0;
for (int j = 29; j >= 0; j--)
{
int t = x&bin[j]; t >>= j;
if (!ch[now][t]) ch[now][t] = ++tot;
now = ch[now][t];
ss[now] += sum[i-1][j][t^1];
num[now]++;
}
}
LL query(int x, int i) {
int now = 0;
LL ans = 0;
for (int j = 29; j >= 0; j--)
{
int t = x&bin[j]; t >>= j;
if (ch[now][t^1])
{
ans += ss[ch[now][t^1]] - (LL)sum[i][j][t]*num[ch[now][t^1]];
}
if (!ch[now][t]) break;
now = ch[now][t];
}
return ans;
}
}
int t, n, a[N];
int main()
{
bin[0] = 1;
for (int i = 1; i <= 29; i++) bin[i] = bin[i-1]<<1;
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
memset(sum[0], 0, sizeof(sum[0]));
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
memcpy(sum[i], sum[i-1], sizeof(sum[i]));
for (int j = 29; j >= 0; j--)
{
int t = a[i]&bin[j]; t >>= j;
sum[i][j][t]++;
}
}
Trie::init(n*30);
LL ans = 0;
for (int i = n; i >= 1; i--)
{
ans += Trie::query(a[i], i);
Trie::insert(a[i], i);
}
printf("%lld\n", ans);
}
}

以前不怎么打字典树,比赛的时候打成血崩- -,换队友上用了两棵字典树依旧血崩- -

HDU 6059 - Kanade's trio | 2017 Multi-University Training Contest 3的更多相关文章

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

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

  2. hdu 6059 Kanade's trio

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

  3. HDU 6057 - Kanade's convolution | 2017 Multi-University Training Contest 3

    /* HDU 6057 - Kanade's convolution [ FWT ] | 2017 Multi-University Training Contest 3 题意: 给定两个序列 A[0 ...

  4. HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3

    /* HDU 6058 - Kanade's sum [ 思维,链表 ] | 2017 Multi-University Training Contest 3 题意: 给出排列 a[N],求所有区间的 ...

  5. HDU 6162 - Ch’s gift | 2017 ZJUT Multi-University Training 9

    /* HDU 6162 - Ch’s gift [ LCA,线段树 ] | 2017 ZJUT Multi-University Training 9 题意: N节点的树,Q组询问 每次询问s,t两节 ...

  6. HDU 6058 Kanade's sum —— 2017 Multi-University Training 3

    Kanade's sum Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  7. 2017 Wuhan University Programming Contest (Online Round) Lost in WHU 矩阵快速幂 一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开。

    /** 题目:Lost in WHU 链接:https://oj.ejq.me/problem/26 题意:一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开. ...

  8. 2017 Wuhan University Programming Contest (Online Round) C. Divide by Six 分析+模拟

    /** 题目:C. Divide by Six 链接:https://oj.ejq.me/problem/24 题意:给定一个数,这个数位数达到1e5,可能存在前导0.问为了使这个数是6的倍数,且没有 ...

  9. 2017 Wuhan University Programming Contest (Online Round) B Color 树形dp求染色方法数

    /** 题目:Color 链接:https://oj.ejq.me/problem/23 题意:给定一颗树,将树上的点最多染成m种颜色,有些节点不可以染成某些颜色.相邻节点颜色不同.求染色方法数. 思 ...

随机推荐

  1. [转帖]「知乎知识库」— 5G

    「知乎知识库」— 5G 甜草莓 https://zhuanlan.zhihu.com/p/55998832 ​ 通信 话题的优秀回答者 已关注 881 人赞同了该文章 谢 知识库 邀请~本文章是几个答 ...

  2. 【转载】Jave开发手册之正则表达式预编译

    今天又水一篇,java开发手册华山版 一.编程规约 (九)其它 第一条 解释:Pattern要定义为static final静态变量,以避免执行多次预编译. 错误用法: // 没有使用预编译 priv ...

  3. vue的 :class 与 :style 的讲解

    Vue样式: Vue中通过属性绑定为元素的class样式 第一种使用方式:直接传递一个数组 注意:这里的class需要使用v-bind做数据绑定 第二种使用方式:在数组中使用三元表达式 第三种使用方式 ...

  4. github骚操作

    限制搜索 in关键词限制搜索范围 命令 说明 xxx in:name 项目名包含xxx的 xxx in:description 项目描述包含xxx的 xxx in:readme 项目的readme文件 ...

  5. luogu1731生日蛋糕题解--恶心剪枝

    题目链接 https://www.luogu.org/problemnew/show/P1731 分析 这题真[哔]恶心,加了一堆奇奇怪怪的优化 首先明确一点,半径和高都必须是正整数,意味着它们最小为 ...

  6. spark2.0的10个特性介绍

    1. Spark 2.0 ! 还记得我们的第七篇 Spark 博文里吗?里面我用三点来总结 spark dataframe 的好处: 当时是主要介绍 spark 里的 dataframe,今天是想总结 ...

  7. Spark机器学习API之特征处理(一)

    Spark机器学习库中包含了两种实现方式,一种是spark.mllib,这种是基础的API,基于RDDs之上构建,另一种是spark.ml,这种是higher-level API,基于DataFram ...

  8. 有趣的"=="与"==="

    console.log([]==![]);//true //"=="会进行类型转换,转换成统一类型进行比较 // !符号优于==,[]boolean值为TRUE,所以![]就是FA ...

  9. 【转】Fetch超时设置和终止请求

    原文链接:https://www.cnblogs.com/yfrs/p/fetch.html 1.基本使用 Fetch 是一个新的端获取资源的接口,用于替换笨重繁琐XMLHttpRequest.它有了 ...

  10. 微信小程序配置动态title

    wx.setNavigationBarTitle({ title: this.dynTitle }) 通过页面路由跳转传参 onload(opt)中的opt接受传过来的title 赋值即可