前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CodeForces E. XOR and Favorite Number(Div.2)

CodeForces E. XOR and Favorite Number(Div.2)

作者头像
mathor
发布2018-09-19 15:18:20
2680
发布2018-09-19 15:18:20
举报
文章被收录于专栏:mathor
题目链接:E. XOR and Favorite Number

 一个莫队的基础题,题目要求[L,R]里面有多少对子区间异或值为k,记录一下前缀异或和arr,因为x^x=0,现在我们要求区间[L,R]的异或和值,用arr数组表示就是arr[L-1]^arr[R]==k,或者说arr[R]^k==arr[L-1]

代码语言:javascript
复制
import java.io.BufferedInputStream;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {
    
    final static int N = 1 << 21;
    static long nowAns = 0;//当前答案
    static int n,m,k,block;
    static long[] cnt = new long[N];//每个数出现的次数
    static long[] ans = new long[N];//记录每个答案
    static int[] arr = new int[N];//前缀异或和
    static Query[] q = new Query[N];//询问
    
    public static class cmp implements Comparator<Query> {
        public int compare(Query x,Query y) {
            if(x.l / block == y.l / block)
                return x.r - y.r;
            return x.l / block - y.l / block;
        }
    }
        
    public static void remove(int x) {
        cnt[arr[x]]--;
        nowAns -= cnt[arr[x] ^ k];
    }

    public static void add(int x) {
        nowAns += cnt[arr[x] ^ k];
        cnt[arr[x]]++;
    }
    
    public static void main(String[] args) {
        Scanner cin = new Scanner(new BufferedInputStream(System.in));
        int l = 1,r = 0;
        n = cin.nextInt();//数组长度
        m = cin.nextInt();//询问次数
        k = cin.nextInt();
        block = (int) Math.sqrt(n);//每块的大小
        for(int i = 1;i <= n;i++) {
            int tmp = cin.nextInt();
            arr[i] = arr[i - 1] ^ tmp;
        }
        for(int i = 1;i <= m;i++) {
            int tmp_l = cin.nextInt();
            int tmp_r = cin.nextInt();
            q[i] = new Query(tmp_l,tmp_r,i);//减1是为了将询问转换为下标
        }
        Arrays.sort(q,1,m + 1,new cmp());//sort是左闭右开的区间
        cnt[0] = 1;
        for(int i = 1;i <= m;i++) {
            while(l < q[i].l) {
                remove(l - 1);//移出数字
                l++;
            }
            while(l > q[i].l) {
                l--;
                add(l - 1);//加入数字
            }
            while(r < q[i].r) add(++r);//加入数字
            while(r > q[i].r) remove(r--);//移出数字
            ans[q[i].id] = nowAns;
        }
        for(int i = 1;i <= m;i++) System.out.println(ans[i]);
    }
}
class Query {
    int l,r,id;
    Query(int L,int R,int id) {
        this.l = L;
        this.r = R;
        this.id = id;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目链接:E. XOR and Favorite Number
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档