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的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章