[关闭]
@994495jj 2017-08-01T13:10:56.000000Z 字数 1538 阅读 861

hdu6059

201708


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define fi first
  4. #define se second
  5. #define pb push_back
  6. #define sz(a) (int)a.size()
  7. #define mp make_pair
  8. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  9. #define de(a) cout<<#a<<"="<<a<<endl;
  10. typedef long long ll;
  11. typedef pair<int, int> pii;
  12. typedef vector<int> vi;
  13. //--------
  14. const int N=500005;
  15. int n;
  16. int a[N],f[N][40][2];
  17. struct Trie {
  18. int nex[N*40][2];
  19. int cnt[N*40];
  20. ll add[N*40];
  21. int tot,root;
  22. int newNode() {
  23. memset(nex[tot],-1,sizeof(nex[tot]));
  24. cnt[tot]=add[tot]=0;
  25. return tot++;
  26. }
  27. void init() {
  28. tot=0;
  29. root=newNode();
  30. }
  31. void upd(ll x,int c,int ii) {
  32. int now=root;
  33. for(int i=29;i>=0;--i) {
  34. int v=((x>>i)&1);
  35. if(nex[now][v]==-1) {
  36. nex[now][v]=newNode();
  37. }
  38. now=nex[now][v];
  39. cnt[now]+=c;
  40. add[now]+=1ll*c*f[ii][i][v^1];
  41. }
  42. }
  43. ll qry(ll x,int ii) {
  44. ll res=0;
  45. int now=root;
  46. for(int i=29;i>=0;--i) {
  47. int v=((x>>i)&1);
  48. int ta=add[nex[now][v^1]];
  49. int tb=cnt[nex[now][v^1]];
  50. res=res+ta-1ll*tb*f[ii][i][v];
  51. now=nex[now][v];
  52. }
  53. return res;
  54. }
  55. }tr;
  56. int main() {
  57. int T;scanf("%d",&T);
  58. while(T--) {
  59. ///
  60. scanf("%d",&n);
  61. ///init
  62. tr.init();
  63. memset(f,0,sizeof(f));
  64. ///read
  65. rep(i,1,n+1) {
  66. scanf("%d",a+i);
  67. for(int j=29;j>=0;--j) {
  68. ++f[i][j][(a[i]>>j)&1];
  69. }
  70. }
  71. ///get f
  72. rep(i,1,n+1) {
  73. rep(j,0,30) {
  74. rep(k,0,2) {
  75. f[i][j][k]+=f[i-1][j][k];
  76. }
  77. }
  78. }
  79. ///solve
  80. rep(i,1,n+1) tr.upd(a[i],1,i);
  81. ll ans=0;
  82. rep(i,1,n+1) {
  83. tr.upd(a[i],-1,i);
  84. ans=ans+tr.qry(a[i],i);
  85. }
  86. ///print
  87. printf("%lld\n",ans);
  88. }
  89. return 0;
  90. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注