题意:给你一个初始没有边,点权均为0的无向图,三种操作:加边,删边,选择一个点将当前与之相邻的点(不包括自身)的点权+1,询问最后所有点的点权。

据说正解是set维护每个人的朋友,然后考虑每次加边、删边对答案的贡献......但作为脑子有坑的选手,我搞出了一个动态开点线段树....首先离线,分别考虑每条边对答案的贡献。不妨分别考虑这条边存在的每一个时间区间。那么我们只要知道这个时间区间中两个端点各进行了几次点权增加(发微博)操作就可以更新两边的答案。考虑对每一个点开一棵线段树,如果这个点在第i个操作中发了一条微博就把下标为i处+1,查询的时候线段树区间查询即可。直接建的空间复杂度n*mlogm会TLE+MLE,所以动态开点,每次修改操作建一条链,总的空间复杂度mlogm。用map存了一下边所以很慢明明是线段树常数炸天

注意m次操作后没有被删除的边也要更新答案,WA了一发。

#include<cstdio>
#include<map>
using namespace std;
const int maxn=,maxm=;
int n,m;
struct node{
int sum;
node *lch,*rch;
node(){
sum=;
lch=rch=;
}
}t[maxm*];int cnt=;
node *root[maxn];
map<long long,int> dict;
void Insert(node *&rt,int k,int l,int r){
if(rt==){
++cnt;rt=t+cnt;
}
if(l==r){
rt->sum++;
return;
}
int mid=(l+r)>>;
if(k<=mid)Insert(rt->lch,k,l,mid);
else Insert(rt->rch,k,mid+,r);
rt->sum=;
if(rt->lch)rt->sum+=rt->lch->sum;
if(rt->rch)rt->sum+=rt->rch->sum;
}
int ql,qr,ans;
void query(node *rt,int l,int r){
if(rt==)return;
if(ql<=l&&r<=qr){
ans+=rt->sum;
return;
}
int mid=(l+r)>>;
if(ql<=mid)query(rt->lch,l,mid);
if(qr>mid)query(rt->rch,mid+,r);
}
int u[maxm],v[maxm],from[maxm],to[maxm];int tot=;
int res[maxn];
int main(){
scanf("%d%d",&n,&m);
char buf[];
int a,b;
for(int i=;i<=m;++i){
scanf("%s",buf);
if(buf[]=='!'){
scanf("%d",&a);
Insert(root[a],i,,m);
}else if(buf[]=='+'){
scanf("%d%d",&a,&b);
if(a>b)swap(a,b);
dict[(a-)*1LL*n+b]=i;
}else{
scanf("%d%d",&a,&b);
if(a>b)swap(a,b);
++tot;
u[tot]=a;v[tot]=b;
from[tot]=dict[(a-)*1LL*n+b];
dict.erase((a-)*1LL*n+b);
to[tot]=i;
}
}
for(int i=;i<=tot;++i){
ql=from[i];qr=to[i];
ans=;
query(root[v[i]],,m);res[u[i]]+=ans;
ans=;
query(root[u[i]],,m);res[v[i]]+=ans;
}
for(map<long long,int>::iterator pt=dict.begin();pt!=dict.end();++pt){
ql=pt->second;qr=m;
a=(pt->first-)/n+;b=(pt->first)%n;
if(b==)b=n;
ans=;
query(root[a],,m);res[b]+=ans;
ans=;
query(root[b],,m);res[a]+=ans;
}
for(int i=;i<=n;++i)printf("%d%c",res[i],(i==n)?'\n':' ');
}

