luoguP1886 滑动窗口

发一波树状数组的版本

单调队列是最快的

树状数组也可以过

需要吸氧这里使用了手动O3

具体怎么写就是树状数组的板子题,单点修改区间查询最值,注意初始值的设置调了很久

#pragma GCC optimize(3)
#include
#include
#include
using namespace std;
const int N=1000005;
int n,k,a[N],c[N],b[N];
inline int lowbit(int x){return (x&(-x));}
inline void modify1(int pos,int val)
{for(;pos<=n;pos+=lowbit(pos))c[pos]=max(c[pos],val);}
inline void modify2(int pos,int val)
{for(;pos<=n;pos+=lowbit(pos))b[pos]=min(b[pos],val);}
inline int query1(int l,int r)
{
    int ans=-0x7fffffff;
    while(r>=l)
    {
        ans=max(ans,a[r]);
        for(r--;r-lowbit(r)>=l;r-=lowbit(r))
        ans=max(ans,c[r]);
    }
    return ans;
}
inline int query2(int l,int r)
{
    int ans=0x7fffffff;
    while(r>=l)
    {
        ans=min(ans,a[r]);
        for(r--;r-lowbit(r)>=l;r-=lowbit(r))
        ans=min(ans,b[r]);
    }
    return ans;
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>k;
    memset(c,-0x3f,sizeof(c));
    memset(b,0x3f,sizeof(b));
    for(int i=1;i<=n;i++)cin>>a[i],modify1(i,a[i]),modify2(i,a[i]);
    for(int i=k;i<=n;i++)cout<

再发一下单调队列的,不用吸氧
版本一STL

#include
#include
using namespace std;
const int N=1000005;
int n,k;
struct node{int v,id;}a[N];
deque qmin,qmax;
int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)cin>>a[i].v,a[i].id=i;
    for(int i=1;i<=n;i++)
    {
        while(!qmin.empty()&&qmin.back().v>=a[i].v)qmin.pop_back();
        qmin.push_back(a[i]);
        if(qmin.front().id==i-k)qmin.pop_front();
        if(i>=k)cout<=k)cout<

版本二数组模拟

#include"iostream"
using namespace std;
const int N=1000005;
int n,k,a[N],h,t;
struct deque{int v,id;}qmax[N],qmin[N];
int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)cin>>a[i]; 
    h=t=1;
    for(int i=1;i<=n;i++)
    {
        while(h!=t&&qmin[t-1].v>=a[i])t--;
        qmin[t].v=a[i],qmin[t++].id=i;
        if(qmin[h].id==i-k)h++;
        if(i>=k)cout<=k)cout<

主要是想推广一下树状数组,这个数据结构非常好,会比线段树快,还十分好写

转载于:https://www.cnblogs.com/Ace-MYX/p/10617347.html

你可能感兴趣的:(luoguP1886 滑动窗口)