HDU6059 Kanade's trio (Trie)

本文介绍了HDU6059题目,该问题要求找到满足特定位运算条件的三元组(i<j<k)。通过题目分析,确定使用Trie数据结构来解决,重点在于枚举k。作者分享了遇到的问题,如漏掉条件(i<j),以及代码中爆int和数组大小错误,最后提醒读者注意检查细节和输入速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HDU6059 Kanade’s trio (Trie)

题目描述

求有多少三元组满足 (i<j<k)and((A[i]xorA[j])<(A[j]xorA[k]))

题目分析

读题一分钟,思考十五分钟。
根据时间猜测是O(nlogn)的算法。那么可能是枚举+二分,或者枚举+Trie。
有位运算的特点确定Trie是一定的。
那么问题就在于枚举什么。思考后发现枚举k即可。
Code十五分钟,Debug十五分钟后发现没有满足(i < j)这个条件。

用40分钟查阅题解并改代码。
总花费86min。

代码

#include <stdio.h>
#include <cstring>
typedef long long ll;
const int M = 30;
const int maxn = 500010 * 30;
int ch[maxn][2], cnt[maxn], o_cnt, bit[M + 10][2];
ll sub[maxn][2];
ll Solve(int n){
    ll rnt = 0;
    for(int cur = 1, i = M - 1; cur && i >= 0; i--){
        int d = (n >> i) & 1;
        ll t = cnt[ch[cur][d^1]];
        rnt += t * (bit[i][d^1] - 1) - sub[ch[cur][d^1]][d^1];
        cur = ch[cur][d];
    }
    return rnt;
}
int NewNode(){
    int id = ++o_cnt;
    ch[id][0] = ch[id][1] = cnt[id] = sub[id][0] = sub[id][1] = 0;
    return id;
}
void Insert(int n){
    for(int cur = 1, i = M - 1; i >= 0; i--){
        int &nxt = ch[cur][(n >> i) & 1];
        if(nxt == 0) nxt = NewNode();
        cur = nxt;
        cnt[cur]++;
        sub[cur][(n >> i) & 1] += bit[i][(n >> i) & 1];
        bit[i][(n >> i) & 1]++;
    }
}
int main(){
    int T; scanf("%d", &T);
    while(T--){
        int n; scanf("%d", &n);
        memset(bit, 0, sizeof(bit));
        o_cnt = 0;
        NewNode();
        ll ans = 0;
        for(int i = 1; i <= n; i++){
            int t; scanf("%d", &t);
            ans += Solve(t);
            Insert(t);
        }
        printf("%lld\n", ans);
    }
    return 0;
}

反思总结

爆int。仔细检查。
数组开小了。仔细检查,字典树结点数应为n*bit。
输入速度?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值