JZOJ3882 [NOIP2014模拟] 邻近(near)

该博客介绍了如何解决一道编程竞赛题目,涉及计算一组人在限定线段上按特定位置站立后,队伍中相邻两人无聊值异或和的总和问题。通过倒序遍历并更新每个位置的异或和,最终求得每个人加入后的友善值异或和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description
有这么一群人决定随便做点什么。他们逐渐站成了一排。
而现在我们想知道每个人加入队伍后整个局面的友善值。
为了简化,我们这么描述这个问题:有n个无聊的人,对于一条长为m(n<=m)的线段,这n个人依次站到自己的位置上,其中第i个人位于位置pi(1<=pi<=m)上,且他的无聊值为bi(0<=bi<2^31)。我们定义一个队伍的友善值为每对相邻的人的契合度之和。两个人的契合度定义为他们的无聊值的异或值。
我们要知道的是在每个人加入之后整个队伍的友善值。为了更方便确认你能够得到答案,输出每个人加入后整个队伍的友善值的异或和即可。

Input
第1行:2个非负整数n,m,表示无聊的人数和线段的长度。
第2至n+1行:第i+1行2个整数表示第i个人的位置pi和无聊值bi。

Output
输出一个整数表示每个人加入后队伍的友善值的异或和。

Data Constraint
对于30%的数据,m,n<=1000
对于60%的数据,m,n<=100000
对于100%的数据,n<=1000000,m<=2000000,n<=m
并且对于任意i,j(1<=i<j<=n),有pi>pj或pi<pj

Solution
由于没有强制在线,我们可以倒着做一遍。

设sum表示所有数的异或和,并且记录每一个点的左边的点和右边的点。那么我们倒着搜,每搜到一个点时,用sum减去它与他左边和右边的异或值,再加上它左边与右边的异或值,每次用ans异或sum就行了。

Code

#include <cstdio>
#include <algorithm>
using namespace std;

struct nade
{
   
	int p, b;
}a[1000007], c[1000007];

int n, m;
long long ans, sum;
int lt[2000007], nt[2000007
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值