首页 > 其他分享 >题解 CF742B

题解 CF742B

时间:2023-02-17 15:23:29浏览次数:31  
标签:ch int 题解 个数 CF742B ori oplus

题目大意:

给定 \(n\) 个数,找数对使其异或值为 \(k\),求满足这样数对的个数。

题目分析:

考验位运算功底的题目(实际上也不是很难),主要运用到了下列性质:

\[\begin{aligned} \because a \oplus b = k \\ \therefore a \oplus k = b \end{aligned} \]

根据上述性质,题意就被转化为了:

对于任意一个数 \(a_x\),问 \(a_x \oplus k\) 在数列中的存在数量的和。

然后开个桶记录一下每个数的出现次数,求答案的时候我们先将当前数在桶中的数量减一,然后 \(ans\) 再加上当前数异或 \(k\) 在数列中存在的个数。

如果你使用数组开桶,则时间复杂度为 \(O(n)\),然而这里我为了防止出现很大很变态的数卡我数组,所以使用的 \(map\),时间复杂度 \(O(n \log n)\)

代码实现:

#include <bits/stdc++.h>
#define debug(x) cerr<<#x<<": "<<x<<endl;
#define int long long
using namespace std;

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

namespace Larry76{
    const int MAX_SIZE = 1.1e6;
    map<int,int>hashtable;
    int ori[MAX_SIZE];
    void main(){
        //Code Here;
        int n,k;
        cin>>n>>k;
        for(int i=1;i<=n;i++){
            cin>>ori[i];
            hashtable[ori[i]]++;
        }
        int ans = 0;
        for(int i=1;i<=n;i++){
            hashtable[ori[i]]--;
            ans += hashtable[ori[i] ^ k];
        }
        cout<<ans<<endl;
    }
}

signed main(){
#ifdef LOCAL
    freopen("in.in","r",stdin);
    freopen("out.out","w",stdout);
    double c1 = clock();
#else
    ios::sync_with_stdio(false);
#endif
//============================================
    Larry76::main();
//============================================
#ifdef LOCAL
    double c2 = clock();
    cerr<<"Used Time: "<<c2-c1<<"ms"<<endl;
    if(c2-c1>1000)
        cerr<<"Warning!! Time Limit Exceeded!!"<<endl;
    fclose(stdin);
    fclose(stdout);
#endif
    return 0;
}

标签:ch,int,题解,个数,CF742B,ori,oplus
From: https://www.cnblogs.com/larry76/p/17130257.html

相关文章

  • 20230207模拟赛题解
    A-CF755D考虑每次加边产生的贡献。发现每次加边的贡献是这条边与别的边的交点数量加\(1\)。所以可以用线段树或树状数组等数据结构维护,注意要令\(k=\min(k,n-k)\)。B-......
  • CAD坐标显示不全怎么办?CAD坐标常见问题解答!
    今天小编来和大家聊一下浩辰CAD看图王中关于CAD坐标的那些事,比如:CAD坐标为何显示不全?CAD坐标显示结果和之前不一样?以及不能精准捕捉CAD坐标等情况,应该如何轻松解决?今天就和......
  • 0210 模拟题解
    0210模拟题解t1直接枚举\(k\),考虑计算答案。首先发现这个限制等价于存在长度\(\gen-k\)的上升子段。那我们反过来,计算所有上升子段长度都\(\len-k-1\)的方案数......
  • CF、AT 杂题题解
    CF1455Fsolution1前\(i\)次操作只会影响到\([1,i+1]\),并且在第\(i\)次操作前,原本在位置\(i\)的数只可能在\(i\)或\(i-1\)。于是就可以考虑设\(f_{i,0/1}\)......
  • YACS 2023年1月月赛 乙组 T4 加与乘(二) 题解
    题目链接应大家的要求,早上起来更一下乙组T4。这一道题目我们发现不仅会加元素了,还会重复执行任务。很容易想到用两个树状数组来维护每个任务的执行次数,以及每个单元格......
  • ZJOI 2022 部分题解
    ZJOI2022部分题解太菜了所以只写了两题[ZJOI2022]树https://www.luogu.com.cn/problem/P8329题解玩一玩样例可以得到这样的式子\[ans=\sum_{S\cupT=[n],\S\c......
  • 牛客练习赛 108 题解
    六道题目的出题人都是我,希望大家玩的开心!https://ac.nowcoder.com/acm/contest/51208A.惊鸿显然位或之后只会变大,因此答案为\(4\times(a_1\text{or}a_2\text{or}......
  • 二、Keil——Missing Compiler Version 5 和 core_cm3.c 问题解决
    Keil丢失编译器版本5、内核文件core_cm3.c报错目录Keil丢失编译器版本5、内核文件core_cm3.c报错前言一、MissingCompilerVersion51.下载ArmCompiler52.ARMCC3......
  • 0215 模拟题解
    0215模拟题解t1按照时间\(dp\),好处是和活着的怪物个数相关的概率容易计算。\(dp(i,mask)\)表示时间到\(i\),\(mask\)的怪已经被干掉的概率。这里我们假设\(1\)到......
  • 题解 CF1742G
    题目描述:给你一个序列\(A\),要求将\(A\)重新排序,使得序列\(A\)的前缀或和序列\(B\)的字典序最大。题目分析:这道题我们首先考虑一个性质,就是前缀或和序列\(B\)......