题目传送门
。
解法:
%Rose_max用边目录a了完全想不到%
不太容易想。
亮老师跟我说用set来做。。
可是我不会set啊【小声逼逼
那我只好想别的方法了。。
那么题目说删除好友一定保证他们原来是好友。
所以你需要求的其实是每次加和删除之间能看到多少次。
那么作差就行了呀。
从后往前。统计一个人发了多少条微博。
如果遇到删除好友证明后面的都看不到了。所以互相减去对方的微博条数
如果遇到加好友证明后面的都看得到,即使后面有删除好友那也减掉了。所以互相加上对方的微博条数。
代码实现:
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int a[210000],s[210000];
struct node {char s[5];int x,y;}t[510000];
int main() {
int n,m;scanf("%d%d",&n,&m);memset(a,0,sizeof(a));memset(s,0,sizeof(s));
for(int i=1;i<=m;i++) {
scanf("%s%d",t[i].s+1,&t[i].x);
if(t[i].s[1]!='!')scanf("%d",&t[i].y);
}
for(int i=m;i>=1;i--) {
if(t[i].s[1]=='!')a[t[i].x]++;
if(t[i].s[1]=='+')s[t[i].x]+=a[t[i].y],s[t[i].y]+=a[t[i].x];
if(t[i].s[1]=='-')s[t[i].x]-=a[t[i].y],s[t[i].y]-=a[t[i].x];
}
for(int i=1;i<n;i++)printf("%d ",s[i]);printf("%d\n",s[n]);
return 0;
}