CodeForces1323 D. Present (dois pontos)

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;
}

Publicado 430 artigos originais · ganhou elogios 36 · vê 20000 +

Acho que você gosta

Origin blog.csdn.net/weixin_44178736/article/details/104726793
Recomendado
Clasificación