zoukankan      html  css  js  c++  java
  • XOR and Favorite Number CodeForces

    a[i]^a[i+1]……a[j]=k;
    处理前缀和pre[i]
    那么上式可以表示为pre[i-1]^pre[j]=k;

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1<<20;
    struct node{
    	int l,r;
    	int id;
    }q[N];
    int pos[N];
    long long ans[N];
    //每个前缀值出现的次数 
    long long flag[N];
    int a[N];
    bool cmp(node a,node b)
    {
    	//如果左端点在同一块中,按右端点排序 
    	if(pos[a.l]==pos[b.l])
    		return a.r<b.r;
    	//否则,按照块来排序 
    	return pos[a.l]<pos[b.l];
    }
    int n,m,k;
    int l=1,r=0;
    long long Ans=0;
    void add(int x)
    {
    	//当前 前缀和出现的次数-- 
    	Ans+=flag[a[x]^k];
    	flag[a[x]]++;
    } 
    void del(int x)
    {
    	//当前 前缀和出现的次数-- 
    	flag[a[x]]--;
    	//总的减去 
    	Ans-=flag[a[x]^k];
    }
    int main()
    {
    	cin>>n>>m>>k;
    	int sz=sqrt(n);
    	for(int i=1;i<=n;i++)
    	{
    		cin>>a[i];
    		//处理前缀和 
    		a[i]=a[i]^a[i-1];
    		//分块 
    		pos[i]=i/sz;
    	}
    	for(int i=1;i<=m;i++)
    	{
    		cin>>q[i].l>>q[i].r;
    		q[i].id=i;
    	}
    	sort(q+1,q+1+m,cmp);
    	flag[0]=1;
    	for(int i=1;i<=m;i++)
    	{
    		while(l<q[i].l)
    		{
    			del(l-1);
    			l++;
    		}
    		while(l>q[i].l)
    		{
    			l--;
    			add(l-1);
    		}
    		while(r<q[i].r)
    		{
    			r++;
    			add(r);
    		}
    		while(r>q[i].r)
    		{
    			del(r);
    			r--;
    		}
    		ans[q[i].id]=Ans;
    	}
    	for(int i=1;i<=m;i++)
    		cout<<ans[i]<<endl;
    	return 0;
    }
    
  • 相关阅读:
    this和$(this)的关系
    单色边表格
    php概率算法
    jQuery Ajax 参数解析
    拍拍CPS入门使用
    飞鸽端口被占
    浏览器调试工具技巧分享
    事件click,bind,click
    jQuery旋转插件—rotate
    利用谷歌API生成二维码
  • 原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12378069.html
Copyright © 2011-2022 走看看