D. Mishka and Interesting sum
time limit per test

3.5 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Little Mishka enjoys programming. Since her birthday has just passed, her friends decided to present her with array of non-negative integersa1, 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:

  1. Two integers l and r (1 ≤ l ≤ r ≤ n) are specified — bounds of query segment.
  2. Integers, presented in array segment [l,  r] (in sequence of integers al, al + 1, ..., ar) even number of times, are written down.
  3. 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.

Input

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.

Output

Print m non-negative integers — the answers for the queries in the order they appear in the input.

Examples
input
3
3 7 8
1
1 3
output
0
input
7
1 2 1 3 3 2 3
5
4 7
4 5
1 3
1 7
1 5
output
0
3
1
3
2
Note

In the second sample:

There is no integers in the segment of the first query, presented even number of times in the segment — the answer is 0.

In the second query there is only integer 3 is presented even number of times — the answer is 3.

In the third query only integer 1 is written down — the answer is 1.

In the fourth query all array elements are considered. Only 1 and 2 are presented there even number of times. The answer is .

In the fifth query 1 and 3 are written down. The answer is .


简述题意:给你一个长度为n的序列,以及t组询问,每组询问 l~r ,求区间内出现偶数次的数的亦或和。(n,t<=10^5)
首先区间出现奇数次的数的亦或和就是区间亦或和,那么如果我们记录区间亦或和,再亦或 区间内出现过的数字的亦或和(比如 1 3 4 3)就是1^3^4^3=5,5^1^3^4=3,出现偶数次的是3。
所以这就变成了一个无修改的输出区间出现过的数字的亦或和,我们这样考虑,先把询问离线排序,按照右端点排序后,用线段树维护区间亦或和,则比如我一个数字在3,7,8位置都出现过,那我记录他上一次在哪出现,把上一个位置的数字改为0,再在新位置放上这个数,然后线段树query即可。
即if(lst[find(a[i])]) update(lst[find(a[i])] , a[i]); update(i.a[i]); printf("%d\n",query(l,r));

#include <stdio.h>
#include <iostream>
#include <memory.h>
#include <algorithm>
using namespace std; #define getch() getchar()
inline int F() { register int aa , bb , ch;
while(ch = getch() , (ch<''||ch>'') && ch != '-'); ch == '-' ? aa=bb= : (aa=ch-'',bb=);
while(ch = getch() , ch>=''&&ch<='') aa = aa* + ch-''; return bb ? aa : -aa;
} const int Maxn = ;
const int Maxt = ;
struct node {
int l , r , id;
} q[Maxn];
int n , m , s[Maxn] , a[Maxn] , tmp , b[Maxn] , bcnt , ll[Maxt] , rr[Maxt] , tree[Maxt] , lst[Maxn] , ANS[Maxn]; void unique() {
bcnt = ;
for(int i=; i<=n; ++i)
if(b[i] != b[bcnt]) b[++bcnt] = b[i];
} int search(int x) {
int l = , r = bcnt , ans = ;
while(l <= r) {
int mid = (l + r) >> ;
if(b[mid] >= x) r = mid - , ans = mid;
else l = mid + ;
}return ans;
} void Build(int x , int l , int r) {
ll[x] = l; rr[x] = r;
tree[x] = ;
if(l == r) return;
int mid = (l + r) >> ;
Build(x<< , l ,mid);
Build(x<<| , mid+ , r);
} void update(int x , int k , int kk) {
tree[x] ^= kk;
if(ll[x] == rr[x]) return ;
int mid = (ll[x] + rr[x]) >> ;
if(mid >= k) update(x<< , k , kk);
else update(x<<| , k , kk);
tree[x] = tree[x<<] ^ tree[x<<|];
} int query(int x , int l , int r) {
l = max(ll[x] , l) ; r = min(rr[x] , r);
if(l > r) return ;
if(l == ll[x] && r == rr[x]) return tree[x];
return query(x<< , l , r) ^ query(x<<| , l , r);
} inline bool cmp (node a , node b) { return a.r < b.r; } int main() {
n = F();
for(int i=; i<=n; ++i) {
a[i] = b[i] = F();
s[i] = s[i-] ^ a[i];
// printf("s[%d] = %d\n",i , s[i] );
}
Build(,,n);
std::sort(b+,b+n+);
unique();
// for(int i=1; i<=bcnt; ++i) printf("%d ",b[i] ); puts("");
m = F();
for(int i=; i<=m; ++i) {
q[i].l = F();
q[i].r = F();
q[i].id = i;
}
int j = ;
std::sort(q+,q+m+,cmp);
// for(int i=1; i<=m; ++i) { printf("Qid:%d : %d %d\n", q[i].id , q[i].l , q[i].r); }
for(int i=; i<=m; ++i) {
while(j <= q[i].r) {
int tmp = search(a[j]);
// printf("aj = %d tmp = %d\n", a[j] , tmp);
if(lst[tmp]) {
update(,lst[tmp],a[j]);
// printf("lst[%d] = %d\n",tmp , lst[tmp] );
}
update(,j,a[j]);
lst[tmp] = j;
++j;
}
ANS[q[i].id] = query( , q[i].l , q[i].r) ^ s[q[i].r] ^ s[q[i].l-];
// for(int i=1; i<=n; ++i) printf("%d ", query(1,i,i)); puts("");
// printf("QL : %d , Qr : %d , Qans = %d\n" ,q[i].l , q[i].r , ANS[q[i].id]);
}
for(int i=; i<=m; ++i) printf("%d\n", ANS[i]);
return ;
}

