题目大意
题目总结:
给定一个长度为 n 的数组 a。
对任意区间 [l, r],定义其权值为:
w=i=l∑rj=l∑r(ai⊕aj)
其中 ⊕ 表示按位异或。
要求你计算数组中所有非空子区间的权值之和,并对 10^9+7 取模后输出。
输入范围为:
-
1 ≤ n ≤ 2×10^5
-
0 ≤ a_i ≤ 10^6
输出一个整数,表示最终答案。
样例:
1 2 3 4 5 6
| 输入: 6 1 1 4 5 1 4
输出: 422
|
样例含义:对数组 [1,1,4,5,1,4] 的所有非空子区间分别计算上述双重异或和权值,再把这些权值全部累加,最终结果为 422。
思路讲解
注意,题目中的是非有序对双重求和,所以结果不要忘记乘以一个 2。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| vector<vector<ll>> suf_bits(N+2,vector<ll>(26)); vector<vector<ll>> suf_nobits(N+2,vector<ll>(26)); for (ll i=N;i>=1;--i) { for (int j=0;j<25;++j) { suf_bits[i][j]=suf_bits[i+1][j]+(A[i]>>j&1)*(N-i+1); suf_nobits[i][j]=suf_nobits[i+1][j]+((A[i]>>j&1)^1)*(N-i+1); } } ll ans=0; for (int i=1;i<=N;++i) { for (int j=0;j<25;++j) { if (A[i]>>j&1) { ll suf=suf_nobits[i+1][j]; ll lans=suf%mod*i%mod; lans*=(1ll<<j); lans%=mod; ans+=lans*2; ans%=mod; }else { ll suf=suf_bits[i+1][j]; ll lans=suf%mod*i%mod; lans*=(1ll<<j); lans%=mod; ans+=lans*2; ans%=mod; } } }
|
AC代码
AC
http://10.199.227.101/contest/1005/problem/L3-1/submission-detail/2157
源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
#include <bits/stdc++.h> #define all(vec) vec.begin(),vec.end() #define lson(o) (o<<1) #define rson(o) (o<<1|1) #define SZ(a) ((long long) a.size()) #define debug(var) cerr << #var <<" = ["<<var<<"]"<<"\n"; #define debug1d(a) \ cerr << #a << " = ["; \ for (int i = 0; i < (int)(a).size(); i++) \ cerr << (i ? ", " : "") << a[i]; \ cerr << "]\n"; #define debug2d(a) \ cerr << #a << " = [\n"; \ for (int i = 0; i < (int)(a).size(); i++) \ { \ cerr << " ["; \ for (int j = 0; j < (int)(a[i]).size(); j++) \ cerr << (j ? ", " : "") << a[i][j]; \ cerr << "]\n"; \ } \ cerr << "]\n"; #define debug3d(a) \ cerr << #a << " = [\n"; \ for (int i = 0; i < (int)(a).size(); i++) \ { \ cerr << " [\n"; \ for (int j = 0; j < (int)(a[i]).size(); j++) \ { \ cerr << " ["; \ for (int k = 0; k < (int)(a[i][j]).size(); k++) \ cerr << (k ? ", " : "") << a[i][j][k]; \ cerr << "]\n"; \ } \ cerr << " ]\n"; \ } \ cerr << "]\n"; #define cend cerr<<"\n-----------\n" #define fsp(x) fixed<<setprecision(x)
using namespace std;
using ll = long long; using ull = unsigned long long; using DB = double;
using CD = complex<double>;
static constexpr ll MAXN = (ll) 1e6 + 10, INF = (1ll << 61) - 1; static constexpr ll mod = (ll)1e9+7; static constexpr double eps = 1e-8; const double pi = acos(-1.0);
ll lT, testcase;
void Solve() { ll N; cin >> N; vector<ll> A(N+2); for (int i=1;i<=N;++i) { cin>>A[i]; } vector<vector<ll>> suf_bits(N+2,vector<ll>(26)); vector<vector<ll>> suf_nobits(N+2,vector<ll>(26)); for (ll i=N;i>=1;--i) { for (int j=0;j<25;++j) { suf_bits[i][j]=suf_bits[i+1][j]+(A[i]>>j&1)*(N-i+1); suf_nobits[i][j]=suf_nobits[i+1][j]+((A[i]>>j&1)^1)*(N-i+1); } } ll ans=0; for (int i=1;i<=N;++i) { for (int j=0;j<25;++j) { if (A[i]>>j&1) { ll suf=suf_nobits[i+1][j]; ll lans=suf%mod*i%mod; lans*=(1ll<<j); lans%=mod; ans+=lans*2; ans%=mod; }else { ll suf=suf_bits[i+1][j]; ll lans=suf%mod*i%mod; lans*=(1ll<<j); lans%=mod; ans+=lans*2; ans%=mod; } } } ans%=mod; cout<<ans<<"\n"; }
signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); #ifdef LOCAL cout.setf(ios::unitbuf); #endif
Solve(); return 0; }
|
心路历程(WA,TLE,MLE……)