链表
单向链表
const int X=1000010;
int head,r[N],ne[N],idx;//idx指的是当前使用的指针
void init()//初始化
{
head=-1;
idx=0;
}
void add_to_head(int x)//插入头节点后
{
e[idx]=x;
ne[idx]=head;
head=e[idx];
idx++;
}
void add(int k,int x)//在k节点后插入
{
e[idx]=x;
ne[idx]=ne[k];
ne[k]=e[idx];
idx++;
}
void remove(int k)//删除k节点之后
{
ne[k]=ne[ne[idx]];
}
双向链表
const int N=100010;
int e[N],l[x],r[x],idx;
void init()//初始化
{
r[0]=0;
l[1]=-1;
idx=2;
}
void add(int k,int x)//在k节点后插入
{
e[idx]=x;
r[idx]=r[k];
l[idx]=k;
l[r[k]]=idx;
r[k]=idx;
idx++;
}
void remove(int k)//删除k节点
{
r[l[k]]=r[k];
l[r[k]]=l[k];
}
栈和队列基本操作
const int N=1000010;
//*************栈************
int stk[N],tt;
//插入
stk[++tt]=x;
//弹出
tt--;
//判断栈是否为空
if(tt>0) not empty;
else empty;
//栈顶
stk[tt];
//***********队列**************
//在队尾插入 在队头弹出
int q[N],hh,tt=-1;
//插入
q[++tt]=x;
//弹出
hh++;
//判断队列是否为空
if(hh<=tt) not empty;
else empty;
单调栈
#include <iostream>
using namespsace std;
const int N=100010;
int main()
{
cin.tie(0);
ios::sync_with_stdio(false);
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
while(tt&&stk[tt]>=x) t--;
if(tt) cout<<stk[tt]<<" ";
else cout<<-1<<" ";
stk[++tt]=x;
}
return 0;
}
滑动窗口(找小于)
#include <iostream>
using namespsace std;
const int N=100010;
int q[N],n;
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%d",q[i]);
}
int hh=0,tt=-1;
for(int i=0;i<n;i++)
{
//判断队头是否已经弹出弹窗
if(hh=<tt&&i-k+1>=q[hh]) hh++;
while(hh<=tt&&a[q[tt]]>=a[i]) t--;
q[++tt]=i;
if(i<k-1) print("%d,a[q[hh]]);
}
return 0;
}