NC20424. [SHOI2013]发微博
描述
输入描述
第1行2个整数n,m。
接下来m行,按时间顺序读入m条记录,每条记录的格式如题目所述,用空格隔开。
输出描述
输出一行n个用空格隔开的数(行末无空格),第i个数表示用户i最后看到了几条消息。
示例1
输入:
2 8 ! 1 ! 2 + 1 2 ! 1 ! 2 - 1 2 ! 1 ! 2
输出:
1 1
说明:
只有第4和第5条记录对应的消息被看到过。其他消息发送时,1和2不是好友。C++ 解法, 执行用时: 211ms, 内存消耗: 11944K, 提交时间: 2022-01-13 22:29:28
#include <set> #include <cstdio> #include <utility> using namespace std; typedef pair<int , int> pr; set<pr> s;int cnt[200010] , ans[200010]; char str[5]; int main() { int n , m , i , x , y; pr tmp; scanf("%d%d" , &n , &m); while(m -- ) { scanf("%s%d" , str , &x); if(str[0] == '!') cnt[x] ++ ; else if(str[0] == '+') scanf("%d" , &y) , ans[x] -= cnt[y] , ans[y] -= cnt[x] , s.insert(pr(min(x , y) , max(x , y))); else scanf("%d" , &y) , ans[x] += cnt[y] , ans[y] += cnt[x] , s.erase(pr(min(x , y) , max(x , y))); } while(!s.empty()) tmp = *s.begin() , ans[tmp.first] += cnt[tmp.second] , ans[tmp.second] += cnt[tmp.first] , s.erase(tmp); for(i = 1 ; i < n ; i ++ ) printf("%d " , ans[i]); printf("%d\n" , ans[n]); return 0; }