n个人m个操作
! i 第i个人发了一条信息
+ 2 1 ----1 和2成为朋友,可以看到对方发的消息(成为朋友之前的消息看不到)
- 1 2 --- 1和2绝交,看不到此后的信息(之前的还有)
最后问每个人的消息列表里 记录了多少条信息
每个人的消息列表用一个set记录就好
进朋友的set之前 先减去他已经发的了消息,最后 加上最终的消息,即可得到每个人 在交朋友到结束之间收到这个朋友的信息条数;
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <iostream>
#include<stdlib.h>
#include <queue>
#include <set>
#include <vector>
#define MAX 200001
#define inf 0x3f3f3f3f
using namespace std;
#define tree_size MAX*3
struct user
{
int mes,num;
set<int>fri;
}A[MAX];
set<int>::iterator it;
int main()
{
freopen("intouch.in","r",stdin);
freopen("intouch.out","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
getchar();
while(m--)
{
char op;
scanf("%c",&op);
if(op=='!')
{
int temp;
scanf("%d",&temp);
getchar();
A[temp].mes++;
}
if(op=='+')
{
int a,b;
scanf("%d%d",&a,&b);
getchar();
A[a].fri.insert(b);
A[b].fri.insert(a);
A[a].num-=A[b].mes;
A[b].num-=A[a].mes;
}
if(op=='-')
{
int a,b;
scanf("%d%d",&a,&b);
getchar();
A[a].fri.erase(b);
A[b].fri.erase(a);
A[a].num+=A[b].mes;
A[b].num+=A[a].mes;
}
}
for(int i=1;i<=n;i++)
{
int s=A[i].fri.size();
for( it=A[i].fri.begin();it!=A[i].fri.end();it++)
{
A[ *it ].num+=A[i].mes;
}
}
for(int i=1;i<=n;i++)
{
printf("%d ",A[i].num);
}
printf("\n");
return 0;
}