栈和队列
单调栈、单调队列
//P1886
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#define For(i,l,r) for(int i=l;i<=r;++i)
using namespace std;
struct que{
int key,pos;
}qmax[1000001];
que qmin[1000001];
int n,k,qmah=0,qmat=-1,qmih=0,qmit=-1,amax[1000001];
int main()
{
int temp;
scanf("%d %d",&n,&k);
For(i,1,n)
{
scanf("%d",&temp);
while(temp<=qmin[qmit].key&&qmit>=qmih)
--qmit;
qmin[++qmit].key=temp;
qmin[qmit].pos=i;
while((qmin[qmit].key<=qmin[qmih].key&&qmih<qmit)||(i-qmin[qmih].pos>=k))
++qmih;
if(i>=k)
printf("%d ",qmin[qmih]);
while(temp>=qmax[qmat].key&&qmat>=qmah)
--qmat;
qmax[++qmat].key=temp;
qmax[qmat].pos=i;
while((qmax[qmat].key>=qmax[qmah].key&&qmah<qmat)||(i-qmax[qmah].pos>=k))
++qmah;
amax[i]=qmax[qmah].key;
}
printf("\n");
For(i,k,n)
printf("%d ",amax[i]);
return 0;
}
并查集
加权并查集
按秩合并
堆
线段树
线段树的高级操作
平衡树--Treap
本质:
rdm
旋点
启发式合并
树状数组
树上倍增
字典树
可持久化线段树(主席树)