codeforces1323D Present

题意

( a 1 + a 2 ) ( a 1 + a 3 ) ( a 1 + a n ) ( a 2 + a 3 ) ( a 2 + a n ) ( a n 1 + a n ) (a_1 + a_2) \oplus (a_1 + a_3) \oplus \ldots \oplus (a_1 + a_n) \\ \oplus (a_2 + a_3) \oplus \ldots \oplus (a_2 + a_n) \\ \ldots \\ \oplus (a_{n-1} + a_n) (a1+a2)(a1+a3)(a1+an)(a2+a3)(a2+an)(an1+an)

其中 n 400000 n\leq 400000 n400000 a i 1 0 7 a_i\leq10^7 ai107

分析

这场用手速上了紫嘿嘿嘿,不过 D D D 没做出来还是太菜了。
对于这种二进制的题,都是一位一位考虑。这里考虑答案的第 k k k 位。
我们将每个数取前 k k k 位。现在就是考虑 a i + a j a_i+a_j ai+aj k k k 位为 1 1 1 的对数。
k k k 位为 1 1 1 只有两种情况:

  • k k k 位为 1 1 1,第 k + 1 k+1 k+1 位为 0 0 0
    这种情况就是大于 2 k a i 2^k-a_i 2kai 的个数减去大于 2 k + 1 a i 2^{k+1}-a_i 2k+1ai 的个数
  • k k k 位和第 k + 1 k+1 k+1 位都为 1 1 1
    这种情况就是大于 2 k + 2 k + 1 a i 2^k+2^{k+1}-a_i 2k+2k+1ai a j a_j aj 个数

加起来就是第 k k k 位为 1 1 1 的对数了。
二分找个数复杂度 O ( l o g n ) O(logn) O(logn)
总共 26 位
复杂度 O ( 26 n l o g n ) O(26nlogn) O(26nlogn)

代码如下

#include <bits/stdc++.h>
#define N 400005
using namespace std;
int a[N], b[N], n;
int get(int l, int x){
	if(b[n] < x) return 0;
	int r = n, mid;
	while(l < r){
		mid = l + r >> 1;
		if(b[mid] >= x) r = mid;
		else l = mid + 1;
	}
	return n - l + 1;
}
int main(){
	int i, j, m, sum, ans = 0;
	scanf("%d", &n);
	for(i = 1; i <= n; i++) scanf("%d", &a[i]);
	for(j = 0; j <= 26; j++){
		for(i = 1; i <= n; i++) b[i] = a[i] & ((1 << j + 1) - 1);
		//printf("%d======\n", j);
		//for(i = 1; i <= n; i++) printf("%d ", b[i]);
		//printf("\n");
		sort(b + 1, b + i);
		sum = 0;
		for(i = 1; i < n; i++){
			sum = (sum + get(i + 1, (1 << j) - b[i])) % 2;
			sum = (sum - get(i + 1, (1 << j + 1) - b[i])) % 2;
			sum = (sum + get(i + 1, (1 << j) + (1 << j + 1) - b[i])) % 2;
		}
		//printf("sum === %d\n", sum);
		if(sum % 2) ans |= (1 << j);
	}
	printf("%d", ans);
	return 0;
}
各种题解及学习笔记~ 文章被收录于专栏

各种题解及学习笔记

全部评论

相关推荐

01-12 14:08
门头沟学院 Java
有寒假来武汉小米总部实习的大学生嘛,我也是小米的员工,想找合租舍友,仅限女生可免租半月,二月初可入住,也就是说房租是2.15开始算的哦~也可以将行李提前放过来~房屋介绍:1、房子情况:有电梯;租的是三室一厅一卫一厨,&nbsp;但是有个卧室比较小,不打算找人,只住两个人就可以了;衣柜也很大,可以放下很多衣服;房屋采光真的很好,早上起来可以在床上晒太阳的那种,十分惬意(夏季晚上十分好看!)2.&nbsp;楼下离我们很近的地方有小吃街和一个两层大超市(大概步行两分钟多就可以走到)&nbsp;,还有一个新开的麦当劳,晚上可以去吃小吃,购买物资也可以去大超市;3.&nbsp;房子基本设施齐备(洗衣机,冰箱,空调,油烟机,热水器);4.&nbsp;我有稳定的工作,生活中很注意卫生,周末有时间会自己做饭,可以投喂哦~5.&nbsp;出行:距离公交站步行10分钟不到,距政务中心,武汉小米总部三站(晚上我都是走回来的,很近的~);一个比较进的地铁,距离大概1km左右;出入我觉得很方便;6.&nbsp;房租:1150每月,押一付二,无物业费,也没有中介费和其他额外费用。7.&nbsp;民用水电燃气,用多少交多少,水电费正常平摊。希望你是:1.&nbsp;女生(本人女),不带异性回家,如有同性朋友来玩,最多过夜一晚;2.&nbsp;爱干净,讲卫生,作息正常,不吵闹,有稳定工作;3.&nbsp;好沟通,有任何问题一定要沟通,不要闷着!中介勿扰,非诚勿扰!!!希望不要浪费彼此的时间诚心有意向的可以联系我看房
租房找室友
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务