Solução de problemas
- Ao encontrar algum n com um nível de 8 ou 10, a compressão de estado pode ser considerada .
- Respostas dicotômicas, dp, classificação e fila são testes comuns na liga.
- Ao enumerar as coisas, você pode fazer menos delas (quebrar no lugar certo, às vezes pode encurtar muito tempo, a peneira linear é um bom exemplo)
- Às vezes, alguns problemas que parecem ser problemas matemáticos (problemas que estudam a natureza dos números) podem ser resolvidos com a construção inteligente de mapas e a execução do caminho mais curto.
Também existe uma maneira de usar vários comprimentos para fazer um comprimento que não seja menor que um certo número e perguntar qual é o comprimento mínimo e qual é o caminho mais curto.
- Ao encontrar o LCA comum de vários pontos, você só precisa executar o LCA uma vez e o LCA dos dois pontos com a menor e maior sequência dfs desses pontos.
Aspecto do jogo
- Durante o jogo, você deve se lembrar de escrever arquivos e operar , a lição de sangue ...
- Leia as perguntas antes de escrever o programa, pense bem depois de lê-lo, pense nos detalhes, circunstâncias especiais, etc., é melhor escrever no papel de rascunho, o programa final é muito bom.
- Na minha opinião, é melhor digitar o programa passo a passo , ou seja, dividir todo o programa em várias partes, ajustar esta parte e então continuar a iniciar a próxima parte do programa (por exemplo, para uma questão de modelo de árvore de segmento de linha, primeiro escreva a árvore e certifique-se Depois de corrigir, escrever a modificação e, em seguida, escrever a consulta, etc. ), isso pode efetivamente evitar a situação em que o resultado de mais de cem linhas de digitação não pode ser compilado ou um loop infinito e nenhum erro pode ser encontrado, não importa o quê.
- Se você tiver muito tempo, é melhor bater um contra o outro. Se você não conseguir pensar em uma solução correta, pegue uma série violenta de dados extremos e coloque-os no programa para julgar ~
Aspecto do código
- Experiência pessoal NOIP2017 nos diz
- Os dados devem ser lidos antes de processá-los. Nunca leia metade do intervalo, caso contrário, os dados ficarão desalinhados quando vários conjuntos de dados ...
- Para comparação prescrevendo tal operação, se o quadrado não estourar por muito tempo, de preferência em ambos os lados do quadrado de comparação,
double
se a precisão puder ser um problema. (Se o tamanho dos dados não estiver claro, então o uso dedouble
Qiuwen é possível)
- Quando a resposta precisa ser módulo, preste atenção à subtração após a operação de subtração, primeiro pegue o módulo e depois adicione o módulo e depois vá para o módulo novamente para evitar números negativos.
Se você não estiver familiarizado, é melhor não recuar as linhas aleatoriamente, a precedência do operador é muito marcada ...
aproximadamente a ordem é esta算术运算
->位运算
->逻辑运算
Anexe a tabela de precedência do operadorMais uma vez, preste atenção na prioridade do cálculo . Se não funcionar, é melhor colocar parênteses :-)
Fila de reprodução e inicializar simplesmente
l=r+1
pode (se a fila estiver vazial<=r
). Hábito pessoal, se você julgar que seja (l<r
), então a inicialização tem que serl=r
.Ao simular uma lista de adjacências com um array, se for um grafo não direcionado, preste atenção que as arestas devem ter mais do que o dobro do espaço.
Se você quiser usar definições de macro para simplificar as expressões repetitivas no código, preste atenção em adicionar parênteses à expressão inteira (a expressão inteira é adicionada parênteses para evitar problemas de prioridade no programa. Por exemplo
#define Mid l+r>>1
, se for escrito na árvore de segmento de linha, o conteúdo real no programaMid+1
é se tornal+r>>2了)
, deve ser escrito#define Mid (l+r>>1)
. (computação de bits com prioridade mais baixa do que a aritmética, vai dar errado)Se você quiser abreviar o tipo de variável no programa, é melhor usar typedef. Usar a definição de macro #define pode ter alguns problemas menores. Exemplos específicos:
typedef long long LL;
Ao usar hash, é melhor usar números primos incomuns como módulo (nunca use 1000000009). Por exemplo, se você descobrir que seu número QQ ou número de telefone celular é primo e o comprimento é aceitável, você pode escolhê-los.
Ao fazer o hash, preste atenção ao local apropriado " % ", caso contrário, ele será gg quando um número negativo aparecer . Você também pode considerar o uso de longo sem sinal . Além de ser longo o suficiente, ele irá modular automaticamente um número para você quando for reduzido a um número negativo.
Parece ser 2 ^ 64,Não tenha medo do erro de números negativos.Quando usado em um float, então uma alta precisão (tempo suficiente), é preferível gastar
long double
, é definida diretamentelong double
e, em seguida, quando a intensidade de saída gira em tornodouble
da linha.Preste atenção à entrada e saída de palavras-chave de várias variáveis em cstdio
Tipos de | palavra-chave scanf | palavra-chave printf | Descrição |
---|---|---|---|
int | % d | % d | |
int não assinado | % você | % você | |
longo longo | % lld | % lld % I64d |
Sistema Linux sistema Windows |
longo sem sinal | % hospedeiro | % host % I64u |
Sistema Linux sistema Windows |
float double |
% f % lf |
Todos usam% f | % .nf é manter a saída de n casas decimais |
Caracteres | % c | % c | |
Caracteres[] | % s | % s | Não há necessidade de adicionar "&" antes da matriz de caracteres, por exemplo: scanf("%s",a) onde a é uma matriz de caracteres (string no estilo c) |