帝都Day4(2)——数据结构
黄姓dalao is coming!
一、栈:
基本常识略。
例题:铁轨
模拟,O(n),
Usaco2006 Nov
题目略
做法:单调栈(续命栈?)
n//数量 a[]//奶牛 for(int i=1 to n) { for(;a[i]>a[stack[top]]&⊤top--);//把所有比他小的元素删掉 c[i]=i-stack[top]-1;//这个数和栈顶的数距离 ans+=c[i];//加答案 stack[++top]=i; }
JSOI2008 最大数
m 操作数 n 数列长度 a[] while(m--) { if(t==1)//加入操作 { a[++n]=x; for(;a[n]>=stack[top]&⊤top--); stack[++top]=n; } else//询问操作 { s=n-x; printf("%d\n",a[stack[upper_bound(stack+1,stack+top+1,s)=stack]]); } }
二、队列
常识略
插入删除O(1) 空间复杂度O(n)
滑动的窗户
修剪草坪
三、链表
插入、删除O1 查询On
乱发节那道题(NOIP不怎么考链表啊)
n
a[]
bool cmp(int x,int y){return a[x]==a[y]?x>y:a[x]<a[y];}
for(i=1;i<=n;i++)
{
left[i]=i-1;
right[i]=i+1;
b[i]=i;
sort(b+1,b+n+1,cmp);
for(i=1;i<=n;i++)
{
c[i]=left[b[i]];
right[left[b[i]]]=left[b[i]];
left[right[b[i]]]=right[b[i]];
}
四、并炸鸡(并查集)
略,题目:
洛谷P1621 集合
枚举>=p的所有在[A,B]中的倍数,合并。复杂度O(nlog2n*n的反阿克曼)
洛谷P2170 玄学霸——南小鸟(选学霸)
洛谷P1197 JSOI2008 星球大战
先算出来炸完之后剩余的,然后倒过来做。
洛谷P2024 食物链 加权并查集
0 同一物种 1 吃 2 被吃
五、堆
堆为一颗二叉树,满足以下两个性质
五.1、二叉堆
二叉堆是一颗完全二叉树 插入 删除 求最小值
用数组表示 节点n儿子 2n 2n+1
插入节点:放在末尾 向上更新
删除节点:把最后一节点放到要删除的地儿向下更新
还有一道是usaco的
还有一道bzoj2151 种树: