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

题目链接:http://codeforces.com/contest/703/problem/D

给你n个数,m次查询,每次查询问你l到r之间出现偶数次的数字xor和是多少。

我们可以先预处理前缀和Xor[i],表示1~i的xor和。因为num^num=0,所以Xor[r] ^ Xor[l - 1]求的是l~r之间出现奇数次的数字xor和。

那怎么求偶数次的呢,那我们可以先求l到r之间不重复出现数字的xor(比如1 1 2 求的是1 ^ 2),然后再xor以上求出的Xor[r] ^ Xor[l - 1],奇奇消掉 就得出答案了。

那求不重复的话,我们用树状数组来处理。先把询问按照r从小到大排序,以便后面的离线处理。map存的是a[i]数字最近出现的位置i,然后用树状数组i位置插入a[i]并且消掉a[i]之前出现的位置i',这样保证查询不重复xor和最优。

具体看代码,应该能看懂。

 1 //#pragma comment(linker, "/STACK:102400000, 102400000")
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <cstdio>
 7 #include <vector>
 8 #include <cmath>
 9 #include <ctime>
10 #include <list>
11 #include <set>
12 #include <map>
13 using namespace std;
14 typedef long long LL;
15 typedef pair <int, int> P;
16 const int N = 1e6 + 5;
17 int bit[N], Xor[N], a[N], ans[N], n;
18 map <int, int> mp; //a[i]最近出现的位置
19 struct Query {
20     int l, r, id;
21     bool operator <(const Query& cmp) const {
22         return r < cmp.r;
23     }
24 }q[N];
25 
26 void update(int i, int val) {
27     for(; i <= n; i += (i&-i))
28         bit[i] ^= val;
29 }
30 
31 int sum(int i) {
32     int s = 0;
33     for(; i >= 1; i -= (i&-i))
34         s ^= bit[i];
35     return s;
36 }
37 
38 int main()
39 {
40     int m;
41     scanf("%d", &n);
42     for(int i = 1; i <= n; ++i) {
43         scanf("%d", a + i);
44         Xor[i] = Xor[i - 1] ^ a[i]; //前缀xor
45     }
46     scanf("%d", &m);
47     for(int i = 1; i <= m; ++i) {
48         scanf("%d %d", &q[i].l, &q[i].r);
49         q[i].id = i;
50     }
51     sort(q + 1, q + m + 1);
52     int j = 1; //询问的结构体下标
53     for(int i = 1; i <= n; ++i) {
54         int &temp = mp[a[i]]; //引用
55         if(temp) { //要是不是第一次出现,那就消掉a[i]之前出现的位置
56             update(temp, a[i]);
57         }
58         temp = i;
59         update(temp, a[i]); //插入最近的位置
60         while(j <= m && i == q[j].r) {
61             int l = q[j].l - 1, r = q[j].r;
62             ans[q[j].id] = sum(r) ^ sum(l) ^ Xor[r] ^ Xor[l];
63             ++j;
64         }
65     }
66     for(int i = 1; i <= m; ++i) {
67         printf("%d\n", ans[i]);
68     }
69     return 0;
70 }
View Code

上面是正确的代码,下面是TLE的。

之前用莫队写的,数据小一点应该可以过。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cmath>
 6 #include <map>
 7 using namespace std;
 8 const int MAXN = 1e6 + 5;
 9 typedef __int64 LL;
10 int a[MAXN] , u, ans[MAXN];
11 struct que {
12     int l , r , id;
13 }q[MAXN];
14 map <int, int> mp;
15 
16 bool cmp(que x , que y) {
17     if(x.l / u == y.l / u) 
18         return x.r < y.r;
19     return x.l / u < y.l / u;
20 }
21 
22 int main()
23 {
24     int n , m;
25     while(~scanf("%d" , &n)) {
26         for(int i = 1 ; i <= n ; i++) {
27             scanf("%d" , a + i);
28         }
29         scanf("%d", &m);
30         for(int i = 1 ; i <= m ; i++) {
31             scanf("%d %d" , &q[i].l , &q[i].r);
32             q[i].id = i;
33         }
34         u = (int)sqrt(n*1.0);
35         sort(q + 1 , q + m + 1 , cmp);
36         int L = 1 , R = 0 , num;
37         int temp = 0;
38         for(int i = 1 ; i <= m ; i++) {
39             while(R > q[i].r) {
40                 num = --mp[a[R]];
41                 if(num) {
42                     temp ^= a[R];
43                 }
44                 R--;
45             }
46             while(R < q[i].r) {
47                 R++;
48                 num = ++mp[a[R]];
49                 if(num > 1) {
50                     temp ^= a[R];
51                 }
52             }
53             while(L < q[i].l) {
54                 num = --mp[a[L]];
55                 if(num) {
56                     temp ^= a[L];
57                 }
58                 L++;
59             }
60             while(L > q[i].l) {  //前面的还没算
61                 L--;
62                 num = ++mp[a[L]];
63                 if(num > 1) {
64                     temp ^= a[L];
65                 }
66             }
67             ans[q[i].id] = temp;
68         }
69         for(int i = 1 ; i <= m ; i++) {
70             printf("%d\n", ans[i]);
71         }
72     }
73     return 0;
74 }
View Code

 

