描述
​ IcePrincess_1968 和 IcePrince_1968 长大了,他们开始协助国王 IceKing_1968 管理国内事物。

​ IcePrincess_1968 和 IcePrince_1968 住在一个宁静悠远的王国:IceKingdom —— 飘雪圣域。飘雪圣域有 n 个城镇,编号 1,2,3…n有些城镇之间有道路,且满足任意两点之间有且仅有一条路径。飘雪圣域风景优美,但气候并不是太好。根据 IcePrince_1968 的气候探测仪,将来会发生 qq 场暴风雪。每场暴风雪可以用两个整数 li,ri刻画,表示这场暴风雪之后,只有编号属于[li,ri]的城市没有受到暴风雪的影响。

​ 在暴风雪的影响下迅速确定王国的农业生产方案是非常重要的事情。IceKing_1968 认为,一个农业生产地域应该是一个极大连通块,满足每个节点都没有被暴风雪影响。这里极大连通块的定义是:不存在一个不属于该点集的未被暴风雪影响的点与该连通块连通。

​ IcePrincess_1968 要负责算出每次暴风雪后,王国能拥有多少个农业生产地域。注意这里每次暴风雪是独立的,即每次暴风雪过后,直到每个城镇重新焕发生机,下一次暴风雪才会到来。

​ 正如上文所述,IcePrincess_1968 擅长文学但不擅长计算机,于是请你帮忙。

输入
第一行包含两个正整数 n,q,表示 IceKingdom 的城镇个数和暴风雪次数。

​ 第 2 至第 n 行,每行两个正整数 x,y,表示城镇 x 和城镇 y 之间有一条道路。

​ 第 n+1至第 n+q行,每行两个正整数 li,ri,描述一场暴风雪,含义如题面所述。

输出
输出文件共有 q 行,第 ii 行表示在第 ii 场暴风雪之后农业生产地域的个数。

样例输入 [复制]
4 3
1 2
2 3
2 4
1 2
1 3
3 4
样例输出 [复制]
1
1
2
提示
【输入输出样例 1 解释】

​ 第一次询问,只有(1,2)一个连通块。

​ 第二次询问,只有(1,2,3)一个连通块。

​ 第三次询问,有 3 和 4 两个连通块。

【数据规模】

对于 30%的数据:n<=100,q<=100

对于 50%的数据:n<=2,000,q<=2,000

对于 100%的数据:n<=200,000,q<=200,000对于所有的暴风雪,li<=ri。

思路:

第一个突破口:对于一次修改,如果只枚举点,那么无法直接判断连通块的增减
改为枚举边: 删除一条边,多一个连通块。

但如果只删除与[l,r]区间内的点相关的点,我们不知道形成的连通块有哪些是[l,r]中的。所以这里要有一定的容斥思想:只要不是 [l,r]内部的边都删除

最后:所有不在[l,r]内的点都被单独剖开(一定会的),独自作为连通块,加上 在范围内的点组成的连通块,
用这个总数减去不在范围内的点的个数即可。

那么问题变成了,log以内询问删除多少边
把删点转化成删边:

对于一条边,把 起点和终点处理出来 ,由于顺序无影响,讨论的时强制让起点编号小于终点
对于 边 i: 如果 u<l | | v>r 则删除,
但 " | | " 会导致重复讨论,
转化成: u<l&&v<=n 和 u>=l&&v>r (包含所有情况)

在坐标系中画出更直观 ,一条边相当于 坐标为(u,v) 的点

对于在线,可以用可持久化权值线段树查询 (按照u排序,u作为插入时间指标,插入v, 区间就是u的限制,再查询v)

对于离线,用权值树状数组/线段树实现
可以把区间询问按照 两个端点分别为 一、二关键字排序

这里要注意, u和l有关,所以 以u为关键字要 排序l r和v有关系, 同理, 以v关键字排序 r
如果离线的话,有两个等式,要统计两次答案,不方便 ,转化成 (r-l+1)- (“”好边“总数) ,即 上述等式的补集

