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

来源:互联网 发布:江苏公务员待遇知乎 编辑:程序博客网 时间:2024/05/22 14:43

题目描述

传送门

题解

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

代码

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<map>using namespace std;#define N 500005int 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]);}
0 0
原创粉丝点击