题目链接:

http://codeforces.com/contest/703/problem/D

D. Mishka and Interesting sum

time limit per test 3.5 seconds
memory limit per test 256 megabytes
#### 问题描述
> Little Mishka enjoys programming. Since her birthday has just passed, her friends decided to present her with array of non-negative integers a1, a2, ..., an of n elements!
>
> Mishka loved the array and she instantly decided to determine its beauty value, but she is too little and can't process large arrays. Right because of that she invited you to visit her and asked you to process m queries.
>
> Each query is processed in the following way:
>
> Two integers l and r (1 ≤ l ≤ r ≤ n) are specified — bounds of query segment.
> Integers, presented in array segment [l,  r] (in sequence of integers al, al + 1, ..., ar) even number of times, are written down.
> XOR-sum of written down integers is calculated, and this value is the answer for a query. Formally, if integers written down in point 2 are x1, x2, ..., xk, then Mishka wants to know the value , where — operator of exclusive bitwise OR.
> Since only the little bears know the definition of array beauty, all you are to do is to answer each of queries presented.
#### 输入
> The first line of the input contains single integer n (1 ≤ n ≤ 1 000 000) — the number of elements in the array.
>
> The second line of the input contains n integers a1, a2, ..., an (1 ≤ ai ≤ 109) — array elements.
>
> The third line of the input contains single integer m (1 ≤ m ≤ 1 000 000) — the number of queries.
>
> Each of the next m lines describes corresponding query by a pair of integers l and r (1 ≤ l ≤ r ≤ n) — the bounds of query segment.
#### 输出
> Print m non-negative integers — the answers for the queries in the order they appear in the input.
#### 样例
> **sample input**
> 7
> 1 2 1 3 3 2 3
> 5
> 4 7
> 4 5
> 1 3
> 1 7
> 1 5
>
> **sample output**
> 0
> 3
> 1
> 3
> 2

题意

求一个区间内所有出现次数为偶数次的数的异或和。

题解

如果题目叫我们求区间内所有出现次数为奇数次的数的异或和,那就好办了,直接把区间所有的数都异或起来就可以了。

现在我们把问题转换一下:我们先求出所有的数的异或和sum1,然后再求出区间内所有不同的数的异或和sum2,那么ans=sum1^sum2.

对于sum1可以O(n)跑前缀异或和,也可以跑线段树。而对于sum2我们可以用离线的线段树来处理(搓这里)。

代码

