2020牛客寒假演算法基礎集訓營4 D 子段異或題解

2021-10-03 00:06:40 字數 1227 閱讀 8752

兩個核心公式 :

1【l,r】=【1,r】^【1,l-1】

2 a^a=0(充要)

題意要求求出異或值為0的子段數,我們可以通過記錄每個值的字首異或值來推出某個區間的異或值,如:【2,3】的異或值可以通過【1,3】^【1,1】來推出

,並且當且僅當【1,3】^【1,1】==0時,【2,3】==0。

可何時【1,3】^【1,1】才能等於0呢?

結合公式2,我們可以得知,當【1,3】= =【1,1】時,【2,3】==0。

因此我們可以將字首異或值排序,方便我們尋找相同異或值的字首區間。

再對異或值相同的區間個數n求組合c(2,n)即可(也就是n個里取兩個的所有取法)

**如下

#include

#include

#include

#define ll long long

using

namespace std;

int n;

ll m[

200001];

ll ans =0;

intmain()

sort

(m +

1, m +

1+ n)

;for

(ll i =

1,j=i;i <= n; i=j+1)

cout << ans

}

但這串**是無法ac的,因為我們忘了考慮【l,r】中l=1的情況,此時我們要想要原來一樣求出【l,r】,必須求得【1,0】,但這個區間顯然是不存在的。

因此,我們在維護字首異或值時直接判斷其是否符合題意即可。

ac**如下

#include

#include

#include

#define ll long long

using

namespace std;

int n;

ll m[

200001];

ll ans =0;

intmain()

sort

(m +

1, m +

1+ n)

;for

(ll i =

1,j=i;i <= n; i=j+1)

//i和j一定得開long long否則會溢位

cout << ans

}

2020牛客寒假演算法基礎集訓營

長期更新,補完為止 2 g 判正誤 題意 t組資料。判斷a d b e c f是否等於g。1e9 a,b,c,g 1e9,0 d,e,f 1e9。保證不會出現指數和底數同為 0 的情況。思路 硬算會tle或mle。快速冪取模,為了增加過題概率,多取幾個模數判斷。includeusing namesp...

2020牛客寒假演算法基礎集訓營1

找規律,推公式 三角形個數為2 m n m n m 1 n 1 2 m n mn m 1 n 1 2 m n mn m 1 n 1 include include include include using namespace std typedef long long ll const int m...

2020牛客寒假演算法基礎集訓營1

h題 突然發現h題可以用好多種方法做的。方法一 雙指標,維護乙個修改次數小於等於k的區間 include using namespace std typedef long long ll const int mod 1e9 7 const int n 1e5 5 const int inf 0x3f...