题意
有一些加边删边操作,可将一个点连向的所有点+1。求最后每个点的值。
题解:
set乱搞。
对每个点标记一下,删边和最后暴力下传。
ps:访问set迭代器:set::iterator i;
code:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<set>
#include<algorithm>
using namespace std;
int n,m;
struct node{
set<int> fr;
}p[200010];
int mark[200010],a[200010];
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++)
{
char ch[3];scanf("%s",ch+1);
if(ch[1]=='!'){int x;scanf("%d",&x);mark[x]++;}
if(ch[1]=='-')
{
int x,y;scanf("%d %d",&x,&y);
p[x].fr.erase(y);a[y]+=mark[x];
p[y].fr.erase(x);a[x]+=mark[y];
}
if(ch[1]=='+')
{
int x,y;scanf("%d %d",&x,&y);
a[y]-=mark[x];p[x].fr.insert(y);
a[x]-=mark[y];p[y].fr.insert(x);
}
}
for(int x=1;x<=n;x++)
{
set<int>::iterator i;
for(i=p[x].fr.begin();i!=p[x].fr.end();i++) a[*i]+=mark[x];
}
for(int i=1;i<n;i++) printf("%d ",a[i]);
printf("%d",a[n]);
}