Berstagram ——模拟

Polycarp最近注册了一个新的社交网络Berstagram。他立即在那里发表了 n 篇帖子。他给所有帖子分配了从 1 到 n 的数字,并逐一发布。所以,就在发布Polycarp的新闻推送后,包含了从 1 到 n 的帖子——最高的帖子编号为 1,下一个帖子编号为 2……,最低的帖子为 n。
在那之后,他把朋友们的所有赞都写了下来。从第 1 次到第 m 次,点赞是连续出现的。给你一个序列a1,a2,…,am(1≤aj≤n),其中aj是接收第j个类似的帖子。
Berstagram的新闻提要以以下方式工作。让我们假设第 j 个赞是给后 aj 的。如果这个帖子不是最高的(第一个)帖子,那么它会用上面的帖子来改变它的位置。如果aj是最高的职位,什么都不会改变。

例如,如果 n=3,m=5,a=[3,2,1,3,3],则Polycarp的新闻提要具有以下状态:
在第一个类似之前:[1,2,3];
在第一类之后:[1,3,2];
第二类之后:[1,2,3];
第三类之后:[1,2,3];
第四类之后:[1,3,2];
在第五类之后:[3,1,2]。
Polycarp想知道每个帖子的最高(最低)和最低(最高)位置。Polycarp考虑时间的所有时刻,包括“在所有喜欢之前”的时刻。

输入
第一行包含两个整数 n 和 m(1 ≤ n ≤ 1e5,1 ≤ m ≤ 4e5)——帖子数量和点赞数量。
第二行包含整数 a1,a2,…,am(1 ≤ aj ≤ n),其中 aj 是接收第 j 个帖子的点赞。

输出
打印n对整数。第i行应包含第i个帖子的最高(最小)和最低(最大)位置。
你应该考虑到任何时候的立场:在所有点赞之前,在每次点赞之后和所有点赞之后。位置编号从1(最高)到n(最低)。

Input1
3 5
3 2 1 3 3
Output1
1 2
2 3
1 3

Input2
10 6
7 3 5 7 3 6
Output2
1 2
2 3
1 3
4 7
4 5
6 7
5 7
8 8
9 9
10 10

#include 
using namespace std;
#define int long long
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef pair PII;
const double PI=acos(-1.0);
const int N=2e6+10;
int n,m;
int a[N],p[N];
int l[N],r[N];
signed main()
{
    ios;
    cin>>n>>m;
    for (int i=1;i<=n;i++)
    {
        a[i]=i;
        p[i]=i;
        l[i]=r[i]=i;
    }
    while (m--)
    {
        int x;
        cin>>x;
        int id=p[x];            //x 的位置
        if (id==1) continue;    //元素的位置不变
        int y=a[id-1];          //x 前一元素的位置
        swap(a[id],a[id-1]);    //交换两位置上的元素
        p[y]=id;                //更新两元素的位置
        p[x]=id-1;
        l[x]=min(l[x],id-1);    //更新这两个元素的上下限
        r[y]=max(r[y],id);
    }
    for (int i=1;i<=n;i++) cout<


 

你可能感兴趣的:(算法,数据结构)