博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ4419: [Shoi2013]发微博
阅读量:5304 次
发布时间:2019-06-14

本文共 1076 字,大约阅读时间需要 3 分钟。

【传送门:】


简要题意:

  有n个人,m种操作

  1.!x表示x发了一条朋友圈,所有x的朋友都可以看到

  2.+ x y表示x和y成为了朋友

  3.- x y表示x和y解除了朋友关系

  注意,x和y是朋友,y和z是朋友,x和z不一定是朋友

  最后求出每个人能看到多少条信息


题解:

  用set来保存每个人的交际关系

  对于x和y,y对x的贡献为:x和y为朋友时y发的消息数=x和y解除好友时y发的消息数-x和y刚刚成为朋友时y发的消息数

  只要处理每个人发出的信息和收到的信息就可以了


参考代码:

#include
#include
#include
#include
#include
#include
using namespace std;set
S[210000];set
:: iterator it;int s[210000],ans[210000];int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) S[i].clear(); char st[2]; memset(s,0,sizeof(s)); for(int i=1;i<=m;i++) { scanf("%s",st+1); if(st[1]=='!') { int x;scanf("%d",&x); s[x]++; } else if(st[1]=='+') { int x,y;scanf("%d%d",&x,&y); ans[x]-=s[y];ans[y]-=s[x]; S[x].insert(y);S[y].insert(x); } else { int x,y;scanf("%d%d",&x,&y); ans[x]+=s[y];ans[y]+=s[x]; S[x].erase(y);S[y].erase(x); } } for(int i=1;i<=n;i++) { for(it=S[i].begin();it!=S[i].end();it++) { ans[i]+=s[*it]; } } for(int i=1;i

 

转载于:https://www.cnblogs.com/Never-mind/p/8649544.html

你可能感兴趣的文章
一道概率题
查看>>
COM Tip(2)
查看>>
stp协议
查看>>
Java通过JDBC 进行Dao层的封装
查看>>
cx_Oracle.DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded 解决方法
查看>>
webstorm常用功能快捷方式
查看>>
mysql 数据库性能优化之SQL优化
查看>>
【poj2942】 Knights of the Round Table
查看>>
尽情享受生活之乐趣——蒙田
查看>>
多条件异步搜索+分页(PHP、 AJAX、ThinkPHP)
查看>>
PHP7中我们应该学习会用的新特性
查看>>
安卓MonkeyRunner源码分析之工作原理架构图及系列集合
查看>>
Android Volley 库的使用
查看>>
前端资源合并
查看>>
wifidog 配置中文说明
查看>>
Sublime Text 中文乱码问题
查看>>
带输入查询功能匹配下拉框的几种实现方式
查看>>
MySite上UserProfile的Property数量减少
查看>>
什么是测试策略?
查看>>
TCP与UDP的区别
查看>>