結果
| 問題 |
No.1240 Or Sum of Xor Pair
|
| コンテスト | |
| ユーザー |
milanis48663220
|
| 提出日時 | 2020-09-25 23:42:05 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 470 ms / 2,000 ms |
| コード長 | 2,966 bytes |
| コンパイル時間 | 824 ms |
| コンパイル使用メモリ | 87,500 KB |
| 実行使用メモリ | 8,932 KB |
| 最終ジャッジ日時 | 2024-06-28 08:22:46 |
| 合計ジャッジ時間 | 6,542 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 30 |
ソースコード
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
int N;
int X;
int A[200000];
int lx, rx;
int la[200000], ra[200000];
// v[i]: left halfがiのlaたち
vector<int> v[1<<9];
ll v_cnt[1<<9][1<<9];
ll cnt[1<<9][9];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout << setprecision(10) << fixed;
cin >> N >> X;
lx = (X>>9);
rx = (X&((1<<9)-1));
for(int i = 0; i < N; i++) {
cin >> A[i];
la[i] = (A[i]>>9);
ra[i] = (A[i]&((1<<9)-1));
v[la[i]].push_back(ra[i]);
v_cnt[la[i]][ra[i]]++;
for(int j = 0; j < 9; j++){
if(ra[i] & (1<<j)) cnt[la[i]][j]++;
}
}
ll ans = 0;
ll th = 2<<18;
for(int i = 0; i < (1<<9); i++){
ll cnt_i = v[i].size();
ll tmp = 0;
if(cnt_i*cnt_i < th){
for(int k : v[i]){
for(int l : v[i]){
if((k^l) < rx || lx > 0){
tmp += (i|i)*(1<<9);
tmp += (k|l);
}
}
}
}else{
for(int k = 0; k < (1<<9); k++){
for(int l = 0; l < (1<<9); l++){
if((k^l) < rx || lx > 0){
tmp += (ll)(v_cnt[i][k]*v_cnt[i][l])*(i|i)*(1<<9);
tmp += (ll)(v_cnt[i][k]*v_cnt[i][l])*(k|l);
}
}
}
}
ans += tmp;
}
for(int i = 0; i < N; i++){
ans -= A[i];
}
ans /= 2;
for(int i = 0; i < (1<<9); i++){
for(int j = i+1; j < (1<<9); j++){
ll cnt_i = v[i].size();
ll cnt_j = v[j].size();
if((i^j) < lx){
ans += (cnt_i*cnt_j)*(i|j)*(1<<9);
for(int k = 0; k < 9; k++){
ll cnt_ok = cnt_i*cnt[j][k]+cnt_j*cnt[i][k]-cnt[j][k]*cnt[i][k];
ans += (ll)(1<<k)*cnt_ok;
}
}
if((i^j) == lx){
if(cnt_i*cnt_j < th){
for(int k : v[i]){
for(int l : v[j]){
if((k^l) < rx){
ans += (i|j)*(1<<9);
ans += (k|l);
}
}
}
}else{
for(int k = 0; k < (1<<9); k++){
for(int l = 0; l < (1<<9); l++){
if((k^l) < rx){
ans += (ll)(v_cnt[i][k]*v_cnt[j][l])*(i|j)*(1<<9);
ans += (ll)(v_cnt[i][k]*v_cnt[j][l])*(k|l);
}
}
}
}
}
}
}
cout << ans << endl;
}
milanis48663220