#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
#include<cstring>
#define lson (o<<1)
#define rson ((o<<1)|1)
#define M l+(r-l)/2
#define X first
#define Y second
#define mkp make_pair
using namespace std; const int maxn = 1e6 + 10;
const int maxq = 1e6 + 10;
typedef int LL; LL sumv[maxn << 2],sumv2[maxn<<2];
map<int, pair<int,int> > mp; int arr[maxn];
LL ans[maxq]; struct Node {
int l, r, id;
bool operator <(const Node& tmp) const {
return r < tmp.r;
}
} nds[maxq]; int ql, qr;
LL _sumv,_sumv2;
void query(int o, int l, int r) {
if (ql <= l&&r <= qr) {
_sumv ^= sumv[o];
_sumv2 ^= sumv2[o];
}
else {
if (ql <= M) query(lson, l, M);
if (qr>M) query(rson, M + 1, r);
}
} int _p, _v;
void update(int o, int l, int r,int type) {
if (l == r) {
if(type==1) sumv[o] = _v;
else sumv2[o] = _v;
}
else {
if (_p <= M) update(lson, l, M,type);
else update(rson, M + 1, r,type);
if(type==1) sumv[o] = sumv[lson] ^ sumv[rson];
else sumv2[o] = sumv2[lson] ^ sumv2[rson];
}
} int n; void init() {
memset(sumv, 0, sizeof(sumv));
mp.clear();
} int main() {
init();
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &arr[i]);
_p = i; _v = arr[i]; update(1, 1, n, -1);
}
int q;
scanf("%d", &q);
for (int i = 0; i < q; i++) {
scanf("%d%d", &nds[i].l, &nds[i].r);
nds[i].id = i;
}
sort(nds, nds + q);
int pos = 1;
for (int i = 0; i < q; i++) {
int l = nds[i].l, r = nds[i].r, id = nds[i].id;
while (pos <= r) {
if (mp.count(arr[pos])) {
_p = mp[arr[pos]].X, _v = 0;
update(1, 1, n,1);
}
mp[arr[pos]].X = pos;
_p = pos, _v = arr[pos];
update(1, 1, n,1);
pos++;
}
ql = l, qr = r;
_sumv = 0,_sumv2=0;
query(1, 1, n);
ans[id] = _sumv^_sumv2;
}
for (int i = 0; i < q; i++) {
printf("%d\n", ans[i]);
}
return 0;
}

Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum 离线+线段树的更多相关文章

  1. Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum (离线树状数组+前缀xor)

    题目链接:http://codeforces.com/contest/703/problem/D 给你n个数,m次查询,每次查询问你l到r之间出现偶数次的数字xor和是多少. 我们可以先预处理前缀和X ...

  2. Codeforces Round #365 (Div. 2) D.Mishka and Interesting sum 树状数组+离线

    D. Mishka and Interesting sum time limit per test 3.5 seconds memory limit per test 256 megabytes in ...

  3. Codeforces Round #365 (Div. 2)-D Mishka and Interesting sum(树状数组)

    题目链接:http://codeforces.com/contest/703/problem/D 思路:看了神犇的代码写的... 偶数个相同的数异或结果为0,所以区间ans[l , r]=区间[l , ...

  4. Codeforces Round #365 (Div. 2) D - Mishka and Interesting sum(离线树状数组)

    http://codeforces.com/contest/703/problem/D 题意: 给出一行数,有m次查询,每次查询输出区间内出现次数为偶数次的数字的异或和. 思路: 这儿利用一下异或和的 ...

  5. Codeforces Round #365 (Div. 2) D.Mishka and Interesting sum

    题目链接:传送门 题目大意:给n个数,m次询问,每次询问区间 l,r 内出现偶数次数的异或和 题目思路:前缀和+离线处理+树状数组 首先可以知道, l,r 内出现奇数次的数的和,就是把 l,r内所有数 ...

  6. CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组

    题目链接:CF #365 (Div. 2) D - Mishka and Interesting sum 题意:给出n个数和m个询问,(1 ≤ n, m ≤ 1 000 000) ,问在每个区间里所有 ...

  7. CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组(转)

    转载自:http://www.cnblogs.com/icode-girl/p/5744409.html 题目链接:CF #365 (Div. 2) D - Mishka and Interestin ...

  8. Codeforces Round #538 (Div. 2) F 欧拉函数 + 区间修改线段树

    https://codeforces.com/contest/1114/problem/F 欧拉函数 + 区间更新线段树 题意 对一个序列(n<=4e5,a[i]<=300)两种操作: 1 ...

  9. Codeforces Round #222 (Div. 1) B. Preparing for the Contest 二分+线段树

    B. Preparing for the Contest 题目连接: http://codeforces.com/contest/377/problem/B Description Soon ther ...

随机推荐

  1. 理解 JavaScript Scoping & Hoisting(二)

    理解 JavaScript Scoping & Hoisting(二) 转自:http://www.jb51.net/article/75090.htm 这篇文章主要介绍了理解 JavaScr ...

  2. 选择两个字段时distinct位置的影响

    当选择两个字段时,例如:"select XX1, XX2 from tb; ",那么将distinct放在前一个字段XX1之前和放在后一个字段XX2之前,结果有什么不同呢? 先说结 ...

  3. Py Split and Count For "PFW Impact Crusher For Sale South Africa"

    data = 'As we all know, the impact Crusher is fully used in the transportation, energy, construction ...

  4. RecyclerView中显示不同的item

    测试代码: activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/an ...

  5. android获取com.android.internal.R

    使用class.jar, layout.jar可以直接导入com.android.internal.R 但是有个方法获取不到值mDatePicker.findViewById(com.android. ...

  6. php中的日期

    1.在PHP中获取日期和时间 time()返回当前时间的 Unix 时间戳. getDate()返回日期/时间信息. gettimeofday()返回当前时间信息.date_sunrise()返回给定 ...

  7. 【C++】快排

    假设要排序的数据类型为int int main() { qsort(a,len,sizeof(int),cmp); //qsort(数组的起始位置,排序个数,类型大小,比较函数); } int cmp ...

  8. Learning Scrapy笔记(五)- Scrapy登录网站

    摘要:介绍了使用Scrapy登录简单网站的流程,不涉及验证码破解 简单登录 很多时候,你都会发现你需要爬取数据的网站都有一个登录机制,大多数情况下,都要求你输入正确的用户名和密码.现在就模拟这种情况, ...

  9. ARM中MMU地址转换理解

    首先,我们要分清ARM CPU上的三个地址:虚拟地址(VA,Virtual Address).变换后的虚拟地址(MVA,Modified Virtual Address).物理地址(PA,Physic ...

  10. Oracle ClusterwarePRCT-1011 : Failed to run "oifcfg".&nb

    OS: Oracle Linux Server release 6.3 DB: Oracle 11.2.0.3 在oracle-linux6.3安装11g RAC,在安装软件时候提示: An inte ...