首页 > 其他分享 >[ARC127D] Sum of Min of Xor Solution

[ARC127D] Sum of Min of Xor Solution

时间:2024-12-25 18:21:03浏览次数:7  
标签:Xor log Min int neg Sum ans oplus ll

题意

给定两个长度为 \(n\) 的数组 \(a,b\),求

\[\sum_{i=1}^n\sum_{j=i+1}^n\min\{a_i\oplus a_j,b_i\oplus b_j\} \]

其中 \(\oplus\) 表示按位异或。

分析

简单二进制分治题(看代码可能更好理解)。

先将有序对转成无序对,最后答案为结果的一半。

考虑去除 \(\min\),于是拆位计算贡献。

一个经典的思路是考虑 \(a_i\oplus a_j,b_i\oplus b_j\),在第 \(k\) 位不同,凭此判断大小。设计函数 \(f(a,b,k)\) 表示 \(a_i\oplus a_j,b_i\oplus b_j\) 的第 \(k\) 位之后全部相等,计算 \(1 \rightarrow k\) 位的贡献。把每个元素视作 01 二元组 \((x,y)\),代表 \(a_i,b_i\) 的第 \(k\) 位上的值。答案的贡献分如下几种考虑:

1.\((x,y) \leftarrow (\neg x,y)\),这就说明 \(a_i \oplus a_j\) 这一位是 \(1\),而 \(b_i \oplus b_j\) 这一位是 \(0\),\(\min = b_i \oplus b_j\),这部分记录位的就能 \(O(\log n)\) 算一个数的答案了。

2.\((x,y) \leftarrow (x,\neg y)\),同 1 处理。

3.$(x,y) \leftarrow (\neg x,\neg y) $,两位相等,无法判断大小,但恒有 \(2^k\) 的贡献,向下递归处理。

4.$(x,y) \leftarrow (x,y) $,同 3,无贡献,直接向下递归处理。

\(O(\log V)\) 层,每层均摊 \(O(n\log V)\),时间复杂度为超小常数 \(O(n\log^2V)\)。

代码

#include <bits/stdc++.h>
#define lb(x) (x&-x)
#define lc(x) (x<<1)
#define rc(x) (x<<1|1)
using namespace std;
using ll=long long;
using LL=__int128;
using pii=pair<ll,int>;
const int N=25e4+5; ll ans;
struct PairSet{
	int c[20][2]; vector<int>v;
	PairSet(){ memset(c,0,sizeof(c)); }
	void ins(int x){
		v.push_back(x);
		for(int j=0;j<20;j++)
			c[j][x>>j&1]++;
	}
	ll ask(int x){
		ll res=0;
		for(int j=0;j<20;j++)
			res+=(1ll<<j)*c[j][!(x>>j&1)];
		return res;
	}
};
void solve(vector<int>&a,vector<int>&b,int k){
	int n=a.size(); if(!n||!~k) return ;
	PairSet w[2][2][2];
	for(int i=0;i<n;i++){
		int x=a[i]>>k&1,y=b[i]>>k&1;
		w[x][y][0].ins(a[i]&=(1<<k+1)-1);
		w[x][y][1].ins(b[i]&=(1<<k+1)-1);
	}
	for(int i=0;i<n;i++){
		int x=a[i]>>k&1,y=b[i]>>k&1;
		ans+=w[x][y^1][0].ask(a[i]);
		ans+=w[x^1][y][1].ask(b[i]);
		ans+=(ll)w[x^1][y^1][0].v.size()*(1<<k);
	}
	for(int i=0;i^2;i++){
		for(int x:w[1][i^1][0].v) w[0][i][0].v.push_back(x);
		for(int x:w[1][i^1][1].v) w[0][i][1].v.push_back(x);
		solve(w[0][i][0].v,w[0][i][1].v,k-1);
	}
}
int main(){
	int n; scanf("%d",&n);
	vector<int>a(n),b(n);
	for(int i=0;i<n;i++) scanf("%d",&a[i]);
	for(int i=0;i<n;i++) scanf("%d",&b[i]);
	return solve(a,b,20),printf("%lld",ans>>1)&0;
}

标签:Xor,log,Min,int,neg,Sum,ans,oplus,ll
From: https://www.cnblogs.com/Yui-Hirasawa/p/18631185

