給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,...