Significado das perguntas:
Para um comprimento n da matriz de um
requisito cálculo (uma (1) + A ( 2)) XOR (uma (1) + A ( 3)) XOR ... (uma (1) + a (N)) XOR (a (2) + a ( 3)) XOR ... (a (2) + a (N)) XOR (a (3) + a ( 4)) ... (a (n-1) + a (N )).
Isso é tudo "e ordenou uma adição de" e XOR.
O intervalo de dados: N <= 4e5,1 <= a (i) <= 1E7
ideias:
O título original (não pode ver): AtCoder3943 duas sequências
Basicamente a mesma idéia.
Veja XOR é fácil pensar em contribuições de bits
mas a adição era problemático, a adição pode produzir um carry, como lidar com um carry disso não é muito bom pensamento.
Suponha que queremos calcular a posição atual da contribuição das x, então, obviamente, maior do que a posição x x bit é 1 não terá um impacto, a considerar apenas os bits binários x 1.
Set 2 = T x , a matriz 2T modulo um valor inferior x bits é obtido.
Para fazer com que um (i) + a (j ) o x-po de bits é 1, que levaria uma das duas condições seguintes:
t <= a (i) + a (j ) <2T, (x-th carry não ocorre esta condição é pouco x é 1, x bit seguinte qualquer)
3T <= a (I) + a (J) <uma 4T, (x bit do resultado ocorreu, o bit condição x e x + 1 bits são 1, na sequência de uma posição arbitrária x)
pode ser enumerado um (i), respectivamente, as duas duas secções separadas duas extremidades satisfazer estas duas condições, a duração do intervalo é o número de 1 x bits do número,
Existem vários pontos de observação:
1. Uma vez que a soma do comprimento do intervalo é calculado pela soma do número da desordem, o objecto do pedido é um par ordenado, o número total é dividido por 2
2. Para cada um (i), necessidade de reduzir o para coincidir com a sua própria situação (método de determinação: em primeiro lugar, no intervalo de I é determinada, e em segundo lugar, a adição de seu próprio e determina se o primeiro bit é 1 x).
Finalmente, se o número for ímpar, se a soma dos contributos posição atual para responder.
ps:
o código dentro a caligrafia meio, de modo que o tamanho do código será muito maior.
Se a quantidade de pequena mudança lower_bound código, o código será muito mais curto.
código:
#include<bits/stdc++.h>
using namespace std;
const int maxm=4e5+5;
int a[maxm];
int b[maxm];
int n;
int ask(int left,int right,int idx){//计算b数组中left<=x<right的x的数量
int st=0,ed=0;
int l=1,r=n;
while(l<=r){//st尽量向左扩展
int mid=(l+r)/2;
if(b[mid]>=left){
st=mid;
r=mid-1;
}else{
l=mid+1;
}
}
l=1,r=n;
while(l<=r){//ed尽量向右扩展
int mid=(l+r)/2;
if(b[mid]<right){
ed=mid;
l=mid+1;
}else{
r=mid-1;
}
}
if(!st||!ed)return 0;//如果不能同时满足x>=left且x<right,则无解
int ans=ed-st+1;
if(st<=idx&&ed>=idx)ans--;//自己不能和自己匹配,如果自己在区间内就减1
return ans;
}
signed main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int ans=0;
for(int i=0;i<25;i++){
int t=(1<<i);
for(int j=1;j<=n;j++){
b[j]=a[j]%(t*2);
}
sort(b+1,b+1+n);
int cnt=0;
for(int j=1;j<=n;j++){
cnt+=ask(t-b[j],t*2-b[j],j);
cnt+=ask(t*3-b[j],t*4-b[j],j);
}
cnt/=2;//因为题目要求的数对是有序对,所以要除以2
if(cnt&1)ans+=(1<<i);
}
printf("%d\n",ans);
return 0;
}