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,一经查实,立即删除!

相关文章

九齐NY8B072A单片机使用笔记(二)TIMER1/2/3定时器

先上代码 volatile unsigned long g_timer0_delay_conut 0;void main(void) {DISI(); //Disable all unmasked interruptsNy8b072a_Gpio_Init();//Ny8b072a_Timer1_Init();//Ny8b072a_Timer2_Init();Ny8b072a_Timer3_Init();ENI(); // Enable all unmasked interrupts whil…

新的Java缓存标准(javax.cache)

这篇文章探讨了新的Java缓存标准&#xff1a;javax.cache。 它如何适应Java生态系统 该标准由JSR107开发&#xff0c;作者是共同规范负责人。 JSR107包含在JSR342开发的Java EE 7中。 Java EE 7将于2012年底完成。但是与此同时&#xff0c;javax.cache将在Java SE 6和更高版本…

Eclipse搭建scala环境(解决“JDT weaving is currently disabled”问题)

随着Apache Spark&#xff0c;scala也成了必学的语言&#xff0c;下面讲一下Eclipse搭建scala开发环境。 网上有很多的教程&#xff0c;但是给的scala的地址下载的插件无法开发scala&#xff0c;会出现“JDT weaving is currently disabled”的问题,这是由于使用了错误的Scala地…

python如何输出结果_如何在python2.7中打印输出结果?

我正在存储一些数据&#xff0c;如温度&#xff0c;湿度和强度&#xff0c;这是我的Arduino输出和输入为我的python2.7&#xff0c;我正在绘制图表的数据。我也想将Arduino输出存储到文本文件中&#xff0c;但是我无法这样做&#xff1a; 这是我的python代码import serial impo…

python字符串连接的三种方法及其效率、适用场景详解

python字符串连接的方法&#xff0c;一般有以下三种:方法1&#xff1a;直接通过加号()操作符连接website& 39;python& 39;& 39;tab& 39;& 39; com& 39;方法2 python字符串连接的方法&#xff0c;一般有以下三种: 方法1&#xff1a;直接通过加号()操作符…

算法—递归实现 C(m,n)

/* 递归实现 C(m,n) */#include "stdio.h" int m,n,s,a[20];int main() {int c(int k);s0; a[0]0;scanf("%d%d",&m,&n);printf("\nC(%d,%d)%d\n",m,n,c(1));}//组合递归函数C(k) int c(int k) {int i,j;if(k<n){for(ia[k-1]1;i<m…

九齐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…

有益的CountDownLatch和棘手的Java死锁

您是否曾经使用过java.util.concurrent.CountDownLatch &#xff1f; 这是在两个或多个线程之间实现同步的非常方便的类&#xff0c;在该类中&#xff0c;一个或多个线程可以等待&#xff0c;直到在其他线程中执行的一组操作完成为止&#xff08;请参阅javadoc和此文章 &#x…

算法—回溯法桥本分数式

/* 将1-9九个数不重复地赋给不同的9个元素 &#xff0c;实现形如a/bcd/eff/hi 的形式&#xff1a;例&#xff1a;1/265/784/39 1/325/967/84 &#xff08;注意&#xff1a;1/265/784/39 和5/781/264/39 只能算一种解&#xff09;求满足条件的解共有多少个&#xff1f; */ #in…

codeforces 703B

题意&#xff1a;有n座城市&#xff0c;其中k座是省会城市&#xff0c;每个城市有对应的点权&#xff0c;城市1-2-3-...-n-1有一条路相连&#xff0c;省会城市与其他所有的城市相连&#xff0c;且每两个城市间最多有一条路&#xff0c;每条路的边权为路连接的两座城市的点权乘积…

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…

Java RESTful API集成测试

这篇文章将重点介绍为RESTful API&#xff08;带有JSON有效负载&#xff09;编写Java集成测试的基本原理和机制。 目的是对技术进行介绍&#xff0c;并为基本正确性编写一些测试。 这些示例将使用最新版本的GitHub REST API。 对于内部应用程序&#xff0c;这种测试通常将在持…

java警惕自增的陷阱

public class proposal{public static void main(String[] args) {int count0;for(int i0;i<10;i){countcount;}System.out.println(count);}}结果输出&#xff1a;0/*步骤一&#xff1a;JMV吧count值&#xff08;其值是0&#xff09;拷贝到临时变量区&#xff1b;步骤二:co…

[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…

九齐NY8B072A单片机使用笔记(一)TIMER0定时器

先上代码 //8bit count up , max 0xFF void Ny8b072a_Timer0_Init(void) {PCON1 C_TMR0_Dis; // Disable Timer0//1 * (255 - 5) 250usTMR0 5; // Load 0x00 to TMR0 (Initial Timer0 register)//16M 2T Div8 1usT0MD C_PS0_TMR0 | C_PS0_Div8 ; // Prescaler0 is assign…

python菜鸟教程split_Python split()方法

网页地址解析&#xff1a; #codingutf-8 str"http://www.runoob.com/python/att-string-split.html" print("0:%s"%str.split("/")[-1]) print("1:%s"%str.split("/")[-2]) print("2:%s"%str.split("/"…

金山毒霸垃圾清理

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

并发优化–减少锁粒度

在高负载多线程应用程序中&#xff0c;性能非常重要。 开发人员必须意识到并发问题才能获得更好的性能。 当我们需要并发时&#xff0c;我们通常拥有必须由两个或更多线程共享的资源。 在这种情况下&#xff0c;我们有一个竞争条件 &#xff0c;其中只有一个线程&#xff08;在…

Java1.5增加了新特性:可变参数

/*Java 可变参数Java1.5增加了新特性&#xff1a;可变参数&#xff1a;适用于参数个数不确定&#xff0c;类型确定的情况&#xff0c;java把可变参数当做数组处理。注意&#xff1a;可变参数必须位于最后一项。当可变参数个数多余一个时&#xff0c;必将有一个不是最后一项&…