标签:速度 size 清空 gre 结合 数组实现 names name blank
l[1]=r[1]=0;r[0]=1;
结点1的左边和右边都是1,结点0的右边是1,为什么结点0会存在?因为后续元素有可能插入到结点1的前面
x原本的左边为l[x]
调整后的顺序为l[x],i,x
想象l[x]和x有两根线牵着,现在要增加两根线,想清楚,要怎样修改,才能确保三者的练习
l[x]是依托x的存在而存在,不如先对与l[x]相关的数据进行修改
r[l[x]]=i;l[i]=l[x];
l[x]=i;r[i]=x;
l[r[x]]=i;r[i]=r[x];
r[x]=i;l[i]=x;
x左边元素为l[x]
x右边元素为r[x]
先解决左右两边元素的的问题
r[l[x]]=r[x];l[r[x]]=l[x];
x=r[x]
x=l[x]
cur=0
do{
cur=r[cur];
}while(cur!=0)
vector<数据类型> 数组名;
数组名.push_back(数据);
v[i];
v.size();
v.clear()
相对于二维数组不用浪费多余的内存空间
stack<数据类型> 变量名
栈名.push(x)
栈名.pop()
栈名.size()
栈名.empty()
括号类型:()[]{}
解决思路:左括号进栈,右括号判断
特判:右括号进栈,栈长为0
判断:退群情况:每种右括号都遇到与自己不同类型的两种相应左括号
? 入群情况:除退群情况外
细节:
queue<数据类型>队列名
队列名.push(数据)
队列名.pop()
队列名.front()
队列名.size()
队列名.empty()
deque<数据类型> 队列名
队列名.push_front/back(数据);
队列名.pop_front/back()
!deque1.empty()
注:为空,返回值为0,取反为1,if才执行deque1.empty()==0
or deque1.empty()!=1
deque1.empty()==false
or deque1,empty()!=true
方法一:一个一个区间段的进行查找,共需(n-m+1)*m次操作,坏处:空间复杂度高
方法二:双指针法
头指针指向头,尾指针指向尾,先根据第一个区间段确立最大值,坏处:最大值可能有多个(需要多设一个变量来统计最大值个数,比较复杂)
方法三:单调队列, 先根据第一个区间创建一个单调队列,添加元素时比较头尾,长度到达m时开始去头操作
方法四:单调队列,单调队列存位置
·x-dq.front()+1
#include<iostream>
#include<deque>
using namespace std;
int main()
{
deque<int> deque1;
int n,m;
cin>>n>>m;
int a[n+1];
for(int i=0;i<n;i++)
{
cin>>a[i];
while(!deque1.empty()&&a[deque1.back()]<=a[i])
deque1.pop_back();
deque1.push_back(i);
while(deque1.empty()!=1&&i-deque1.front()+1>m)
deque1.pop_front();
//if(i-deque1.front()+1==m) deque1.front()有可能被更新掉
if(i>=m-1)
cout<<a[deque1.front()]<<" ";
}
return 0;
}
max(sum[i]-sum[j]) (j属于[i-(m-1),i-1])
sum[i]-min(sum[j])
(j属于[i-(m-1),i-1])dfs()
或while()void dfs(int x){
cout<<x;
if(l[x]!=-1)dfs(l[x]);
if(r[x]!=-1)dfs(r[x]);
}
void dfs(int x){
if(l[x]!=-1)dfs(l[x]);
cout<<x;
if(r[x]!=-1)dfs(r[x]);
}
``priority_queue<``int``,vector<``int``>,greater<``int``> >que3;``//注意“>>”会被认为错误,
``//这是右移运算符,所以这里用空格号隔开
priority_queue<int,vector<int>,greater/less<int> > pqx
使用优先队列时,如果需要对Time中的start从小到大排序,有两种方法:
priority_queue<Time> pq;
一.在结构体外重载结构体小于运算符:
bool operator <(const Time& a,const Time& b){ return a.start > b.start; } //这里以大于重载小于是因为默认情况下,优先队列是以大的作为队首,这样一反,就可以再默认情况下使得小的作为队首二.直接在结构体中重载小于运算符:
二.直接在结构体中重载小于运算符:
struct Time{ int start, end; bool operator < (const Time& t)const{ return start > t.start; } //用大于号去重载小于号 };
1MB=1024KB=1024KB*1024=1048576B=1.048576e6B
1int占4个字节,1e10占4e10的字节
register 是表示使用cpu内部寄存器(寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件)的变量,而平时的int是把变量放在内存中,存到寄存器中可以加快变量的读写速度。
标签:速度 size 清空 gre 结合 数组实现 names name blank
原文地址:https://www.cnblogs.com/BeautifulWater/p/14409737.html