相关文章

  • [ABC283Ex] Popcount Sum Solution
    有点意思的黑题。\[\begin{aligned}{}&\sum_{i\bmodm\=\r}^{n}\rm{popcount}(i)\\&=\sum_{i=0}^{\lfloor\frac{n-r}{m}\rfloor}\rm{popcount}(im+r)\\&=\sum_{i=0}^{\lfloor\frac{n-r}{m}\rfloor}\sum_{j=0}^{\log(im+r)}......
  • mysql出现unblock with 'mysqladmin flush-hosts'
    朋友发来消息,说一个系统应用登录的时候提示连接超时,让帮忙处理一下。问他应用和数据库是否都正常,回复说数据库好像没有问题,但是应用日志报无法连接数据库。数据库版本是:5.5.53让他telnet数据库是否是通的,回复说不通,并发来了信息提示:12345#telnet 8.8.9.93306......
  • 关于sumo中时间的计算
    在您的程序中,total_timesteps=100000和num_seconds=180是两个不同的概念,但它们之间有一定的关系,具体取决于您的环境配置和每个时间步的时长。下面是详细解释和计算方法:1.total_timesteps=100000的含义total_timesteps=100000指的是训练过程中智能体与环境交互的总时间步......
  • Grafana 重置admin密码
    Grafana重置admin密码原创不小心忘记了grafanaweb界面的密码后,使用官网的方式重置密码http://docs.grafana.org/administration/cli/#reset-admin-password但是并没有成功。然后使用google到的另外一个方法重置成功了,现在记录下来:1.查找grafana.db文件find/-name"grafa......
  • 使用 pyminify 压缩 Python 代码,解决超出GPT上下文长度限制的问题
    一句话总结版运行以下命令,替换yourfile.py为你要压缩的代码。$pyminifyyourfile.py--outputyourfile.min.py--no-hoist-literals--no-rename-locals--no-remove-annotations--no-remove-variable-annotations--no-remove-return-annotations--no-remove-argument-an......
  • Sums on Segments
    前言赛时没打出来,赛后没调出来,感觉还是挺好的一道题,记一下思路容易发现的是对于\(a_i\in\{-1,1\}\)这样的情况,我们是可以取到极值中间的所有值的,因为你从极值的子段中,取出前缀一定可覆盖到其他值直观的理解就是每次对子段和的影响最多\(\pm1\),因此在取......
  • C++23新特性解析:[[assume]]属性
    1.引言在C++的发展历程中,性能优化一直是一个核心主题。C++23引入的[[assume]]属性为开发者提供了一个强大的工具,允许我们直接向编译器传达程序的不变量(invariant),从而实现更好的代码优化。1.1为什么需要assume?在C++23之前,主要编译器都提供了自己的内置假设机制:MSVC和IC......
  • minmax
    minmax题意给你一个长度为\(n\)的排列\(A\),你要把它拆成两个子序列\(B,C\),使得\(B\)中前缀最大值的个数加上\(C\)中前缀最小值的个数最大。\(n\le2\times10^5\)。思路考虑DP。设\(f_{i,x,y}\)表示考虑到\(a_i\),\(B\)中前缀最大值是\(x\),\(C\)中前缀最大......
  • 谷歌发布最新大模型 Gemini,包含多模态、三大版本,还有哪些特点?能力是否超越 GPT-4了?
    谷歌最新发布的Gemini2.0大规模语言模型,代表了人工智能技术在多个核心领域的重大突破。作为谷歌AI生态系统中的旗舰产品,Gemini2.0在架构设计、核心技术、多模态处理、性能优化等方面实现了显著提升。我在本文将深入介绍Gemini2.0的核心技术,重点详解其关键创新,并辅以图示说明......
  • GPT-Omni 与 Mini-Omni2:创新与性能的结合
    近年来,随着人工智能技术的飞速发展,各种模型和平台应运而生,以满足从个人用户到企业级应用的多样化需求。在这一领域,GPT-Omni和Mini-Omni2是两款备受瞩目的技术产品,它们凭借独特的设计和强大的功能,在人工智能应用领域中占据了一席之地。本文将简要介绍它们的特点和适用场景......