题意:给两个序列[a, a + n), [b, b + n),求所有数(ai + bj)的异或和,i,j∈[0,n)。

思路:这个题思路比较巧妙,不难但是难想到。BC上的题解讲得非常清楚了,我就直接copy过来了吧

我们考虑两个数A,B。
为了描述方便,我们设[P]的值为:当表达式P的值为真时,[P]=1,否则[P]=0
我们现在考虑计算[(A+B)and(2i)>0]
首先我们将A,B都对2i+1取模,显然这样是不会影响答案的
则有一个十分显然的等式:
[(A+B)and(2i)>0]=[(A+B)≥(2i)]−[(A+B)≥(2i+1)]+[(A+B)≥(3∗2i)]
这个式子相当容易理解,这里不多述了
考虑每一位对答案的贡献是独立的,我们每一位分开做
于是现在问题变成了:给定数组A,B,求满足Ai+Bj≥limit的数对个数
我们可以将A,B排序后,直接O(n)计算即可
然而排序是O(nlogn)的,这样总复杂度就是O(nlognlogA)了,无法通过此题
于是这里有个小技巧
我们从高位往低位做,现在我们要实现的是:将A中每个数对P取模后将A排序
我们发现A会被分成两段,一段小于P,一段大于等于P,只有后面一段要取模,我们可以取模后直接将这两段归并,复杂度是O(n)的
时间复杂度:O(nlogA+nlogn)

下面的代码就是根据题解写的,个人感觉也非常清晰了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#pragma comment(linker, "/STACK:10240000,10240000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 1e5 + 7;
int n;
long long a[maxn], b[maxn];
void sort(long long *a, long long md) {
    int pos = n;
    for (int i = 0; i < n; i ++) {
        if (pos == n && a[i] >= md) pos = i;
        a[i] = a[i] & (md - 1);
    }
    inplace_merge(a, a + pos, a + n);
}
bool solve(long long limit) {
    long long ans = 0;
    int that = n - 1;
    for (int i = 0; i < n; i ++) {
        while (that >= 0 && a[i] + b[that] >= limit) that --;
        ans += n - 1 - that;
    }
    return ans & 1;
}
int main() {
#ifndef ONLINE_JUDGE
    freopen("in.txt""r", stdin);
#endif // ONLINE_JUDGE
    int T, cas = 0;
    cin >> T;
    while (T --) {
        cin >> n;
        for (int i = 0; i < n; i ++) {
            scanf("%I64d", a + i);
        }
        for (int i = 0; i < n; i ++) {
            scanf("%I64d", b + i);
        }
        sort(a, a + n);
        sort(b, b + n);
        long long ans = 0;
        for (int i = 61; i >= 0; i --) {
            sort(a, (long long)2 << i);
            sort(b, (long long)2 << i);
            long long res =
                solve((long long)1 << i) ^
                solve((long long)2 << i) ^
                solve((long long)3 << i);
            ans |= res << i;
        }
        printf("Case #%d: %I64d\n", ++ cas, ans);
    }
    return 0;
}

转载于:https://www.cnblogs.com/jklongint/p/4576232.html

