結果
| 問題 |
No.1240 Or Sum of Xor Pair
|
| コンテスト | |
| ユーザー |
carrot46
|
| 提出日時 | 2020-09-26 11:39:42 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 77 ms / 2,000 ms |
| コード長 | 2,360 bytes |
| コンパイル時間 | 1,863 ms |
| コンパイル使用メモリ | 179,740 KB |
| 実行使用メモリ | 21,120 KB |
| 最終ジャッジ日時 | 2024-06-28 22:02:41 |
| 合計ジャッジ時間 | 4,929 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 30 |
ソースコード
#include <bits/stdc++.h>
//#include <chrono>
//#pragma GCC optimize("Ofast")
using namespace std;
#define reps(i,s,n) for(int i = s; i < n; i++)
#define rep(i,n) reps(i,0,n)
#define Rreps(i,n,e) for(int i = n - 1; i >= e; --i)
#define Rrep(i,n) Rreps(i,n,0)
#define ALL(a) a.begin(), a.end()
#define fi first
#define se second
using ll = long long;
using vec = vector<ll>;
using mat = vector<vec>;
ll N,M,H,W,Q,K,A,B;
string S;
typedef pair<ll, ll> P;
const ll INF = (1LL<<58);
ll res(0);
using Pint = pair<int, int>;
const int MAX_N = 200005;
vec a(MAX_N, 0), sum(MAX_N + 1, 0);
vector<vector<int> > bit_sum(18, vector<int>(MAX_N + 1, 0));
void calc1(int l, int r){
res += (sum[r] - sum[l]) * (r - l - 1);
rep(i, 18) {
ll num = bit_sum[i][r] - bit_sum[i][l];
res -= (1LL<<i) * (num * (num - 1) / 2);
}
}
void calc2(Pint p, Pint q){
res += (sum[p.se] - sum[p.fi]) * (q.se - q.fi) + (sum[q.se] - sum[q.fi]) * (p.se - p.fi);
rep(i, 18){
res -= (1LL<<i) * (bit_sum[i][p.se] - bit_sum[i][p.fi]) * (bit_sum[i][q.se] - bit_sum[i][q.fi]);
}
}
void dfs(int bit, Pint p, Pint q){
if(p.fi == p.se || bit == -1) return;
int p_cen = lower_bound(a.begin() + p.fi, a.begin() + p.se, (a[p.fi] & ~((1<<(bit+1)) - 1)) + (1<<bit)) - a.begin();
if(K < (1<<bit)){
dfs(bit - 1, {p.fi, p_cen}, q);
dfs(bit - 1, {p_cen, p.se}, q);
}else if(K < (1<<(bit+1))){
calc1(p.fi, p_cen);
calc1(p_cen, p.se);
dfs(bit - 1, {p.fi, p_cen}, {p_cen, p.se});
}else{
if(q.se == q.fi) return;
int q_cen = lower_bound(a.begin() + q.fi, a.begin() + q.se, (a[q.fi] & ~((1<<(bit+1)) - 1)) + (1<<bit)) - a.begin();
if((K>>bit)&1){
calc2({p.fi, p_cen}, {q.fi, q_cen});
calc2({p_cen, p.se}, {q_cen, q.se});
dfs(bit - 1, {p.fi, p_cen}, {q_cen, q.se});
dfs(bit - 1, {p_cen, p.se}, {q.fi, q_cen});
}else{
dfs(bit - 1, {p.fi, p_cen}, {q.fi, q_cen});
dfs(bit - 1, {p_cen, p.se}, {q_cen, q.se});
}
}
}
int main() {
cin>>N>>K;
rep(i, N) scanf("%d", &a[i]);
a.resize(N);
sort(ALL(a));
rep(i, N) sum[i+1] = sum[i] + a[i];
rep(i, 18) rep(j, N) bit_sum[i][j+1] = bit_sum[i][j] + ((a[j]>>i)&1);
dfs(18, make_pair(0, N), make_pair(N, N));
cout<<res<<endl;
}
carrot46