字符串 Hash

概述

你有一个字符串 ss 你有一个神奇的函数 ff 可以使

  • f(s)Rf(s)\in R
  • s1s2s_1 \neq s_2 时基本上不会出现 f(s1)=f(s2)f(s_1)=f(s_2)

一种常见的 ff 构造方法是

f(s)=i=1nsirationi f(s)=\sum_{i=1}^n s_i\cdot ratio^{n-i}
阅读更多

「Codeforces 1140E」Palindrome-less Arrays

题意

当一个数组 bb 至少有一个长度为奇数的连续回文子串时,称 bb 是坏的,否则称 bb 是好的。

给你长度为 nn 的数组 aa,其中 1−1 可替换为任意从 11kk 的整数。

求好数组的个数,对 998244353 取模。

阅读更多

虚树

简介

对于这样一类题目:给定一棵 nn 点树,有 qq 个询问,每个询问关于树上 kik_i 个点, n,q,k105n,q,\sum k \leq 10^5

朴素做法 O(qn)O(qn)

由于一些题目的特殊,发现求解只需保留树的结构,故可以重构一棵虚树

虚树包含了所有的 kk 个关键点和它们两两之间的 LCA,这样可以保证这虚树的节点个数 <2k< 2k,保证了复杂度

example from Sengxian's Blog

阅读更多

OI模板

flag: 我有一天我会写出两个头文件

  • advanced_data_structure.h
  • algorithm++.h
阅读更多

acejudge 教程

A simple terminal OI/ACM answer checker on Linux/UNIX

acejudge 是一个命令行的 judger

因为没有文档,所以写了一个指南

安装

1
2
git clone [email protected]:laekov/acejudge.git && cd acejudge
make && sudo make install

使用

配置文件

假定配置文件名为 w.cfg

1
2
3
4
一个 printf 式的格式化字符串作为输入文件
一个 printf 式的格式化字符串作为答案文件
第一个数据编号 最后一个数据编号 时间(ms) 内存(MB)
源程序名
阅读更多

快速傅里叶变换 Fast Fourier Transform

前置技能

虚数

i2=1i=1 i^2 = -1\\ i = \sqrt{-1}

复数

任意复数 zz 都可表示为 a+bi(a,bR)a+bi(a,b\in R)

aa 叫做实部,定义 Re(z)=a\mathrm{Re}(z) = a

bb​ 叫做虚部,定义 Im(z)=b\mathrm{Im}(z) = b​

阅读更多

更优雅的线段树

线段树原理非常简单,但如何优雅的实现却是一个问题

线段树简介

线段树就是把一个序列原有 nn 个点扩充为 nlognn\log n 个点,保持一定结构进行加速

每个点有

  • 自己管辖的区域
  • 两个拼起来是自己的子节点( self=lsonrsonself = lson \cup rson
  • 子节点不交( lsonrson=lson \cap rson = \varnothing
  • 可以快速的区间合并
阅读更多

「Codeforces 1111B」Average Superhero Gang Power

题目链接

首先观察求平均数的公式

avg=sumn avg=\frac{sum}{n}

所以我们要么改变 sumsum 要么改变 nn

如果忽略 kk 这个条件,我们有以下解法

我们先删数,数量记为为 qq ,剩余数的和记为 ss'

avg=s+mqnq avg = \frac{s'+m-q}{n-q}

对于一个数,我们要么舍弃,要么保留,显然的我们需要先删小的数(可以用 Exchange Argument 证明

阅读更多