线段树进阶,主席树,莫队,相似kmp,悬线,单调栈,单调队列,ac自动机,后缀数组,后缀自动机
图论:最短路,差分约束,二分图,网络流,连通分量 不学图论了我太难了
三分找,单调增+max+单调减/单调减+min+单调加,中的max/min,复杂度2log3(n)(比二分慢)
double three_devide(double low,double up) { double m1,m2; while(up-low>=eps) { m1=low+(up-low)/3; m2=up-(up-low)/3; if(f(m1)<=f(m2)) low=m1; else up=m2; } return (m1+m2)/2; }
单调队列
#include <iostream> using namespace std; const int N = 10000; // 数组长度的最大值 struct data { int id, value; } q[N]; int a[N], n, k, l, r; int main() { scanf("%d%d", &n, &k); for (int i = 0; i < n; ++i) { scanf("%d", &a[i]); } l = 0, r = -1; // 队首和队尾在数组 q 中的下标 for (int i = 0; i < n; ++i) { while (l <= r && q[l].id <= i - k) l++; // 不断弹出不符合要求的队首元素 while (l <= r && q[r].value <= a[i]) r--; // 不断弹出不符合要求的队尾元素 q[++r] = {i, a[i]}; // 将当前元素入队 printf("%d %d\n", i, q[l].value); // 输出当前滑动窗口内的最大值 } return 0; }
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+5; int a[maxn],out,i,l=0,r=-1; char ch[20]; struct data { int id,value; }q[maxn]; int main() { scanf("%s",ch); while(scanf("%s",ch)) { if(ch[0]=='E')return 0; else if(ch[0]=='O') { if(l>r)printf("%d\n",-1); else { out++; while(l<=r&&q[l].id<out)l++; if(l>r)printf("%d\n",-1); else printf("%d\n",q[l].value); } } else if(ch[0]=='I') { int x; scanf("%d",&x); a[i++]=x; while(l<=r&&q[r].value<x)r--; q[++r]={i-1,x}; printf("%d\n",q[l].value); } } return 0; }
https://oi-wiki.org/
2019ccpc厦门+?
try a try,拿个牌子叭(*╹▽╹*)
...