codeforces D的更多相关文章

  1. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  2. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  3. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  4. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  5. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  6. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  7. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

  8. CodeForces - 696B Puzzles

    http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...

  9. CodeForces - 148D Bag of mice

    http://codeforces.com/problemset/problem/148/D 题目大意: 原来袋子里有w只白鼠和b只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...

  10. CodeForces - 453A Little Pony and Expected Maximum

    http://codeforces.com/problemset/problem/453/A 题目大意: 给定一个m面的筛子,求掷n次后,得到的最大的点数的期望 题解 设f[i]表示掷出 <= ...

随机推荐

  1. 我理解的C++虚函数表

    今天拜读了陈皓的C++ 虚函数表解析的文章,感觉对C++的继承和多态又有了点认识,这里写下自己的理解.如果哪里不对的,欢迎指正.如果对于C++虚函数表还没了解的话,请先拜读下陈皓的C++ 虚函数表解析 ...

  2. ADO.NET笔记——带参数的查询防止SQL注入攻击

    相关知识: 把单引号替换成两个单引号,虽然能起到一定的防止SQL注入攻击的作用,但是更为有效的办法是把要拼接的内容做成“参数” SQLCommand支持带参数的查询,也就是说,可以在查询语句中指定参数 ...

  3. NFS参数配置详细说明

    摘抄自:http://www.linuxidc.com/Linux/2012-05/61527p3.htm 1.NFS概述 NFS:Network file system,网络文件系统: 由sun公司 ...

  4. Android String format 通过value 下的string.xml 文件

    <string name="format_coordinate" formatted="false">%s %d° %d\' %d\" % ...

  5. Java包的命名规则

    按照惯例,包申明遵循特定的格式.虽然不是严格要求的Java语法,如果不遵循格式要求,大多数的Java认为你是不懂Java. 从右到左的顺序是: 1.systaxExample表明包的本地名称. 2.e ...

  6. AS3 - 数组Array的几个常用方法(附样例)

    AS3 - 数组Array的几个常用方法(附样例) 2015-03-30 10:39发布:hangge浏览:241   Flex/Flash开发中,经常会使用到数组,下面总结了一些数组的常用方法. 1 ...

  7. JMS之开源实现ActiveMQ

    1.ActiveMQ是开源的JMS实现. 可以把不影响用户执行结果又比较耗时的任务(比如发邮件通知管理员)异步的扔给jms 服务端,而尽快的把屏幕返还给用户,且服务端能够多线程排队响应高并发的请求.可 ...

  8. backbone前端基础框架搭建

    前端站点名为:site: 前端框架分为:css.js和img,框架的核心在js文件夹下: js中包括collections.models.views.lib和一个app入口js

  9. 自定义Adapter

    --MainActivity代码 package com.example.qqdemo; import java.util.ArrayList; import java.util.List; impo ...

  10. 不逃离WIndows,Asp.Net就只能写写进销存管理系统

    那个丹麦人把C#语言弄的再好,但是如果程序放进Windows+IIS这个容器,就有问题了. 我在I5+8G内存的机子上测试Windows2008+IIs,直接ab 2000并发压默认的HTML主页,还 ...