这里放主席树的代码:

#include<bits/stdc++.h>
using namespace std;
#define sf scanf
#define pf printf
const int maxn=2e5+10;
int tot=0,sum[maxn<<5],T[maxn<<5],L[maxn<<5],R[maxn<<5];
int build(int l,int r){int id=++tot;sum[id]=0;if(l<r){int mid=(l+r)>>1;L[id]=build(l,mid);R[id]=build(mid+1,r);}return id;
}
int change(int pre,int l,int r,int k){int id=++tot;if(l==r){sum[id]=sum[pre]+1;return id;}L[id]=L[pre];R[id]=R[pre];int mid=(l+r)>>1;if(k<=mid) L[id]=change(L[pre],l,mid,k);else R[id]=change(R[pre],mid+1,r,k);sum[id]=sum[L[id]]+sum[R[id]];return id;
}
int query(int u,int v,int l,int r,int ql,int qr){if(ql>qr)return 0;if(l>=ql&&r<=qr)return sum[v]-sum[u];int mid=(l+r)>>1;if(qr<=mid) return query(L[u],L[v],l,mid,ql,qr);else if(ql>mid) return query(R[u],R[v],mid+1,r,ql,qr);else  return query(L[u],L[v],l,mid,ql,qr)+query(R[u],R[v],mid+1,r,ql,qr);
}
struct edge{int u,v;bool operator <(const edge &t) const{return u<t.u;    }
}e[maxn];
int n,m,hash[maxn];
signed main(){//freopen("lx.in","r",stdin);sf("%d%d",&n,&m);for(int i=1;i<n;++i){sf("%d%d",&e[i].u,&e[i].v);if(e[i].u>e[i].v)swap(e[i].u,e[i].v);}sort(e+1,e+n);for(int i=1;i<n;++i)hash[i]=e[i].u;T[0]=build(1,n);for(int i=1;i<n;++i){T[i]=change(T[i-1],1,n,e[i].v);}int l,r;while(m--){sf("%d%d",&l,&r);int l1=lower_bound(hash+1,hash+n,l)-hash-1;pf("%d\n",query(T[0],T[l1],1,n,1,n)+query(T[l1],T[n-1],1,n,r+1,n)-(n-(r-l+1))+1);}return 0;
}