[hdu5270]按位统计,容斥,归并相关推荐

  1. jzoj5123-diyiti【统计,容斥】

    正题 题目大意 n个木棒,求用6个木棒组成正方形的方案总数. 解题思路 这个正方形边有的木棒数两种可能3,1,1,13,1,1,13,1,1,1和2,2,1,12,2,1,12,2,1,1. 第一种可 ...

  2. jzoj3056-数字【数位dp,统计,容斥】

    正题 题目大意 求有多少个2∗n2*n2∗n位的数字(允许有前导零)满足 只包含SSS集合内的数字 前nnn位的和等于后nnn位之和或者奇数位之和和偶数位之和相等 解题思路 预处理数组fi,jf_{i ...

  3. HDU - 7009 树上游走(树的直径+容斥)

    题目链接:点击查看 题目大意:给一棵树,称一个点集 S 是好的当且仅当存在一个点,其到 S 中所有点的距离互不相同,求 |S| 的最大值和使得 |S| 最大的 S 的个数 题目分析:不难看出 ∣S∣| ...

  4. POJ 1150 The Last Non-zero Digit 数论+容斥

    POJ 1150 The Last Non-zero Digit 数论+容斥 题目地址:  POJ 1150 题意:  求排列P(n, m)后面第一个非0的数. 分析: 为了熟悉题目中的理论.我先做了 ...

  5. 【每日一题】Steps to One (容斥+错位相减)cf1139D

    题目链接 前置推论: 1.长度为1的序列只可能是一个1. 2.假设当前的序列长度为 k + 1 k+1 k+1,且前 k k k个数的 g c d = a gcd=a gcd=a不为1的话,那么第 k ...

  6. P3175 [HAOI2015]按位或(Min - Max容斥,FMT,概率期望,全网最清晰的题解!)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P3175 Prob ...

  7. UVA-10212 The Last Non-zero Digit. 分解质因子+容斥定理

    这个是参考了别人之后的代码,POJ上0MS过了.Orz......对于一个序列在提取了2,5之后,例如1,2,3,4,5,6,7,8,9,10,我们可以将其中的奇数和偶数分开来对待,对于偶数序列2,4 ...

  8. CodeForces - 1486F Pairs of Paths(树上计数+容斥)

    题目链接:点击查看 题目大意:给出一棵 nnn 个点的树,再给出 mmm 条路径,现在问有多少个路径对 (x,y)(x,y)(x,y),满足第 xxx 条路径和第 yyy 条路径有且仅有一个交点 题目 ...

  9. Codeforces.449D.Jzzhu and Numbers(容斥 高维前缀和)

    题目链接 \(Description\) 给定\(n\)个正整数\(a_i\).求有多少个子序列\(a_{i_1},a_{i_2},...,a_{i_k}\),满足\(a_{i_1},a_{i_2}, ...

最新文章

  1. win11安装chocolatey软件包管理工具(win版)
  2. python中的loop啥意思_python怎么进行loop
  3. 浅析epoll – epoll函数深入讲解
  4. 第三次学JAVA再学不好就吃翔(part93)--LinkedHashMap
  5. Redis1 晨考题
  6. centos7安装yum_centos7下yum方式安装jenkins
  7. 华为海思年内恐超越联发科 成亚洲最大芯片设计公司
  8. 《BI那点儿事》三国数据分析系列——蜀汉五虎上将与魏五子良将武力分析,绝对的经典分析...
  9. 把CS文件编译成dll文件
  10. ZOJ 3988 2017CCPC秦皇岛 H:Prime Set(二分匹配)
  11. VMware虚拟机下网络连接的三种模式
  12. oracle 获得表字段名,注释等的sql语句 .
  13. PHP Filesysten函数
  14. linux数据向量化指令,VLIW DSP编译器向量化优化技术及指令分簇算法研究
  15. TPM设备管理系统对企业生产有何作用?
  16. 一款英国折叠车如何在中国城市流行?
  17. java二级程序题两个角度_两个角度图_【SCME大一】使用JAVA语言深入理解程序逻辑答案_学小易找答案...
  18. 【C++ Caffe】ubuntu下MNIST训练结果
  19. Oracle执行计划filter下多个节点的优化
  20. 数据备份解决方案介绍

热门文章

  1. BZOJ 1011: [HNOI2008]遥远的行星
  2. 前端工程师必备:学习资源全网罗
  3. 高性能服务器设计——常用网络服务器设计模型(转载)
  4. GridView合并列下的行单元格的方法
  5. Linux运维之——每日小技巧,使用awk命令截取每行的指定列数据
  6. 《Arduino奇妙之旅:智能车趣味制作天龙八步》一2.4 准备好了吗?
  7. openresty 前端开发入门四之Redis篇
  8. MathType可以编辑省略号吗
  9. Windows10 ISO下载
  10. 印度软件业崛起的奥妙