I - In Touch-Gym 100492I-水题

本文介绍了一个社交网络中消息传播的算法实现,该算法通过记录每个用户的发布消息数及好友关系变化来计算每位用户最终接收到的消息数量。采用C++实现,包括文件读写、数据结构设计等细节。

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;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值