【2018提高测试】飘雪圣域 【连通性+可持久化线段树 / 离线+权值线段树】 (详解)相关推荐

  1. Zju2112 Dynamic Rankings(树状数组套可持久化权值线段树)

    Zju2112 Dynamic Rankings description solution code description 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须 ...

  2. [网络安全提高篇] 一一九.恶意软件动态分析经典沙箱Cape的安装和基础用法详解

    终于忙完初稿,开心地写一篇博客. "网络安全提高班"新的100篇文章即将开启,包括Web渗透.内网渗透.靶场搭建.CVE复现.攻击溯源.实战及CTF总结,它将更加聚焦,更加深入,也 ...

  3. java测试类 main方法_Java使用agent实现main方法之前的实例详解

    Java使用agent实现main方法之前的实例详解 创建Agent项目 PreMainExecutor 类,在main方法之前执行此方法 public class PreMainExecutor { ...

  4. [网络安全提高篇] 一〇六.SQL注入之手工注入和SQLMAP入门案例详解

    当您阅读到该篇文章时,作者已经将"网络安全自学篇"设置成了收费专栏,首先说声抱歉.感谢这一年来大家的阅读和陪伴,这100篇安全文章记录了自己从菜鸡到菜鸟的成长史,该部分知识也花了很 ...

  5. 爱普生690k打印针测试软件_办公室打印机什么牌子好 办公室打印机怎么选购【详解】...

    我们在日常工作中是少不了使用 打印机 的,打印机能够帮组我们节省时间,有效提高工作效率.在市场上打印机种类有很多,那么 办公室打印机哪种好 呢?办公室打印机选购的时候该怎样去挑选呢?今天就为大家介绍 ...

  6. 【渗透测试】密码暴力破解工具——九头蛇(hydra)使用详解及实战

    目录 九头蛇hydra 使用方法 案例分析 暴破ssh登录密码 环境介绍 开始爆破 破解成功 测试登录 各种协议破解汇总 FTP协议破解 http协议破解 https协议破解 路由器破解 http-p ...

  7. 广联达2018模板算量步骤_老师傅带你学造价,广联达GTJ2018图文详解,小白也能学会的软件...

    在GTJ2018问世之前,土建造价人员有三个软件是必会的,一个是GGJ主打钢筋算量,一个是GCL主打土建算量,还有一个是GBQ主要是套定额用来计价的软件. 那时候如果计算一个工程的工程量,首先要用GG ...

  8. iphonex 测试电池软件,iPhoneX电池容量多大 iPhoneX电池性能评测【详解】

    iPhoneX电池容量是多少?相信小伙伴们一定很好奇,下面小编为大家带来了iPhoneX电池性能耗电情况评测详细介绍,感兴趣的小伙伴赶紧跟着小编一起来看看吧. iPhone X上线后,很多小伙伴们在关 ...

  9. 【提高测试】飘雪圣域(树状数组)

    描述 ​ IcePrincess_1968 和 IcePrince_1968 长大了,他们开始协助国王 IceKing_1968 管理国内事物. ​ IcePrincess_1968 和 IcePri ...

  10. MAT之PLS:利用PLS(两个主成分的贡献率就可达100%)提高测试集辛烷值含量预测准确度并《测试集辛烷值含量预测结果对比》

    MAT之PLS:利用PLS(两个主成分的贡献率就可达100%)提高测试集辛烷值含量预测准确度并<测试集辛烷值含量预测结果对比> 目录 输出结果 实现代码 输出结果 实现代码 load sp ...

最新文章

  1. boost::io::quoted用法的测试程序
  2. 视觉基础与开发思路-第九节形态学操作
  3. html转pdf后 框会消失,html或其它文件转pdf弹出打开保存框
  4. arraychangekeycase php,浅谈php数组array_change_key_case() 函数和array_chunk()函数
  5. 天津大学学硕和专硕的区别_21考研考生,学硕与专硕的区别你必须知道,选错或后悔读研...
  6. 如何通过C#开发一个媒体播放器(中)
  7. Regional Proposal的输出到底是什么
  8. cdn对动态网站有作用吗_cdn是什么和作用有些
  9. 如何在Mac上快速签署PDF
  10. linux vi字体大小,设置VIM字体大小
  11. 工程师原创:人人都看得懂的电磁场理论
  12. 奔图3305_奔图 Pantum P3305DN 驱动
  13. 移动平均法,加权平均法
  14. html如何书页样式,CSS案例:实现书页任意折角效果
  15. 飞凌基于i.MX6Q-C核心板实现膀胱超声测容仪的通信显示方案
  16. 网站封装APP详细打包教程
  17. java程序员推荐记笔记_推荐一款开源免费的笔记软件,也是程序员的好帮手
  18. 格力手机2 官方固件_ROG游戏手机2备货不足,官方发表致歉信
  19. java中两种异常类型_Java中的三种异常类型
  20. C语言转义字符,注释

热门文章

  1. 小学班级计算机社团活动章程,小学腾飞电脑小社团活动章程.doc
  2. 当Linux配置zh_CN.UTF-8 ,中文还是显示乱码解决办法
  3. Kibana关联ES查询数据
  4. 第一周挑战2:税后工资计算器
  5. linux压缩解压命令
  6. 时钟、背景音乐、背景图片
  7. python名词_使用Python词性标记提取名词(循环)
  8. win10拨号上网开启热点
  9. JavaSE学习笔记-0225-ArrayList+案例
  10. linux中文件夹删不掉,Linux无法删除文件夹 Device or resource busy