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;
}
posted @   __honey  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示