结构

//单调队列
//hh为队头,tt为队尾
//最形象的例题:https://www.luogu.com.cn/problem/P1886#submit
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int n,k;
int a[N],q[N];///a数组储存数据,q数组储存每个元素的下标;
int main()
{
    cin>>n>>k;
    for(int i=0;i<n;i++) cin>>a[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]) tt--;///每当插入元素,如果这个元素比队尾元素还要小,那么队尾元素没用,直接删除队尾元素;
        q[++tt]=i;///将元素下标存入队列
        if(i>=k-1) cout<<a[q[hh]]<<" ";
    }
    cout<<endl;
    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]) tt--;
        q[++tt]=i;
        if(i>=k-1) cout<<a[q[hh]]<<" ";
    }
    return 0;
}
//创立无权邻接表
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
vector<int>g[N];
int n,m;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        g[x].push_back(y);
        g[y],push_back(x);
    }
    for(int i=1;i<=n;i++)
    {
        cout<<i<<":"<<" "<<endl;
        for(auto v:g[i])
            cout<<v<<" ";
        cout<<endl;
    }
}
// 创立有权邻接表
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int n,m;
struct node
{
    int to;
    int val;
};
vector<node>g[N];
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        node tmp;
        cin>>a>>b>>c;
        tmp.to=b;
        tmp.val=c;
        g[a].push_back(tmp);
    }
    for(int i=1;i<=n;i++)
    {
        cout<<i<<":"<<endl;
        for(auto v:g[i])
            cout<<v.to<<" "<<v.val;
        cout<<endl;
    }
    return 0;
}

 

posted @ 2023-05-24 13:02  o-Sakurajimamai-o  阅读(7)  评论(0编辑  收藏  举报
-- --