結果
| 問題 |
No.1240 Or Sum of Xor Pair
|
| コンテスト | |
| ユーザー |
carrot46
|
| 提出日時 | 2020-09-26 11:46:19 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 69 ms / 2,000 ms |
| コード長 | 2,269 bytes |
| コンパイル時間 | 1,584 ms |
| コンパイル使用メモリ | 179,616 KB |
| 実行使用メモリ | 21,120 KB |
| 最終ジャッジ日時 | 2024-06-28 22:08:42 |
| 合計ジャッジ時間 | 3,920 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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(Pint p){
res += (sum[p.se] - sum[p.fi]) * (p.se - p.fi - 1);
rep(i, 18) {
ll num = bit_sum[i][p.se] - bit_sum[i][p.fi];
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();
Pint p0(p.fi, p_cen), p1(p_cen, p.se);
if(K < (1<<bit)){
dfs(bit - 1, p0, q);
dfs(bit - 1, p1, q);
}else if(K < (1<<(bit+1))){
calc1(p0);
calc1(p1);
dfs(bit - 1, p0, p1);
}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();
Pint q0(q.fi, q_cen), q1(q_cen, q.se);
if((K>>bit)&1){
calc2(p0, q0);
calc2(p1, q1);
dfs(bit - 1, p0, q1);
dfs(bit - 1, p1, q0);
}else{
dfs(bit - 1, p0, q0);
dfs(bit - 1, p1, q1);
}
}
}
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);
Pint p(0, N), q(N, N);
dfs(18, p, q);
cout<<res<<endl;
}
carrot46