题目大意
现在有一个社交网站,有q(q≤250000)个操作
login(u): 用户u上线
logout(u): 用户u下线
add_friend(u, v): 用户u,v加为好友(保证原本不是好友)
del_friend(u, v): 用户u,v互相删除好友(保证原本u,v是好友)
count_online_friends(u): 输出u有多少个好友在线
用户被编号为1..n(n≤50000)
开始时有m对用户(m≤150000)互为好友
做法
理性分析一波,然而不能想到用数据结构维护的方法(然而它的标签上有data structures)
最后发现:其实就是暴力
先读入所有操作,不管所有删除操作,就可以得出一张图,算出每个点的度degree[i]。
然后开始做每个操作。维护一个数组g[i],表示对于当前i所有好友j,且degree[j]< degree[i],它们有多少个在线。
然后对于上下线操作,枚举degree大于等于它的好友更新g,查询时枚举degree大于等于它的好友,加上g[i]就是答案。
时间复杂度
令x等于i有多少个degree大于它的好友,那么它们的度数和sum≥x*x
然后因为所有点的度数和=边数的两倍,所以x*x≤边的总数。
所以枚举的复杂度是
m+q−−−−−√
总时间复杂度 O(qm+q−−−−−√)
代码还没打