转载于:https://www.cnblogs.com/Recoder/p/5741394.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

九齐51单片机使用注意事项:不要用float

在使用ADC计算电压值时用了float&#xff0c;NY8B072A堆栈直接炸了&#xff0c;用32机习惯了&#xff0c;一直想不通&#xff0c;查了手册才知道。 手册是&#xff1a;《NYC_NY8_UM_v1.5_SC.pdf》 链接&#xff1a;https://www.nyquest.com.tw/cn/support/download/Nyquest_SW…

go 基准测试 找不到函数_基于Golang做测试

本文在实习期间完成并完善&#xff0c;无任何公司机密&#xff0c;仅做语言交流学习之用。持续更新。1.Golang的单元测试Go语言提供了丰富的单测功能。在Go中&#xff0c;我们通常认为函数是最小的可执行单元。本例中使用两个简单的函数&#xff1a;IsOdd和IsPalindrome来进行G…

九齐NY8B072A单片机使用笔记(三)模拟串口RX

因为这款单片机没有硬件串口&#xff0c;所以需要我们自己做软件模拟串口。 用PA3作为RX&#xff0c;因为PA3可以作为外部输入中断EXTI1。 本人首先用轮询的方式查PA3是否从高电平跳变到低电平&#xff08;起始信号&#xff09;&#xff0c;但是因为还有别的业务逻辑&#xf…

[LindCode] Binary Tree Postorder Traversal

