[BZOJ 4419][Shoi2013]发微博
4419: [Shoi2013]发微博
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 665 Solved: 364
[Submit][Status][Discuss]Description
刚开通的SH微博共有n个用户(1..n标号),在短短一个月的时间内,用户们活动频繁,共有m条按时间顺序的记录:! x 表示用户x发了一条微博;+ x y 表示用户x和用户y成为了好友- x y 表示用户x和用户y解除了好友关系当一个用户发微博的时候,所有他的好友(直接关系)都会看到他的消息。假设最开始所有人之间都不是好友关系,记录也都是合法的(即+ x y时x和y一定不是好友,而- x y时x和y一定是好友)。问这m条记录发生之后,每个用户分别看到了多少条消息。Input
第1行2个整数n,m。接下来m行,按时间顺序读入m条记录,每条记录的格式如题目所述,用空格隔开。Output
输出一行n个用空格隔开的数(行末无空格),第i个数表示用户i最后看到了几条消息。Sample Input
2 8
! 1
! 2
+ 1 2
! 1
! 2
- 1 2
! 1
! 2Sample Output
1 1
只有第4和第5条记录对应的消息被看到过。其他消息发送时,1和2不是好友。对100%的数据,N<=200000,M<=500000
题解
可以通过差分来进行维护操作. 我们可以考虑先开一个数组维护每一个用户当前发的信息数量, 然后再想办法快速维护某个用户的好友列表(可以偷懒用 $std::set$ 维护)
差分的时候可以在加边的时候让对方的差分数据减去当前发过的信息数量, 删边的时候加上当前发过的信息数量. 最后统计答案的时候统一将所有好友发过的信息数量加上之前维护的差分数量就可以正确排斥非好友状态的信息了.
参考代码
GitHub
#include <set>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> const int MAXN=2e5+; int n;
int m;
int ans[MAXN];
int cnt[MAXN];
int delta[MAXN];
std::set<int> lk[MAXN]; char buf[]; int main(){
int n,m;
int a,b;
scanf("%d%d",&n,&m);
for(int i=;i<m;i++){
scanf("%s",buf);
if(*buf=='!'){
scanf("%d",&a);
cnt[a]++;
}
else if(*buf=='+'){
scanf("%d%d",&a,&b);
delta[a]-=cnt[b];
delta[b]-=cnt[a];
lk[a].insert(b);
lk[b].insert(a);
}
else if(*buf=='-'){
scanf("%d%d",&a,&b);
delta[a]+=cnt[b];
delta[b]+=cnt[a];
lk[a].erase(b);
lk[b].erase(a);
}
}
for(int i=;i<=n;i++){
for(std::set<int>::iterator it=lk[i].begin();it!=lk[i].end();++it){
ans[*it]+=cnt[i];
}
}
printf("%d",ans[]+delta[]);
for(int i=;i<=n;i++){
printf(" %d",ans[i]+delta[i]);
}
putchar('\n');
return ;
}
Backup

