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; }