Binary Tree Postorder Traversal Given a binary tree, return the postorder traversal of its nodes values. Example Given binary tree {1,#,2,3}, 1\2/3return [3,2,1]. Challenge Can you do it without recursion? SOLUTION 1: recursion&#xff1a; 分治法解决之&am…

金山毒霸垃圾清理

金山毒霸-垃圾清理-单文件封装,清洁洁癖的爱好&#xff01; 实话&#xff0c;金山的软件确实不错。展望金山可以在软件行业&#xff0c;做出让世界都使用的。为国人扛起一片天 下载地址&#xff1a; http://pan.baidu.com/s/1dFa7GdV转载于:https://www.cnblogs.com/xiaochina/…

python-break循环中断

Python break语句&#xff0c;就像在C语言中&#xff0c;打破了最小封闭for或while循环。 break语句用来终止循环语句&#xff0c;即循环条件没有False条件或者序列还没被完全递归完&#xff0c;也会停止执行循环语句。 break语句用在while和for循环中。 如果您使用嵌套循环&am…

asp.net+mvc+easyui+sqlite 简单用户系统学习之旅(二)—— easyui的简单实用

下面开始在UserManager.Web中利用easyUI构建web。 1. 先删除自带的controllers、models和views&#xff08;里面的shared和web.config可以保存&#xff09;下面的文件 2. 要利用easyUI&#xff0c;首先去网上下载jquery-easyui-1.3.2.zip&#xff0c;同时下载一份EasyUI-1.3.2.…

adc如何获取周期_LOL:千珏拥有ADC最需要的位移和无敌能力,为什么没人用她打下路?...

— 点击蓝字 关注我们 —英雄联盟自国服上线以来&#xff0c;已经陪伴玩家走过了9个年头&#xff0c;目前英雄联盟中的英雄数量已经达到了151位&#xff0c;每一位都各具特色。千珏是一位深受玩家们喜爱的英雄&#xff0c;其在官方英雄的定位中&#xff0c;属于打野英雄&#x…

android surfaceview 大小_Android 使用Camera2 API采集视频数据

Android 视频数据采集系列的最后一篇出炉了&#xff0c;和前两篇文章想比&#xff0c;这篇文章从系统API层面进行一些探索&#xff0c;涉及到的细节更多。初次接触 Camera2 API 会觉得它的使用有些繁琐&#xff0c;涉及到的类有些多&#xff0c;不过就像第一次使用Activity, Fr…

使用Java VisualVM分析您的应用程序

当您需要发现应用程序的哪个部分消耗更多的CPU或内存时&#xff0c;必须使用探查器执行此操作。 默认情况下&#xff0c;Sun JDK中附带的一个探查器是Java VisualVM。 这个事件探查器非常简单易用&#xff0c;功能强大。 在这篇文章中&#xff0c;我们将看到如何安装它并使用它…

ArcSDE for SQL Server安装及在ArcMap中创建ArcSDE连接

ArcSDE for SQL Server安装及在ArcMap中创建ArcSDE连接 原文:ArcSDE for SQL Server安装及在ArcMap中创建ArcSDE连接安装ArcSDE for SQL Server&#xff0c;最后一步成功后的界面如下&#xff1a;在ArcMap中创建ArcSDE连接&#xff0c;截图如下&#xff1a;posted on 2016-08-0…

python调用c函数传字符串参数_Python使用ctypes模块调用DLL函数之传递数值、指针与字符串参数...

在Python语言中&#xff0c;可以使用ctypes模块调用其它如C语言编写的动态链接库DLL文件中的函数&#xff0c;在提高软件运行效率的同时&#xff0c;也可以充分利用目前市面上各种第三方的DLL库函数&#xff0c;以扩充Python软件的功能及应用领域&#xff0c;减少重复编写代码、…

沁恒CH554 KEIL环境搭建

首先下载WCHISPTool_Setup.exe http://www.wch.cn/products/CH554.html 123这三个可下载的都下吧&#xff0c;后面开发都要用的 安装好后运行&#xff0c;菜单栏上&#xff0c;功能->添加WCH MCU到KEIL器件库 这时候在KEIL安装目录里面的UV4文件夹下可以看到wch.cdb的文件…

【CV论文阅读】Rank Pooling for Action Recognition

这是期刊论文的版本&#xff0c;不是会议论文的版本。看了论文之后&#xff0c;只能说&#xff0c;太TM聪明了。膜拜~~ 视频的表示方法有很多&#xff0c;一般是把它看作帧的序列。论文提出一种新的方法去表示视频&#xff0c;用ranking function的参数编码视频的帧序列。它使用…

VS2019 WPF制作OTA上位机(一)新建工程

首先创建新项目&#xff0c;文件 -> 新建 -> 项目 下拉菜单选择C#和Window&#xff0c;选择WPF应用程序&#xff0c;下一步 输入项目名&#xff0c;下一步 这里选择.NET 5.0&#xff0c;也可以选择其他的&#xff0c;个人习惯.NET&#xff0c;点击创建 这时候出现初始…

户籍恢复需要体检吗_脑梗死后脚麻能恢复吗?需要多久能恢复呢?

脑梗死之后脚部麻木&#xff0c;这个有一部分是能够恢复的&#xff0c;但是相对而言&#xff0c;恢复的时间比较长&#xff0c;在临床当中出现脚麻主要是因为梗死破坏了患者的感觉神经中枢从而造成。脚部感觉麻木&#xff0c;瘙痒或者是有蚂蚁在上面爬的感觉。而且有的更加严重…

Alpha版本测试报告

一、测试计划 Alpha版本即将发布&#xff0c;我们组织队员进行这一版本的测试。 测试主要针对两方面&#xff1a;浏览器兼容性和功能完善性。 测试分兼容性测试与功能完善性两部分&#xff0c;兼容性测试分Windows操作系统、Linux系操作系统、Mac OS X操作系统以及手机端Androi…

VS2019 WPF制作OTA上位机(二)获取bin文件路径

OTA升级是通过无线通信远程把bin文件内容传输到单片机&#xff0c;完成升级。 因此上位机需要获取bin文件的路径&#xff0c;读取bin文件内容&#xff0c;将内容分割依次发送&#xff08;因为单片机的接收缓存不会开得和bin文件一样大&#xff08;十几K甚至几十K&#xff09;&a…

linux更改用户名_破旧安卓手机第二春,在安卓手机上使用Linux_deploy运行Linux

由于服务器位于国外&#xff0c;害怕被墙掉导致数据丢失&#xff0c;所以在本地写了脚本每小时从服务器上导出并下载到本地。但是电脑不可能二十四小时开机&#xff0c;所以很想买一个树莓派4玩玩。但是太贵辽&#xff0c;还好搜索到了Android运行Linux的方法&#xff0c;下面记…

MCUXpress IDE常用设置

NXP的开发工具Xpress是基于eclipse制作的&#xff0c;我们如果需要设置一些东西可以直接搜索eclipse是怎么设置的。 1、字体大小 搜索eclipse字体大小&#xff0c;菜单Window > Preference 而Xpress是汉化了的&#xff0c;英语不好的同学可能懵逼&#xff0c;其实就是菜单栏…