[BZOJ 4419][Shoi2013]发微博的更多相关文章
- BZOJ 4419: [Shoi2013]发微博 set模拟
4419: [Shoi2013]发微博 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4419 Description 刚开通的SH微博共 ...
- 【BZOJ4419】[SHOI2013]发微博(???)
[BZOJ4419][SHOI2013]发微博(???) 题面 BZOJ 洛谷 题解 一道\(easy\),每个点维护一下要给周围的点加上多上,如果额外连了一个点进来就给他把标记减掉,如果删掉了一条边 ...
- 洛谷 P3998 [SHOI2013]发微博
洛谷 P3998 [SHOI2013]发微博 洛谷传送门 题目描述 刚开通的 SH 微博共有n个用户(1Ln标号),在这短短一个月的时间内, 用户们活动频繁,共有m 条按时间顺序的记录: ! x 表示 ...
- P3998 [SHOI2013]发微博 方法记录
原题链接 [SHOI2013]发微博 题目描述 刚开通的 SH 微博共有 \(n\) 个用户(\(1\sim n\) 标号),在这短短一个月的时间内,用户们活动频繁,共有 \(m\) 条按时间顺序的记 ...
- bzoj4419[SHOI2013]发微博
题意:给你一个初始没有边,点权均为0的无向图,三种操作:加边,删边,选择一个点将当前与之相邻的点(不包括自身)的点权+1,询问最后所有点的点权. 据说正解是set维护每个人的朋友,然后考虑每次加边.删 ...
- BZOJ4419: [Shoi2013]发微博 暴力
Description 刚开通的SH微博共有n个用户(1..n标号),在短短一个月的时间内,用户们活动频繁,共有m条按时间顺序的记录: ! x 表示用户x发了一条微博: + x y 表示用户x和用 ...
- BZOJ4419:[SHOI2013]发微博(乱搞)
Description 刚开通的SH微博共有n个用户(1..n标号),在短短一个月的时间内,用户们活动频繁,共有m条按时间顺序的记录: ! x 表示用户x发了一条微博: + x y 表示用户x和用 ...
- [SHOI2013]发微博
Description 刚开通的SH微博共有n个用户(1..n标号),在短短一个月的时间内,用户们活动频繁,共有m条按时间顺序的记录: ! x 表示用户x发了一条微博: + x y 表示用户x ...
- 【bzoj4419】[Shoi2013]发微博 STL-set
题目描述 刚开通的SH微博共有n个用户(1..n标号),在短短一个月的时间内,用户们活动频繁,共有m条按时间顺序的记录: ! x 表示用户x发了一条微博: + x y 表示用户x和用户y成为了好友 ...
随机推荐
- Tomcat报内存溢出
1.错误描述 严重:Exception occurred during processing request:null java.lang.reflect.InvocationTar ...
- hihocoder Challenge 29 A.序列的值
我现在就感觉我这人现在真的没有dp的意识 其实真写起来也不难,但是把就是练的少思维跟不上,dp从根本上就是一种状态的提炼和聚集. 按照题解的意思来,表示二进制第i位的值为j(0,1)的组合有多少,然后 ...
- 非空校验的提示按钮(shiro项目中来的六)
一:图示 二,js脚本 /** * jquery tips 提示插件 jquery.tips.js v0.1beta * * 使用方法 * $(selector).tips({ //selector ...
- 内置函数:filter函数
功能: filter函数用于过滤序列,将满足条件的元素取出来构成新的序列. 用法: filter(function, iterable) 接受两个参数,第一个函数为过滤函数(返回True后者False ...
- jquery 实现拖动文件上传加进度条
通过对文件的拖动实现文件的上传,主要用到的是HTML5的ondrop事件,上传内容通道FormData传输: //进度条 <div class="parent-dlg" &g ...
- 通过smtp直接发送邮件
/// <param name="fromEmail">发件人的邮箱</param> /// <param name="toEmail&qu ...
- 【BZOJ2006】超级钢琴(主席树,优先队列)
[BZOJ2006]超级钢琴(主席树,优先队列) 题面 BZOJ 题解 既然是一段区间 首先就要变成单点 所以求一个前缀和 这个时候贪心很明显了: 枚举每一个点和可以和它组成一段的可行的点 全部丢进一 ...
- 圆方树简介(UOJ30:CF Round #278 Tourists)
我写这篇博客的原因 证明我也是学过圆方树的 顺便存存代码 前置技能 双联通分量:点双 然后就没辣 圆方树 建立 新建一个图 定义原图中的所有点为圆点 对于每个点双联通分量(只有两个点的也算) 建立一个 ...
- LCT维护子树信息(BZOJ4530:[BJOI2014]大融合)
题面 没有权限号的可以去LOJ Sol 大家都知道,\(LCT\)上有许多实边和虚边 实边就是每棵\(Splay\)上的既认父亲又认儿子的边 虚边就是\(Splay\)和\(Splay\)之间只认父亲 ...
- 踩坑の SpringMVC文件上传
环境准备 添加两个jar包 commons-fileupload-1.2.2.jar commons-io-2.4.jar 配置要求 在springmvc.xml中配置multipart类型解 ...