ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

E. Messenger Simulator

2020-01-16 21:02:10  阅读:313  来源: 互联网

标签:Simulator int 位置 pos Messenger 数组 树状 include


题意:Polycarp是一个频繁交流的受欢迎的送信人,他与朋友们一直交流,他有n个朋友,从1到n编号。一开始,n个朋友的编号是从1、2、3、4....n编号的,如果交流了3,那么3的位置就会移动到最前面,变成3、1、2、4...n。

分析:这道题目让我们求每个朋友的编号所能达到的最大位置和最小位置,只要他处于联系列表里,那么他的最小位置就是1,如果不处于联系列表中,那么它的最小位置就是它的初始位置,它的最大位置会受到其它数的影响后移,因此,如果要统计一个数的位置的化,我们可以用树状数组求它之前出现过的数的个数,这样,时间复杂度就会变成\(O(logn)\),那么怎么去模拟数字的移动呢?我们可以用树状数组统计一个数字之前出现数的个数,用1来表示有,0表示无,因为有m次操作,把一个数移动到前面的化,我们要提前开辟好m个空间,每次移动,都会把一个数的位置改变,所以我们需要开一个pos数组来记录一个数字的位置。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 300005;

//树状数组
int tr[N * 2];
int minpos[N], maxpos[N];
int a[N];
int pos[2 * N];

//n个朋友,m次联系
int n, m;
int bound;
int lowbit(int x)
{
    return x & (-x);
}

void add(int pos, int d)
{
    for (int i = pos; i <= bound; i += lowbit(i))
        tr[i] += d;
}

int query(int x)
{
    int res = 0;
    for (int i = x; i; i -= lowbit(i))
        res += tr[i];
    return res;
}

int main()
{
    scanf("%d%d", &n, &m);

    bound = n + m;

    //读入联系
    for (int i = 1; i <= m; ++i)
    {
        scanf("%d", &a[i]);
    }

    for (int i = 1; i <= n; ++i)
    {
        minpos[i] = i, maxpos[i] = i;
        add(i + m, 1);
        //i所在的位置
        pos[i] = i + m;
    }

    for (int i = 1; i <= m; ++i)
    {
        int now = a[i];
        minpos[now] = 1;
        maxpos[now] = max(maxpos[now], query(pos[now]));
        add(pos[now], -1);
        pos[now] = m - i + 1;
        add(pos[now], 1);
    }

    for (int i = 1; i <= n; ++i) maxpos[i] = max(maxpos[i], query(pos[i]));
    for (int i = 1; i <= n; ++i) printf("%d %d\n", minpos[i], maxpos[i]);

    return 0;
}


标签:Simulator,int,位置,pos,Messenger,数组,树状,include
来源: https://www.cnblogs.com/pixel-Teee/p/12203233.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有