bzoj4419: [Shoi2013]發微博

Hanks_o發表於2018-03-27

題目傳送門

解法:
%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;
}

相關文章