三元組 題解

2021-09-27 08:59:39 字數 2039 閱讀 7981

給n

nn個數的陣列a

aa,問有多少個三元組(x,

y,z)

(x,y,z)

(x,y,z

)滿足 a[x

]xor

a[y]

y]xo

ra[z

]a[x] ~ xor ~ a[y] < a[y] ~ xor ~ a[z]

a[x]xo

ra[y

]y]xo

ra[z

]並且1≤x

<

y

n1\leq x < y < z \leq n

1≤x<

yn n

≤50000,1

≤a[i

]≤10

9n \leq 50000 ,1 \leq a[i] \leq 10^9

n≤5000

0,1≤

a[i]

≤109

這種關於異或的題,立馬想到了用tri

etrie

trie

來做,乙個很自然的想法就是列舉中間的y

yy,然後開兩個tri

etrie

trie

,乙個維護1

11到y−1

y-1y−

1的數字,乙個維護y+1

y+1y+

1到n

nn的數字,然後同時在兩個tri

etrie

trie

上d fs

dfsdf

s。然而這樣複雜度會爆掉,我們考慮不直接dfs

dfsdf

s,而是統計下答案。

設c nt

[i][

0/1]

cnt[i][0/1]

cnt[i]

[0/1

]表示兩顆tri

etrie

trie

中,前i−1

i-1i−

1位相同,第i為不同的個數。0

00表示字首和的tri

etrie

trie

中第i

ii位為1

11,字尾和的tri

etrie

trie

中第i

ii位為0

00的個數,1

11反之。

那麼我們只需在列舉y

yy時動態維護cnt

cntcn

t即可,統計答案可以直接用cnt

cntcn

t來求出。

還有未懂的地方看**

/*******************************

author:galaxy yr

lang:c++

created time:2023年09月22日 星期日 14時48分46秒

*******************************/

#include

#include

#include

using

namespace std;

const

int maxn=

5e4+10;

const

int lg=30;

long

long ans;

struct trie

void

insert

(int x)

}void

erase

(int x)

}}a,b;

int cnt[maxn][2

];void

add(

int x)

}void

del(

int x)

}int t,n,a[maxn]

,c;int

main()

}printf

("%lld\n"

,ans);}

return0;

}

等差三元組

題目 和是2組不同的等差三元組,除了等差的性質之外,還有個奇妙的地方在於 5 2 3 2 1 2 7 2 5 2 3 2 n 15。同這對三元組也存在同樣的性質 19 2 15 2 11 2 7 2 5 2 3 2 n 15。這種成對的三元組還有很多。當n 15時,有3對,分別是和,和,和。現給出乙...

完美三元組

問題 定義完美三元組,a,b,d a是d的倍數,b是d的倍數,且a b d 1 輸入 t組測試資料,第一行乙個t 1 t 10000 之後t行每行兩個整數l,r,表示三元組中a 的取值區間 l,r 在此條件下,求滿足的完美三元組的總數 1 l r 100000 輸出 乙個整數。分析 首先,a的值已經...

遞增三元組

遞增三元組 描述給定三個整數陣列a a1,a2,an b b1,b2,bn c c1,c2,cn 請你統計有多少個三元組 i,j,k 滿足 1 i,j,k n ai bj ck 輸入第一行包含乙個整數n。第二行包含n個整數a1,a2,an。第三行包含n個整數b1,b2,bn。第四行包含n個整數c1,...