ACWING 4645. 选数异或
题意:
给n个数,再给m次查询,给一个数x
每次询问给一个区间l,r,问是否能从
使得它们的异或值等于x
思路:
这题有个异或性质我没想到(
找两个数使得
根据异或的交换性来说
式子可以变成:
那么我们直接用
这时候问题就变成了去找离r最近的
暴力思路就是先枚举后端点,往前枚举前端点,记录每个点的满足条件的最右边的值
当然这是O2的,肯定不行
用个map即可很好地解决这个问题
每次map都记录一下a[i]的值,并且使得
这样后面用map来寻找值就直接找到的是下标
并且由于是顺序遍历,后面新的值会覆盖旧的值,而新的值的下标一定是优于旧的值的
然后再用map来弄出
用个数组g来记录这些值
然后最后接收l和r,比较是否
然后就发现样例都过不去(
因为这里算的是每个
实际上如果[2,3]满足的话,[2,4]是一定满足的
因为是从这个范围选择两个数,其中一个数并不一定要在最右端点
这里的解决方案就是:
在算
这样就保证了后面的值会继承前面的最右下标
代码:
void solve()
{
map<int,int> mp;
int x;
cin >> n >> m >> x;
vector<int> a(n + 10),b(n + 10);
for(int i = 1;i <= n;i++) cin >> a[i];
for(int i = 1;i <= n;i++)
{
b[i] = max(mp[a[i]^x],b[i - 1]);
mp[a[i]] = i;
}
while(m--)
{
int l,r;
cin >> l >> r;
if(b[r] >= l) YES;
else NO;
}
}
总结:
异或是具有交换性的
所以问是否
看题目要求什么,这种后面有很多询问的,一般的
如果一种情况包含另一种情况,考虑用max那个预处理的东西来维护
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】