【29.82%】【codeforces 703D】Mishka and Interesting sum
【题解】
题意:
给n个数字组成有序数列;
给m个询问.
对于每个询问区间。输出这个区间里面出现次数为偶数次的所有数的异或值;
做法:
我们可以先求出这段区间里面所有(包括重复的数字)数字的异或值p1;
(出现次数为偶数的数x,这偶数个x的异或值为0(x^x==0),出现次数为奇数的数y(y^y^y==y),这奇数个数y的异或值为y,考虑到这些数字的和,那么剩下的其实就是出现次数为奇数次的所有数的异或值,也即p1);
然后我们再求出这段区间内不同的数字的异或值(去重)p2;
那么我们所需要的答案就是p1^p2;
因为异或了p2,所以p1中出现奇数次的数变成了偶数次->0,而原来出现偶数次的数变成出现奇数次->它本身);
则为我们所需的答案;
自己再想想吧.
然后就是求一段区间内不同的数字的总异或值的问题了。
这个问题可以用树状数组解决;
但是需要离线做;
把每个询问按照右端点升序排;
用map来判重;
枚举所有的数字;
到了一个新的数字;
就判断之前有没有出现过;
如果有出现过就把它之前的位置在树状数组中的相关值异或掉(相当于去除)。
然后给这个值设定一个新的位置(即当前的枚举到的位置);然后修改树状数组的相关位置.
然后如果有右端点和当前处理的数的位置相同。则用树状数组累加前缀异或值(不同的数).然后用一开始处理出的有重复数的前缀异或和和相应的东西异或就可以了。
要注意这道题里面异或有时就相当于减法.有时又相当于加法;
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
const int MAXN = 1e6 + 100;
const int MAXM = 1e6 + 100;
struct abc
{
int l, r, id;
};
int n, m;
int a[MAXN], c[MAXN], pre[MAXN];
int ans[MAXM];
abc Q[MAXM];
map <int, int> frequent;
bool cmp(abc a, abc b)
{
return a.r < b.r;
}
void input(int &r)
{
r = 0;
char t = getchar();
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
}
int lowbit(int x)
{
return x&(-x);
}
void add(int pos, int what)//修改某个点,修改相关值
{
int x = pos;
while (x <= n)
{
c[x] ^= what;
x += lowbit(x);
}
}
int sum(int pos)//累加前缀和
{
int x = pos;
int now = 0;
while (x > 0)
{
now = now^c[x];
x -= lowbit(x);//一直往左走
}
return now;
}
int main()
{
input(n);
pre[0] = 0;
for (int i = 1; i <= n; i++)
input(a[i]), pre[i] = pre[i - 1] ^ a[i];
input(m);
for (int i = 1; i <= m; i++)
{
input(Q[i].l); input(Q[i].r);
Q[i].id = i;
}
sort(Q + 1, Q + 1 + m, cmp);//询问按照右端点升序排序
int now = 1;//now是当前处理到的询问
for (int i = 1; i <= n; i++)
{
if (frequent[a[i]])//如果之前出现过
add(frequent[a[i]], a[i]);//将之前的数字剔除
frequent[a[i]] = i;//然后更新这个数字的新位置;
add(frequent[a[i]], a[i]);//修改树状数组的相关点
while (now <= m && i == Q[now].r)//保证右端点之前记录的都是不同的数字的信息
{//用树状数组的前缀和获取这段区间内的不同数字的异或值
ans[Q[now].id] = sum(Q[now].r) ^ sum(Q[now].l - 1) ^ pre[Q[now].r] ^ pre[Q[now].l - 1];
now++;
}
}
for (int i = 1; i <= m; i++)
printf("%d\n", ans[i]);
return 0;
}
【29.82%】【codeforces 703D】Mishka and Interesting sum的更多相关文章
- codeforces 703D D. Mishka and Interesting sum(树状数组)
题目链接: D. Mishka and Interesting sum time limit per test 3.5 seconds memory limit per test 256 megaby ...
- Codeforces 703D Mishka and Interesting sum 离线+树状数组
链接 Codeforces 703D Mishka and Interesting sum 题意 求区间内数字出现次数为偶数的数的异或和 思路 区间内直接异或的话得到的是出现次数为奇数的异或和,要得到 ...
- Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum 离线+线段树
题目链接: http://codeforces.com/contest/703/problem/D D. Mishka and Interesting sum time limit per test ...
- Codeforces 703D Mishka and Interesting sum(树状数组+扫描线)
[题目链接] http://codeforces.com/contest/703/problem/D [题目大意] 给出一个数列以及m个询问,每个询问要求求出[L,R]区间内出现次数为偶数的数的异或和 ...
- 【 BowWow and the Timetable CodeForces - 1204A 】【思维】
题目链接 可以发现 十进制4 对应 二进制100 十进制16 对应 二进制10000 十进制64 对应 二进制1000000 可以发现每多两个零,4的次幂就增加1. 用string读入题目给定的二进制 ...
- 树状数组【CF703D】Mishka and Interesting sum
Description 给你n( 1<=n<=1000000)个数,以及m(1<=m<=1000000)个询问,每个询问包括l和r,问你在这n个数中,区间l~r,出现偶数个数的 ...
- CodeForces 703D Mishka and Interesting sum
异或运算性质,离线操作,区间求异或和. 直接求区间出现偶数次数的异或和并不好算,需要计算反面. 首先,很容易求解区间异或和,记为$P$. 例如下面这个序列,$P = A[1]xorA[2]xorA[3 ...
- codeforces 703D Mishka and Interesting sum 偶数亦或 离线+前缀树状数组
题目传送门 题目大意:给出n个数字,m次区间询问,每一次区间询问都是询问 l 到 r 之间出现次数为偶数的数 的亦或和. 思路:偶数个相同数字亦或得到0,奇数个亦或得到本身,那么如果把一段区间暴力亦或 ...
- Codeforces 703D Mishka and Interesting sum(离线 + 树状数组)
题目链接 Mishka and Interesting sum 题意 给定一个数列和$q$个询问,每次询问区间$[l, r]$中出现次数为偶数的所有数的异或和. 设区间$[l, r]$的异或和为$ ...
随机推荐
- 软件——机器学习与Python,聚类,K——means
K-means是一种聚类算法: 这里运用k-means进行31个城市的分类 城市的数据保存在city.txt文件中,内容如下: BJ,2959.19,730.79,749.41,513.34,467. ...
- P2P平台很赚钱么?
最近几年,搞P2P网贷和财富投资相关的金融周边公司,多了很多,楼下门店和电梯里的贷款小广告,真是多啊. 大家都去搞一件事的时候,很可能是大家都觉得这件事有利可图.但事实是,赚钱的总是少数,看到别人搞的 ...
- 微信浏览器跳转外部浏览器 app下载
这个是摘抄的,具体抄的哪里我忘记了,作为记录 2019年5月14日 现在这个好像也不好用了,微信又提示建议下载qq浏览器什么的,显示一个红色感叹号,让用户产生怀疑,很鄙视tx error_report ...
- 【习题5-4 UVA-10763】Foreign Exchange
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果x>y 则num[(x,y)]--; 否则num[(x,y)]++; 看看每一个二元组的num值是不是都为0就好. [代码 ...
- Eclipse高效开发插件汇总
以下是我整理的自己开发过程中的常用Eclipse插件,按字母排序: (1) AmaterasUML 介绍:Eclipse的UML插件,支持UML活动图,class图,sequen ...
- 14、USB摄像头(V4L2接口)的图片采集
参考网站http://www.cnblogs.com/surpassal/archive/2012/12/19/zed_webcam_lab1.html 一.一些知识 1.V4L和V4L2. V4L是 ...
- Bootstrap相关优质项目必备网址
1:文档全集:这里收集了Bootstrap从V1.0.0版本到现在,整个文档的历史.Bootstrap本身就是一个传奇,而这些文档就是传奇的见证! 官方网址:http://docs.bootcss.c ...
- 特殊类型数据:IP地址字段(IPv4)
人们经常使用varchar(15)来存储ip地址,然而,它们实际上是32位无符号整数,不是字符串. MySQL提供INET_ATON()和INET_NTOA()函数将ip地址在整数和四段表示形式之间进 ...
- stm32的DMA基础,配置流程解析
这是手册上的流程 下面是对应的库函数 下面我们就按流程去看相应的寄存器: 步骤1里的寄存器, 进入下面的函数内部: 可以找到对应的操作: 再看下一个重要的寄存器: 再看下一个寄存器: 还有一种模式是: ...
- 美国汪利宏的蒙特卡洛及卷积模拟程序,可以模拟top-hat光束和高斯光束在生物组织中的传输
链接:https://pan.baidu.com/s/1yaCsQ8TCVPSIZ4TVBZgfnw 密码:otzr