[BZOJ4419][Shoi2013]发微博(map)

题目描述

传送门

题解

用stl水水
对于每一个人记录发了几条微博,维护一个朋友圈,朋友圈里的每一个人有一个权,维护保证权+记录=这个人作为他的朋友的时候看到他发了几条微博
删除+最后 统计答案就行了

代码

#include
#include
#include
#include
#include
#include
using namespace std;
#define N 500005

int n,m;
int cnt[N],ans[N];
map <int,int> mp[N];

int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m;++i)
    {
        char opt=getchar();
        while (opt!='!'&&opt!='+'&&opt!='-') opt=getchar();
        if (opt=='!')
        {
            int x;scanf("%d",&x);
            ++cnt[x];
        }
        if (opt=='+')
        {
            int x,y;scanf("%d%d",&x,&y);
            mp[x][y]=-cnt[x];
            mp[y][x]=-cnt[y];
        }
        if (opt=='-')
        {
            int x,y;scanf("%d%d",&x,&y);
            ans[y]+=cnt[x]+mp[x][y];
            ans[x]+=cnt[y]+mp[y][x];
            mp[x].erase(y);mp[y].erase(x);
        }
    }
    for (int i=1;i<=n;++i)
    {
        map<int,int>::iterator t;
        for (t=mp[i].begin();t!=mp[i].end();++t)
            ans[t->first]+=t->second+cnt[i];
    }
    for (int i=1;i<=n;++i) printf("%d%c",ans[i]," \n"[i==n]);
}

你可能感兴趣的:(题解,stl)