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.pswp.cn/news/374221.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374221.shtml
英文地址,請注明出處:http://en.pswp.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;必將有一個不是最后一項&…