bzoj4419: [Shoi2013]发微博

35 篇文章 0 订阅

题目传送门

解法:
%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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值