算法
忘_怀
这个作者很懒,什么都没留下…
展开
-
数论分块
主要用于处理这个公式: 数论分块在于将相同效果的数找出来,一次性进行加法处理。 理论实现: int n; cin >> n; int ans=0; for (int l = 1, r; l <= n; l = r + 1) { r = n / (n / l); ans += (r - l + 1) * (n / l); printf("%3d %3d %3d\n", n / l, l, r...原创 2021-08-26 01:10:42 · 315 阅读 · 1 评论 -
单调栈+单调队列
目录 单调栈 单调队列 单调栈 int st[N], t = 0; int main() { //入栈 int x; cin >> x; st[++t] = x; //输出栈顶 cout << st[t]; //弹出栈顶 t--; } 题:单调栈 const int N = 3e6 + 5; int r[N]; int st[N] = { 0 }, t = 0; int res[N]; int main() { int n; cin >>原创 2021-09-05 07:17:20 · 98 阅读 · 0 评论 -
upper_bound和lower_bound
对于升序序列: lower_bound返回第一个大于等于val的元素的迭代器 upper_bound返回第一个大于val的元素的迭代器 对于降序序列: 必须指定比较函数: static bool weightComp(int a, int b) { return a > b; } ...原创 2021-09-04 21:42:40 · 118 阅读 · 0 评论 -
双指针
正常写法 for(int i=0,j=0,i<n;i++){ while(j<i&&check(i,j)) j++; } 分两端点的写法: int i=0,j=n-1; while(i<j){ if(check(i,j)) i++; else j--; } 例题:A-Bhttps://www.luogu.com.cn/problem/P1102 sort(r, r + n); int a = 0, b = 0; while ..原创 2021-09-04 21:08:21 · 113 阅读 · 0 评论 -
并查集
int pre[N];//上家 int gd[N];//等级 void init(int n) //初始化 { for (int i = 1; i <= n; i++) { pre[i] = i; //认定自己为老大 gd[i] = 1; } } int find(int x) { if (pre[x] == x)return x; return pre[x]=find(pre[x]);//找到老老大认老老大为老大 } void join(int x, int y) .原创 2021-09-04 19:30:04 · 80 阅读 · 0 评论