CodeForces - 1332 D. Caminhada na Matriz
Endereço do título:
http://codeforces.com/contest/1332/problem/D
Questões básicas:
Dada a idéia de programação dinâmica acima, construa uma matriz de modo que o verdadeiro & máximo do caminho seja diferente do máximo & do caminho calculado pelo algoritmo acima por k.
Idéias básicas:
Eu imploro para você não criar mais estruturas, eu não as faço, as pessoas são estúpidas;
Vamos primeiro analisar o processo de programação dinâmica acima.A idéia básica desse processo é usar o maior valor de ampere adjacente como o valor de ampere da posição atual, mas esse método é ideal? Obviamente que não, porque o maior valor pode ser menor que o resultado de um valor menor e outros valores quando comparado com outros valores ;
portanto, a ideia de nossa construção é que queremos fazer com que pareça mais O grande valor e a treliça final &, no entanto, o resultado de & é 0, mas se o menor na grade anterior for menor que a treliça final & o resultado for k;
então, como deve ser construído? Se você tem uma ideia de construção, tente construí-la.Não há como ver diretamente meu método de construção:
primeiro definimos dois valores máximos (1 << 18) -1 e (1 << 17), então nós Construa uma matriz da seguinte maneira;
(1<<18)- 1 k 0
(1 << 17) (1<<18)- 1 k
Para impedir que todos vejam claramente, substituímos os números na matriz acima por binários;
11111111111111111 k 0
10000000000000000 11111111111111111 k
Escreva para que possamos quase ver que na posição (2, 2), de acordo com o algoritmo de programação dinâmica fornecido, o valor que devemos pegar é, 10000000000000000
no entanto, o resultado desse valor e k & deve ser zero (veja a faixa de valores de k acima ), Mas, de fato, se considerarmos k em (2, 2), o resultado final deverá ser k.Nós descobrimos que esse k é o verdadeiro & path maximum, portanto a diferença é k.
Código de referência:
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
#define IO std::ios::sync_with_stdio(false)
#define int long long
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define per(i, l, r) for (int i = l; i >= r; i--)
#define mset(s, _) memset(s, _, sizeof(s))
#define pb push_back
#define pii pair <int, int>
#define mp(a, b) make_pair(a, b)
#define INF 0x3f3f3f3f
inline int read() {
int x = 0, neg = 1; char op = getchar();
while (!isdigit(op)) { if (op == '-') neg = -1; op = getchar(); }
while (isdigit(op)) { x = 10 * x + op - '0'; op = getchar(); }
return neg * x;
}
inline void print(int x) {
if (x < 0) { putchar('-'); x = -x; }
if (x >= 10) print(x / 10);
putchar(x % 10 + '0');
}
signed main() {
IO;
int k;
cin >> k;
int t = (1 << 18) - 1;
int z = (1 << 17);
cout << 2 << " " << 3 << "\n";
cout << t << " " << k << " " << 0 << "\n";
cout << z << " " << t << " " << k << "\n";
return 0;
}