6月模拟赛题解 序列

题目描述

原题地址

题解

在这里插入图片描述

标程

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 100005
typedef long long ll;
using namespace std;
ll arr[maxn],ans[maxn],pre[maxn],sum[maxn];
ll now=0,cnt1[maxn],cnt2[maxn];
int n,m,block=0;
struct query
{
    int l, r, ind;
    bool operator < (const query &b)const
    {
        if(l/block == b.l/block)return r < b.r;
        return l/block < b.l/block;
    }
}qrr[maxn];
void ins1(int i)
{
	cnt1[0^pre[i]]++;
	cnt2[0^pre[i-1]]++;
	now+=cnt2[pre[i]];
}
void remov1(int i)
{
	now-=cnt2[pre[i]];
	cnt1[0^pre[i]]--;
	cnt2[0^pre[i-1]]--;
}
void ins2(int i)
{
	cnt1[0^pre[i]]++;
	cnt2[0^pre[i-1]]++;
	now+=cnt1[pre[i-1]];
}
void remov2(int i)
{
	now-=cnt1[pre[i-1]];
	cnt1[0^pre[i]]--;
	cnt2[0^pre[i-1]]--;
}
int main()
{
    scanf("%d%d",&n,&m);
    block=(int)sqrt(n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&arr[i]);
        pre[i]=pre[i-1]^arr[i];
    }
    for(int i=1;i<=m;i++)
    {
        qrr[i].ind=i;
        scanf("%d%d",&qrr[i].l,&qrr[i].r);
        qrr[i].l++;
    }
    sort(qrr+1,qrr+1+m);
    int l=1,r=1;
    ins1(1);
    for(int i=1;i<=m;i++)
    {
        while(l<qrr[i].l) remov2(l++);
        while(l>qrr[i].l) ins2(--l);
        while(r<qrr[i].r) ins1(++r);
        while(r>qrr[i].r) remov1(r--);
        ans[qrr[i].ind]=now;
    }
    for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);
    return 0;
}

其实莫队挺好van的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值