其他知识点
64位整数乘法
利用 \(a \times b \bmod p=a\times b-\lfloor \frac{a\times b}{p}\rfloor \times p\)
ull calculate(ull a,ull b,ull p){
a%=p; b%=p;
ull c=(long double)a*b/p;
ull x=a*b,y=c*p;
long long ans=(long long)(x%p)-(long long)(y%p);
if(ans<0) ans+=p;
return ans;
}
汉诺塔
\(3\)塔:\(d_n=2d_{n-1}+1\)
\(4\) 塔:\(f_n=\min\limits_{1\le i<n}\{2*f_i+d_{n-i}\}\)
可以推广至 \(n\) 盘 \(m\) 塔。
奇偶数码
奇数码:逆序对个数的奇偶性相同。
偶数码:逆序对数之差与两个局面下空格所在行数之差奇偶性相同。
同样可以扩展至 \(n\times m\) 的网格。
始终对于序列某个位置操作
对顶堆 Acwing128
后缀表达式
无括号,唯一确定。
遇到数就入栈,遇到运算符就取出栈顶两个数进行运算,把结果入栈,直到栈中只剩下一个数。复杂度 \(O(n)\)。
中缀表达式
计算可以先转后缀,然后按照上述方法计算后缀即可。遇到数就输出,遇到左括号就把左括号入栈,如果遇到右括号就不断取出栈顶并输出,直到栈顶为左括号,然后将左括号出栈。如果遇到运算符,只要栈顶符号的优先级不低于新符号,就不断取出栈顶并输出,最后把新符号入栈,优先级:乘除 > 加减 > 左括号。
基本知识点
1GB=1024MB,1MB=1024KB,1KB=1024B 1B=8bit
指针 int *p;
int x;
p=&x;
p++; Ox384e->Ox3853 //偏移量取决于x占几个字节 char 1 int 4 long 8
(*p)++<=>x++
引用 int& ans=dp[i][j][k];
typedef long long ll;
typedef int a[9];
queue<a> s;
memcmp(goal,s,sizeof(s));
memcmp(goal,s+1,sizeof(s+1));
memcmp(goal+1,s+1,/*字节*位数*/);//e.g. int 4 4*n
//0是相同 1不同
char a[20][20]
for(int i=1;i<=1;i++)
fgets(a[i],20,stdin);
//一行不知道有多少
string line;
getline(cin,line);
stringstream ss(line);
ss>>n;
while(ss>>x)
struct Node {
int u,v;
Node() {
u = 1;
v = 2;
}
Node(int u1, int v1) : u(u1), v(v1) {}
};
int main() {
Node n(3,8);
Node n1;
Node *p = new Node(4, 7);
return 0;
}
g++ -o a a.cpp -O2 -Wall
luogu@用法: @用户名
输入输出
- 整数用 %\(d\) 输出,实数用 %\(f\) 输出。比如 %\(.1lf\),就是输出一位小数。
- scanf 用法
scanf("%d%d",&a,&b);
别忘记 & 符号
c \(\to\) char \(~~\) s \(\to\) char[] \(~~\) d \(\to\) int \(~~\) ld \(\to\) long
lld \(\to\) long long \(~~\) f \(\to\) float \(~~\) lf \(\to\) double Lf $\to $ long double
可以限制长度输入输出scanf("%3d",&a);
printf("%5d",a);
scanf("%3s",a);
注意第三个无 & 符号,读入不含空格换行和 TAB。
限制种类scanf("%[abcd],a");
- 整行输入
getline(cin,str);
vector
- 尾部复制:
copy(v1.begin(),v1.end(),back_inserter(v2));
- 初始化
vector<int> primes {2, 3, 5, 7, 11, 13, 17, 19};
vector<int> a(100);
vector<double> values(20, 1.0);
第二种方法就塞了 \(100\) 个 \(0\) 进去。