[hdu5270]按位统计,容斥,归并
题意:给两个序列[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]按位统计,容斥,归并相关推荐
- jzoj5123-diyiti【统计,容斥】
正题 题目大意 n个木棒,求用6个木棒组成正方形的方案总数. 解题思路 这个正方形边有的木棒数两种可能3,1,1,13,1,1,13,1,1,1和2,2,1,12,2,1,12,2,1,1. 第一种可 ...
- jzoj3056-数字【数位dp,统计,容斥】
正题 题目大意 求有多少个2∗n2*n2∗n位的数字(允许有前导零)满足 只包含SSS集合内的数字 前nnn位的和等于后nnn位之和或者奇数位之和和偶数位之和相等 解题思路 预处理数组fi,jf_{i ...
- HDU - 7009 树上游走(树的直径+容斥)
题目链接:点击查看 题目大意:给一棵树,称一个点集 S 是好的当且仅当存在一个点,其到 S 中所有点的距离互不相同,求 |S| 的最大值和使得 |S| 最大的 S 的个数 题目分析:不难看出 ∣S∣| ...
- POJ 1150 The Last Non-zero Digit 数论+容斥
POJ 1150 The Last Non-zero Digit 数论+容斥 题目地址: POJ 1150 题意: 求排列P(n, m)后面第一个非0的数. 分析: 为了熟悉题目中的理论.我先做了 ...
- 【每日一题】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 ...
- P3175 [HAOI2015]按位或(Min - Max容斥,FMT,概率期望,全网最清晰的题解!)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P3175 Prob ...
- UVA-10212 The Last Non-zero Digit. 分解质因子+容斥定理
这个是参考了别人之后的代码,POJ上0MS过了.Orz......对于一个序列在提取了2,5之后,例如1,2,3,4,5,6,7,8,9,10,我们可以将其中的奇数和偶数分开来对待,对于偶数序列2,4 ...
- CodeForces - 1486F Pairs of Paths(树上计数+容斥)
题目链接:点击查看 题目大意:给出一棵 nnn 个点的树,再给出 mmm 条路径,现在问有多少个路径对 (x,y)(x,y)(x,y),满足第 xxx 条路径和第 yyy 条路径有且仅有一个交点 题目 ...
- Codeforces.449D.Jzzhu and Numbers(容斥 高维前缀和)
题目链接 \(Description\) 给定\(n\)个正整数\(a_i\).求有多少个子序列\(a_{i_1},a_{i_2},...,a_{i_k}\),满足\(a_{i_1},a_{i_2}, ...
最新文章
- win11安装chocolatey软件包管理工具(win版)
- python中的loop啥意思_python怎么进行loop
- 浅析epoll – epoll函数深入讲解
- 第三次学JAVA再学不好就吃翔(part93)--LinkedHashMap
- Redis1 晨考题
- centos7安装yum_centos7下yum方式安装jenkins
- 华为海思年内恐超越联发科 成亚洲最大芯片设计公司
- 《BI那点儿事》三国数据分析系列——蜀汉五虎上将与魏五子良将武力分析,绝对的经典分析...
- 把CS文件编译成dll文件
- ZOJ 3988 2017CCPC秦皇岛 H:Prime Set(二分匹配)
- VMware虚拟机下网络连接的三种模式
- oracle 获得表字段名,注释等的sql语句 .
- PHP Filesysten函数
- linux数据向量化指令,VLIW DSP编译器向量化优化技术及指令分簇算法研究
- TPM设备管理系统对企业生产有何作用?
- 一款英国折叠车如何在中国城市流行?
- java二级程序题两个角度_两个角度图_【SCME大一】使用JAVA语言深入理解程序逻辑答案_学小易找答案...
- 【C++ Caffe】ubuntu下MNIST训练结果
- Oracle执行计划filter下多个节点的优化
- 数据备份解决方案介绍