首页 > 其他分享 >Xor

Xor

时间:2024-02-21 18:34:06浏览次数:13  
标签:rt ch Xor int ll gc sm

$\text{题意}$:
给定一个序列长为 $n$ 的 $\{a\}$,有 $m$ 次操作,每次操作读入一个数 $p$,求 $\{a\oplus p\}$ 的逆序对个数。
对于所有数据 $n,m \le 10^5$。

$\text{Solution}$ :
我们发现两个数大小不同的实质是其第一个最高不同的二进制位一个是 $0$,一个是 $1$。这启示我们 $O(n^2)$ 暴力的做法:两两枚举数对,记录不同的最高二进制位,复杂度 $O(n^2 \log V + m \log V)$。

考虑优化这个过程,$Tire$ 树上枚举即可。

 1 #include <bits/stdc++.h>
 2 
 3 typedef long long ll;
 4 const int N = 2e5 + 50;
 5 using namespace std;
 6 
 7 #define gc getchar
 8 ll read() {
 9     ll x = 0; char c = gc();
10     while(!isdigit(c)) c = gc();
11     while(isdigit(c)) x = x * 10 + (c ^ 48), c = gc();
12     return x;
13 }
14 
15 int ch[N*20][2], cnt, rot;
16 ll sm[N*20], a[N];
17 ll vl[2][33];
18 
19 void insert(int& rt, int i, int ip) {
20     if(!rt) rt = ++cnt;
21     if(!~i) {sm[rt]++;return;} 
22     int to = (a[ip] >> i) & 1;
23     vl[to][i] += sm[ch[rt][to ^ 1]];
24     insert(ch[rt][to], i - 1, ip);
25     sm[rt] = sm[ch[rt][to]] + sm[ch[rt][to ^ 1]];
26 }
27 
28 int n, m;
29 
30 int main() {
31     freopen("xor.in","r",stdin);
32     freopen("xor.out","w",stdout);
33     cin >> n >> m;
34     for(int i = 1; i <= n; ++i) a[i] = read();
35     for(int i = 1; i <= n; ++i) {
36         insert(rot, 32, i);
37     }
38     for(int i = 1; i <= m; ++i) {
39         ll p = read(), as = 0;
40         for(int i = 0; i <= 32; ++i) {
41             as += vl[p & 1][i];
42             p >>= 1;
43         }
44         printf("%lld\n", as);
45     }
46     return 0;
47 }

 

标签:rt,ch,Xor,int,ll,gc,sm
From: https://www.cnblogs.com/Saka-Noa/p/18025962

相关文章

  • XOR和路径
    一眼无穷嵌套DP设\(f[i]\)表示从\(i\)到\(N\)的期望然后你会发现推不走,为什么?因为乘法对异或没有分配率!但是不要怀疑我们的整体套路,我们应该从位运算的另一trick入手:考虑每一位试想,如果我们列出了所有路径的样本空间(这当然是不可能的),知道了每个样本空间的xor和,乘以对应的概率......
  • CF1879D Sum of XOR Functions
    记前缀异或和数组\(s\),于是题目中的\(f(l,r)\)可以被表示成\(s_r\opluss_{l-1}\),转化为求\(\sum\limits_{l=1}^n\sum\limits_{r=l}^n(s_r\opluss_{l-1})\times(r-l+1)\)。再记录\(4\)个值,\(cnt_0,cnt_1,sum_0,sum_1\)分别表示当前已经出现过的\(0/1\)的个数,出......
  • 「题解」ARC139F Many Xor Optimization Problems
    考虑线性空间的标准基底(即每个主元都只有对应向量有值),答案为所有基底异或和。对于一个秩\(k\)计算它对答案的贡献。固定主元为\(a_1<a_2<\cdots<a_k\),各种情况应该是等概率,也就是对第\(i\)个基底来说,\(a_i\)位一定为\(1\),再往下的位除了在\(a\)出现过的以外的位0/1是......
  • POJ--3764 The xor-longest Path(Trie)
    记录13:562024-2-10找到俩个点,获得最大的边权异或值。利用异或的性质,一个值被异或俩次相当于没有异或即axorbxorb=a所以先从顶点出发,获得每个点路径上的异或值,然后对这俩个值进行异或就获得了他们之间路径的异或值。获取从顶点到每个点路径上的异或值后,可以利用trie来......
  • CF1863F Divide, XOR, and Conquer 题解
    简要题意你有两个指针\(l,r\)初始时\(l=1,r=n\)。你可以操作若干次知道\(l=r\)。每次操作你可以选择一个整数\(k\in[l,r)\),记\(x=\bigoplus_{i=l}^ka_i,y=\bigoplus_{i=k+1}^ra_i\)。如果\(x\leqy\),你可以令\(l=k+1\)。如果\(x\geqy\),你可以令\(r=k\)。......
  • CF1446C Xor Tree 题解
    解题思路与其考虑删除哪些点,不如考虑保留哪些点。考虑到和异或有关,那么我们可以把这些数倒序插入trie树中,然后我们就可以在trie树上跑一个简单的dp:若当前节点为叶子节点,那么保留,返回\(1\);若当前节点在链上,那么直接继承儿子节点;若当前节点有两个儿子,那么更新为较大儿子......
  • Tokitsukaze and Min-Max XOR
    TokitsukazeandMin-MaxXOR题目描述Tokitsukaze有一个长度为$n$的序列$a_1,a_2,\ldots,a_n$​和一个整数$k$。她想知道有多少种序列$b_1,b_2,\ldots,b_m$​,满足:$1\leqb_i\leqn$$b_{i−1}<b_i​$$(2\leqi\leqm)$$\min⁡(a_{b_1}\,,a_{b_2}\,,\ldots......
  • 大胆假设小心验证——cf_922_C. XOR-distance
    目录问题概述思路想法参考代码问题反思问题概述给出整数a、b、r,要求输出|(a^x)-(b^x)|的绝对值,其中0<=x<=r(取值都是[0,1e18])思路想法首先是一个位置关系,由于求的是绝对值,所以我们可以假定a>b;第二,我们要做的是异或操作,因此可以将a和b的二进制数写出来,结合异或的特点,可以发......
  • The XOR-longest Path 题解
    我们观察题干知道此题为单调递增(节点),这样我们就不用跑dfs了很显然的一件事是两点间的权值只与子节点有关所以我们用w1[v]=w1[u]*w就能更新v到根节点的权值然后我们循环放入字典树,再取最大的(由于这题数据特别水,所以没算v-u的w1)#include<bits/stdc++.h>usingnamespacestd;in......
  • ARC127D Sum of Min of Xor
    ARC127DSumofMinofXor性质分析加通用套路。思路首先我们把这题的\(\min\)给去掉,那么我们按位算贡献,可以求出和。这是这种式子的通用套路。考虑加上\(\min\),那么我们先按照\((a_i,b_i)\)的最高位分为:\((1,0)\),\((0,1)\),\((1,1)\),\((0,0)\)四种情况。可以发现用贡献......