Codeforces 1324 D-Par de Tópicos (pensamento + || metade do ponteiro duplo)

Par de Tópicos

limite de tempo por test2 segundos
limite de memória por test256 megabytes
inputstandard input
output outputstandard
A próxima palestra em uma escola secundária requer dois temas a serem discutidos. O i-th tema é interessante por ai unidades para o professor e por unidades de BI para os alunos.

O par de temas i e j (i <j) é chamado de bom se ai + aj> bi + bj (ou seja, é mais interessante para o professor).

Sua tarefa é encontrar o número de bons pares de tópicos.

Entrada
A primeira linha da entrada contém um inteiro n (2≤n≤2⋅105) - o número de tópicos.

A segunda linha da entrada contém n inteiros A1, A2, ..., an (1≤ai≤109), onde ai é o interestingness do i-th tópico para o professor.

A terceira linha da entrada contém n inteiros b1, b2, ..., bn (1≤bi≤109), onde bi é o interestingness do i-th tema para os alunos.

Saída
Imprimir um inteiro - o número de bons pares de tópico.

Exemplos
inputCopy

5.
4. 6 2 2 8.
4. 5. 4. 3. 1.
OutputCopy
7.
InputCopy
4.
1 2. 4. 3.
1. 3 2. 4.
OutputCopy
0
questão destina-se:
para dar duas matrizes a b [i] e [i], o número de Q ( i, j) satisfaz i <j e um [i] + a [j ]> b [i] + b [j].
Pensando um: meio
pode ser simplificado equação, torna-se um [i] + a [j ] -b [i] -b [j]> 0, corresponde a uma [i] -b [i] + (b [j] -a [j]) > 0.
Pode ser para abrir uma nova matriz c [i] = uma [i ] -b [i], em seguida, o problema é transformada em: procura de um conjunto de números na matriz c, de tal modo que satisfaz i <j e c [i] + c [j]> 0
este tempo, há duas soluções:
em primeiro lugar, dois lacetes para a enumeração directa, complexidade é n ^ 2, aparente para esta questão, 2E5 2E5 * desejável.

Em segundo lugar, a segunda camada para optimização do ciclo, podemos classificar na ordem da matriz c ascendente, a equação acima pode ser transformado em c [j]> -c [i ], em seguida, que pode dirigir a pesquisa binária da segunda camada quando o primeiro loop maior do que -c [i] tmp número de posição, então a localização deste local e significado das perguntas depois de um certo conformidade, isto é, soma + = n-tmp + 1
; no entanto notar aqui que c [i]> 0, porque a pesquisa é -c [i], assim c [i] também satisfazer os critérios de pesquisa, mas não satisfaz o significado das perguntas, temos que sair desta situação.
Finalmente, nota que cada um tem um par de cálculo reversa duas vezes, os resultados precisam / 2 e em seguida de saída. Essa complexidade é n * LGN.
A final Finalmente, nota que nesta linha de pensamento, vai estourar int, então use longa contagem longa.
código binário é:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+7;
typedef long long ll;
ll n,a[maxn],sum;
int main(){
    cin>>n;
    int x;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++){
        cin>>x;
        a[i]-=x;
    }
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++) cout<<a[i]<<" ";
    puts("");
    for(int i=1;i<=n;i++){
        int tmp=upper_bound(a+1,a+1+n,-a[i])-a;
        sum+=n-tmp+1;
		if (a[i]>0) sum--;
		 //cout<<i<<" "<<tmp<<" "<<sum<<endl;//检测输出
    }
    cout<<sum/2;
    return 0;
}

Duas ideias: o ponteiro duplo
, em geral, podem ser divididos em dois pelo ponteiro de casal pode ser resolvido, substancialmente o mesmo grau de complexidade -
double ponteiro cupom:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+7;
int n,a[maxn],x,l,r;
ll ans;
int main()
{
	scanf("%d",&n);
	r=n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) cin>>x,a[i]-=x;
	sort(a+1,a+n+1);
	for(int l=1;l<=n;l++)
	{
		while(a[l]+a[r]>0)r--;///找最后一个满足条件的位置
		ans+=n-max(l,r);//该位置之后的一定满足条件
	}
	printf("%lld",ans);
	return 0;
}

Feito antes em bovinos fora de um problema semelhante, temporariamente não encontrar o primeiro par de tal, este problema pode ser resolvido novamente e novamente sobre a qwq tempo para escrever uma solução para um problema só para encontrar-se empurrado errado. .
Há também uma solução comum, quando a monotonia não pode ter uma manutenção árvore árvore ou matriz segmento, para ser concluída.

Publicado 48 artigos originais · ganhou elogios 7 · vista 3314

Acho que você gosta

Origin blog.csdn.net/weixin_45675097/article/details/104831297
Recomendado
Clasificación