传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4419
刚开始想了一万年,回去发现是直接连接……QwQ
两个人在连接时产生的贡献可以通过差分计算,最后相当于断绝所有关系的过程,计算贡献即可。
(stl自带一坨东西不用白不用,或者叫 懒癌晚期)
注意输出格式!!!!!
#include<stdio.h>
#include<set>
#define N 200005
using namespace std;
int n,m,ans[N],a[N];
set<int> T[N];
int main()
{
scanf("%d%d\n",&n,&m);
while (m--)
{
char c=getchar();int x,y;
if (c=='!') scanf("%d\n",&x),a[x]++;
if (c=='+')
{
scanf("%d%d\n",&x,&y);
ans[x]-=a[y];ans[y]-=a[x];
T[x].insert(y);T[y].insert(x);
}
if (c=='-')
{
scanf("%d%d\n",&x,&y);
ans[x]+=a[y];ans[y]+=a[x];
T[x].erase(y);T[y].erase(x);
}
}
for (int i=1;i<=n;i++) for (set<int>::iterator poi=T[i].begin();poi!=T[i].end();poi++) ans[i]+=a[*poi];
for (int i=1;i<n;i++) printf("%d ",ans[i]);printf("%d\n",ans[n]);
}