Codeforces Round 886 (Div. 4) E pergunta resposta de dois pontos |. papelão de imagem

Conexão de salto de algoritmo de resposta binária

Mircea tem nnn fotos. oiii -th imagem é um quadrado com um comprimento lateral desi s_iseucentímetros.

Ele montou cada foto em um pedaço quadrado de papelão para que cada foto tivesse uma borda de www centímetros de papelão em todos os lados. No total, ele usouccc centímetros quadrados de papelão. Dado os tamanhos de imagem e o valorccc , você pode encontrar o valor dewww ?

Uma foto do primeiro caso de teste. Aqui c = 50 = 5 2 + 4 2 + 3 2 c = 50 = 5^2 + 4^2 + 3^2c=50=52+42+32 , entãow = 1 w = 1c=1 é a resposta.

Observe que o pedaço de papelão fica atrás de cada imagem, não apenas na borda.

Entrada

A primeira linha contém um único inteiro ttt (1 ≤ t ≤ 1000 1 \leq t \leq 10001t1000 ) — o número de casos de teste.

A primeira linha de cada caso de teste contém dois inteiros positivos nnn (1 ≤ n ≤ 2 ⋅ 1 0 5 1 \leq n \leq 2 \cdot 10^51n21 05 ) eccc (1 ≤ c ≤ 1 0 18 1 \leq c \leq 10^{18}1c1 018 ) — o número de pinturas e a quantidade de centímetros quadrados de papelão usados.

A segunda linha de cada caso de teste contém nnn inteiros separados por espaçosi s_iseu( 1 ≤ si ≤ 1 0 4 1 \leq s_i \leq 10^41seu1 04 ) — os tamanhos das pinturas.

A soma de nnn em todos os casos de teste não excede2 ⋅ 1 0 5 2 \cdot 10^521 05 .

Restrição adicional na entrada:
Tal inteiro www existe para cada caso de teste.

Observe que algumas das entradas para alguns casos de teste não se encaixam no tipo inteiro de 32 bits; portanto, você deve usar pelo menos o tipo inteiro de 64 bits em sua linguagem de programação (como long long para C++).

Saída

Para cada caso de teste, imprima um único inteiro — o valor de www (w ≥ 1 w \geq 1c1 ) que foi usado para usar exatamenteccc centímetros quadrados de papelão.
Exemplo
de entrada

10
3 50 3
2 1
1 100 6 5 500 2 2 2 2 2 2 365 3 4 2 469077255466389 10000 2023 10 635472106413848880 9181 4243 7777 1859 20 17 4397 14 9390 2245 7225 7 176345687772781240 9202 9407 9229 6257 7743 5738 7966 14 865563946464579627 3654 5483 1657 7571 1639 9815 122 9468 3079 2666 5498 4540 7861 5384 19 977162053008871403 9169 9520 9209 9013 9300 9843 9933 9454 9960 9167 9964 9701 9251 9404 9462 9277 9661 9164 9161 18 886531871815571953 2609 10 5098 9591 949 8485 6385 4586 1064 5412 6564 8460 2245 6552 5089 8353 3803 3764
















saída

1
2
4
5
7654321
126040443
79356352
124321725
113385729
110961227

Observação

O primeiro caso de teste é explicado na instrução.

Para o segundo caso de teste, o ww escolhidow era2 22 , assim o único papelão cobre uma área dec = ( 2 ⋅ 2 + 6 ) 2 = 1 0 2 = 100 c = (2 \cdot 2 + 6)^2 = 10^2 = 100c=( 22+6 )2=1 02=100 centímetros quadrados.

Para o terceiro caso de teste, o ww escolhidow era4 44 , que obtém a área cobertac = ( 2 ⋅ 4 + 2 ) 2 × 5 = 1 0 2 × 5 = 100 × 5 = 500 c = (2 \cdot 4 + 2)^2 \times 5 = 10^2 \vezes 5 = 100 \vezes 5 = 500c=( 24+2 )2×5=1 02×5=100×5=500 centímetros quadrados.

responder

1. Significado da pergunta

Mircea tem n fotos. A i-ésima peça é um quadrado com lado medindo si cm. Ele montou cada foto em um pedaço quadrado de papelão para que cada foto tivesse uma borda de papelão de w cm. No total, ele usou c centímetros quadrados de papelão. Dado o tamanho da imagem e o valor de c, você consegue encontrar o valor de w? Deixe esses vários quadrados expandirem o mesmo w quadro externo e, finalmente, deixe a soma das áreas desses quadros ser o valor de c que demos .

2, ideias para resolução de problemas

À primeira vista, não há regra de classificação especial para os dados e não há regra matemática óbvia no tópico. Neste momento, pensamos no algoritmo simples, começando em 1e9 (porque o maior long long é 10 18 , então após a raiz quadrada, é no máximo 1e9 ) , e para trás Comece a pesquisar até encontrar um valor adequado e você pode parar, mas essa complexidade é O(N 2 ) . Como a resposta tem uma relação de ordem óbvia, pensamos em binário search neste momento para simplificar o algoritmo e atingir uma complexidade de tempo O(Nlog 2 N) .

estudar

Resposta dicotômica: As respostas são sequenciais
Explosão de espaço de armazenamento: Uma vez excedido, pop-up

3. Código de solução de problemas

#include <iostream>
#include <cmath>
using namespace std ;
typedef long long LL ;
const int N = 2e5 + 10 ;
int q[N] ;
LL  n , m ;
 
bool vp(LL x )
{
    
    
	LL sum = 0 ;
	x = x * 2 ;
	for(int i = 0 ; i < n ; i ++ )
	{
    
    
		sum += (x+ q[i])* (x+ q[i]) ; 
		if(sum > m) break; 
		//重点:由于这个和非常大,一旦这个值超出之后就要马上的弹出
	}
 
	if(sum <= m)	return true ;
	else return false ;
}
void bsearch(int q[] ,long long l ,long long r )//二分
{
    
    
	
	while(l < r)
	{
    
    	LL mid = ( r + l + 1 ) >> 1 ;
		if(vp(mid))
		{
    
    
			l = mid ;
		}
		else r = mid - 1 ;
 
	}
	cout << l << endl ; 
}
int main ()
{
    
    
	int t ;
	cin >> t ;
	while ( t -- )
	{
    
    
		
		cin >> n >> m ;
		for(int i = 0 ; i < n ; i ++ )
			cin >> q[i] ;
		bsearch( q , 0 , 1e9 );
 
	}
	
 
	return 0 ;
}

Acho que você gosta

Origin blog.csdn.net/wen030803/article/details/131900048
Recomendado
Clasificación