bzoj4419[SHOI2013]发微博的更多相关文章

  1. BZOJ4419: [Shoi2013]发微博 暴力

    Description 刚开通的SH微博共有n个用户(1..n标号),在短短一个月的时间内,用户们活动频繁,共有m条按时间顺序的记录: ! x   表示用户x发了一条微博: + x y 表示用户x和用 ...

  2. BZOJ4419:[SHOI2013]发微博(乱搞)

    Description 刚开通的SH微博共有n个用户(1..n标号),在短短一个月的时间内,用户们活动频繁,共有m条按时间顺序的记录: ! x   表示用户x发了一条微博: + x y 表示用户x和用 ...

  3. BZOJ4419 SHOI2013发微博(平衡树)

    好友状态的变化次数不会超过m,于是考虑暴力,对每个人记录其好友关系的变化,通过前缀和计算贡献.这需要查询一段前缀时间内某人发的微博数量,可以离线建一棵绝对平衡的平衡树.事实上完全可以线性. #incl ...

  4. 【BZOJ4419】[SHOI2013]发微博(???)

    [BZOJ4419][SHOI2013]发微博(???) 题面 BZOJ 洛谷 题解 一道\(easy\),每个点维护一下要给周围的点加上多上,如果额外连了一个点进来就给他把标记减掉,如果删掉了一条边 ...

  5. [BZOJ 4419][Shoi2013]发微博

    4419: [Shoi2013]发微博 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 665  Solved: 364[Submit][Status] ...

  6. BZOJ 4419: [Shoi2013]发微博 set模拟

    4419: [Shoi2013]发微博 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4419 Description 刚开通的SH微博共 ...

  7. 洛谷 P3998 [SHOI2013]发微博

    洛谷 P3998 [SHOI2013]发微博 洛谷传送门 题目描述 刚开通的 SH 微博共有n个用户(1Ln标号),在这短短一个月的时间内, 用户们活动频繁,共有m 条按时间顺序的记录: ! x 表示 ...

  8. P3998 [SHOI2013]发微博 方法记录

    原题链接 [SHOI2013]发微博 题目描述 刚开通的 SH 微博共有 \(n\) 个用户(\(1\sim n\) 标号),在这短短一个月的时间内,用户们活动频繁,共有 \(m\) 条按时间顺序的记 ...

  9. 【bzoj4419】[Shoi2013]发微博 STL-set

    题目描述 刚开通的SH微博共有n个用户(1..n标号),在短短一个月的时间内,用户们活动频繁,共有m条按时间顺序的记录: ! x   表示用户x发了一条微博: + x y 表示用户x和用户y成为了好友 ...

随机推荐

  1. [转]Spring JdbcTemplate 查询分页

    原文:http://blog.csdn.net/xiaofanku/article/details/4280128 现在进行的项目由于数据库的遗留原因(设计的不堪入目)不能用hibernate.所以用 ...

  2. 【转】如何拿到半数面试公司Offer——我的Python求职之路

    原文地址 从八月底开始找工作,短短的一星期多一些,面试了9家公司,拿到5份Offer,可能是因为我所面试的公司都是些创业性的公司吧,不过还是感触良多,因为学习Python的时间还很短,没想到还算比较容 ...

  3. Beta版本项目展示要求

    项目评审的定在1月5日上午9:00在新主楼D225进行. 在Beta阶段项目评审会上, 每个团队有12分钟展示时间,10分钟问答和机动时间,我们的展示也不需要PPT,大家把要展现的东西写成博客(可以有 ...

  4. 我在 CSDN 的小窝

    以后有文章,我会同时更新 博客园 和 CSDN. CSDN:http://blog.csdn.net/u010918003

  5. Package Control Installation

    simple 用 ctrl+~ 打开 sublime 的控制台,将下面代码复制进去. sublime text2: import urllib2, os, hashlib; h = '2915d185 ...

  6. 数据库表转javaBean

    复制后修改部分代码 package com.study; import java.io.BufferedWriter; import java.io.File; import java.io.File ...

  7. kill 根据PID终止进程

    根据PID终止进程 kill [option] PID-list kill 通过向一个或多个进程发送信号来终止进程.除超级用户外,只有进程的所有者才可以对进程执行kill 参数 PID-list为ki ...

  8. android 一条线

    还在为布局的时候做不出来一条细细的线而烦恼么? 哈哈,自从知道了写法腰也不酸了,腿也不疼了!一口气写100行!! <View android:layout_height="1px&qu ...

  9. python环境搭建-在Windows上安装python3.5.2

    在Windows上安装Python3.5.2 首先,根据你的Windows版本(64位还是32位)从Python的官方网站下载Python 3.5.2对应的64位安装程序或32位安装程序(网速慢的同学 ...

  10. Eclipse+Maven创建webapp项目<一>

    Eclipse+Maven创建webapp项目<一> 1.开启eclipse,右键new——>other,如下图找到maven project 2.选择maven project,显 ...