4419: [Shoi2013]发微博 set

set暴力维护一下标记。。

#include<bits/stdc++.h>
using namespace std;
set<int> s[200005];
int n,m;
int send[200005],recieve[200005];
inline int read()
{
    int a=0,f=1; char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
    while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
    return a*f;
}
int main()
{
    n=read(); m=read();
    for (int i=1;i<=m;i++)
    {
        char opt[5];
        scanf("%s",opt);
        int x,y;
        switch (opt[0])
        {
            case '!':
                x=read();
                send[x]++;
                break;
            case '+':
                x=read(),y=read();
                s[x].insert(y); s[y].insert(x);
                recieve[y]-=send[x]; recieve[x]-=send[y];
                break;
            case '-':
                x=read(),y=read();
                s[x].erase(y); s[y].erase(x);
                recieve[y]+=send[x]; recieve[x]+=send[y];
                break;
        }
    }
    for (int i=1;i<=n;i++)
        for (set<int>::iterator it=s[i].begin();it!=s[i].end();it++)
            recieve[*it]+=send[i];
    for (int i=1;i<=n;i++) 
    {
        printf("%d",recieve[i]);
        if (i!=n) putchar(32);
    }
    return 0;
}

你可能感兴趣的:(4419: [Shoi2013]发微博 set)