2022春每日一题:Day 29
题目:Mishka and Interesting sum
这题稍微分析就能发现实际这个题就是求区间异或和异或上区间不同数的异或和,因此直接转化为HH的项链。
代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <map>
#define lowbit(x) x&-x
const int N=1e6+5;
using namespace std;
typedef pair<int,int> PII;
struct node
{
int l,r,id;
node(int ll,int rr,int ii)
{
l=ll;r=rr;id=ii;
}
node(){
}
friend bool operator < (node a,node b)
{
if(a.r==b.r)
return a.l<b.l;
return a.r<b.r;
}
}e[N];
PII b[N];
int n,m,a[N],ret[N],c[N],t[N],sum[N],num[N],cnt;
map <int,int> mp;
namespace fenwick
{
struct fwt
{
int s;
}fw[N];
int query(int x)
{
int ret=0;
for(int i=x;i;i-=lowbit(i))
ret^=fw[i].s;
return ret;
}
void modify(int x,int z)
{
for(int i=x;i<=n;i+=lowbit(i))
fw[i].s^=z;
}
}
using namespace fenwick;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]={a[i],i};
sum[i]=sum[i-1]^a[i];
if(!mp.count(a[i]))
mp[a[i]]=i;
}
/*
sort(b+1,b+1+n);
int last=-1,tot=1;
for(int i=1;i<=n;i++)
{
if(last!=b[i].first)
tot=i,last=b[i].first;
num[b[i].second]=tot;
}
*/
scanf("%d",&m);
for(int i=1;i<=m;i++)
scanf("%d %d",&e[i].l,&e[i].r),e[i].id=i;
sort(e+1,e+1+m);
int head=1;
for(int i=1;i<=m;i++)
{
while(head<=e[i].r)
{
if(t[mp[a[head]]])
modify(t[mp[a[head]]],a[head]);
modify(head,a[head]);
t[mp[a[head]]]=head;
head++;
}
head=e[i].r+1;
ret[e[i].id]=(query(e[i].r)^query(e[i].l-1)^sum[e[i].r]^sum[e[i].l-1]);
}
for(int i=1;i<=m;i++)
printf("%d\n",ret[i]);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话