トピックリンク
回答
題名
i <j i <jを満たす配列を見つけます私<j 且 ( a i (a_i (A私&aj)a_j)aJ) ≤(ai⨁aj)\ leq(a_i \ bigoplus a_j)≤(A私⨁aJ)のpair
数。
アイデア
当 a i a_i a私そしてaja_jaJ最高ビット位置の同じバイナリ表現と1
時間は、上記の条件を満たす。
1
その後1
、最高の位相が得られます。- 最上位ビットの
1
XORは、XORの後に取得0
されます(XORは、キャリーなしの加算と見なすことができます)。
量を見つけるために、観察後に算術シーケンスを取得できます。
ACコード
#include <bits/stdc++.h>
using namespace std;
//#pragma GCC optimize(2)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define ull unsigned long long
#define ll long long
#define rep(i, x, y) for(int i=x;i<=y;i++)
#define mms(x, n) memset(x, n, sizeof(x))
#define mmc(A, tree) memcpy(A, tree, sizeof(tree))
#define eps (1e-8)
#define PI (acos(-1.0))
#define INF (0x3f3f3f3f)
#define mod (ll)(1e9+7)
typedef pair<int, int> P;
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
map<ll, int> mp;
rep(i, 1, n) {
ll t;
cin >> t;
int cnt = 0;
for (int i = 1; i <= 30; i++) {
if (t >> 1) cnt = i;
t >>= 1;
if (t == 0) break;
}
mp[cnt] += 1;
}
ll ans = 0;
for (auto it : mp) {
ll tmp = it.second;
if (tmp >= 2) {
if (tmp & 1) ans += (tmp - 1) / 2 * tmp;
else ans += (tmp) / 2 * (tmp - 1);
}
}
cout << ans << endl;
}
return 0;
}
後のコード
上司のコードを読んだ後、気づきました!
#include <bits/stdc++.h>
using namespace std;
//#pragma GCC optimize(2)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define ull unsigned long long
#define ll long long
#define rep(i, x, y) for(int i=x;i<=y;i++)
#define mms(x, n) memset(x, n, sizeof(x))
#define mmc(A, tree) memcpy(A, tree, sizeof(tree))
#define eps (1e-8)
#define PI (acos(-1.0))
#define INF (0x3f3f3f3f)
#define mod (ll)(1e9+7)
typedef pair<int, int> P;
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int n, x;
int t[40];
ll ans = 0;
for (cin >> n; cin >> n; cout << ans << ' ') {
ans = 0;
rep(i, 0, 30) t[i] = 0;
rep(i, 1, n) {
cin >> x;
for (int i = 30; i >= 0; i--) if (x & (1 << i)) {
t[i] += 1; break;}
}
rep(i, 0, 30) if (t[i] >= 2) ans += 1LL * (t[i] - 1) * t[i] / 2LL;
}
return 0;
}