跳到主要内容

题解:P1366 有序表的合并

· 阅读需 2 分钟
lailai
Blogger

原题链接

参考资料

解题思路

  1. 初始令左右边界 l=1l=1r=1r=1

  2. 对于每个元素 aia_i,执行如下操作:

  • 将区间左边界 llrr 开始向后枚举,直到 bl=aib_l=a_ilml\le m),说明 blb_l 是第一个等于 aia_i 的元素。
  • 将区间右边界 rrll 开始向后枚举,直到 braib_r\not =a_irmr\le m),说明 brb_r 是第一个不等于 aia_i 的元素。
  • 此时 lrl-r 即为 aia_i 出现的个数
  1. 最后求出所有数的异或和。

参考代码

#include <bits/stdc++.h>
using namespace std;

using ull=unsigned long long;
const int N=10000005;
ull a[N],b[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin>>T;
while(T--)
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=m;i++)
{
cin>>b[i];
}
int l=1,r=1,ans=0;
for(int i=1;i<=n;i++)
{
l=r;
while(b[l]<a[i]&&l<=m)l++;
r=l;
while(b[r]==a[i]&&r<=m)r++;
ans^=r-l;
}
cout<<ans<<'\n';
}
return 0;
}