BZOJ 4419 发微博

Posted on 2016-05-08 12:51 ziliuziliu 阅读(...) 评论(...) 编辑 收藏

set暴力。记录一个rec数组表示每一个人发了多少次微博,当+时减去rec,-时加上rec即可表示看到了这个人的微博数量。

最后遍历一遍set再加上rec即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#define maxn 200500
using namespace std;
set <int> s[maxn];
int n,m,x,y,ans[maxn],rec[maxn];
set <int> ::iterator it;
char ss[2];
void work1()
{
    scanf("%d",&x);
    rec[x]++;
}
void work2()
{
    scanf("%d%d",&x,&y);
    s[x].insert(y);
    s[y].insert(x);
    ans[x]-=rec[y];
    ans[y]-=rec[x];
}
void work3()
{
    scanf("%d%d",&x,&y);
    s[x].erase(y);
    s[y].erase(x);
    ans[x]+=rec[y];
    ans[y]+=rec[x];
}
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m;i++)
    {
        scanf("%s",ss);
        if (ss[0]=='!') work1();
        else if (ss[0]=='+') work2();
        else work3();
    }
    for (int i=1;i<=n;i++)
    {
        for (it=s[i].begin();it!=s[i].end();it++)
        {
            int now=*it;
            ans[i]+=rec[now];
        }
    }
    for (int i=1;i<=n-1;i++)
        printf("%d ",ans[i]);
    printf("%d\n",ans[n]);
    return 0;
}