[SHOI 2013] 发微博

Posted evenbao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[SHOI 2013] 发微博相关的知识,希望对你有一定的参考价值。

[题目链接]

        https://www.lydsy.com/JudgeOnline/problem.php?id=4419

[算法]

        用std :: set维护每个人的好友集合

        当两人成为好友时将每人接收到的消息减去另一个人之前发的消息 , 当两人解除好友时 , 将每人接受到的消息加上另一个人发的消息 , 这是一个类似于差分前缀和的过程 , 不再赘述 , 详见代码

        时间复杂度 : O(MlogN)

[代码]

        

#include<bits/stdc++.h>
using namespace std;
#define MAXN 500010

int n , m;
int cnt[MAXN] , ans[MAXN];
set< int > S[MAXN];

int main()
{
    
    scanf("%d%d" , &n , &m);
    for (int i = 1; i <= m; i++)
    {
        char op[5];
        scanf("%s" , &op);
        if (op[0] == !)
        {
            int x;
            scanf("%d" , &x);
            cnt[x]++;    
        } else if (op[0] == +)
        {
            int x , y;
            scanf("%d%d" , &x , &y);
            S[x].insert(y);
            S[y].insert(x);
            ans[x] -= cnt[y];
            ans[y] -= cnt[x];
        } else
        {
            int x , y;
            scanf("%d%d" , &x , &y);
            ans[x] += cnt[y];
            ans[y] += cnt[x];
            S[x].erase(S[x].find(y));
            S[y].erase(S[y].find(x));
        }
    }
    for (int i = 1; i <= n; i++)
    {
        for (set< int > :: iterator it = S[i].begin(); it != S[i].end(); it++)
            ans[i] += cnt[*it];
    }
    for (int i = 1; i < n; i++) printf("%d " , ans[i]);
    printf("%d
" , ans[n]);
    
    return 0;
}

 

以上是关于[SHOI 2013] 发微博的主要内容,如果未能解决你的问题,请参考以下文章

4419. [SHOI2013]发微博乱搞

luogu P3998 [SHOI2013]发微博

bzoj4419[SHOI2013]发微博

新浪微博客户端(25)-添加转发微博

通过微博API怎么获取用户发微博的实际地点

iOS微博项目发微博和定位