[CSP-S模拟测试]:飘雪圣域(莫队)
题目描述
$IcePrincess\text{_}1968$和$IcePrince\text{_}1968$长大了,他们开始协助国王$IceKing\text{_}1968$管理国内事物。
$IcePrincess\text{_}1968$和$IcePrince\text{_}1968$住在一个宁静悠远的王国:$IceKingdom$——飘雪圣域。飘雪圣域有$n$个城镇,编号$1,2,3...n$。有些城镇之间有道路,且满足任意两点之间有且仅有一条路径。飘雪圣域风景优美,但气候并不是太好。根据$IcePrince\text{_}1968$的气候探测仪,将来会发生$q$场暴风雪。每场暴风雪可以用两个整数$l_i,r_i$刻画,表示这场暴风雪之后,只有编号属于$[l_i,r_i]$的城市没有受到暴风雪的影响。
在暴风雪的影响下迅速确定王国的农业生产方案是非常重要的事情。$IceKing\text{_}1968$认为,一个农业生产地域应该是一个极大连通块,满足每个节点都没有被暴风雪影响。这里极大连通块的定义是:不存在一个不属于该点集的未被暴风雪影响的点与该连通块连通。
$IcePrincess\text{_}1968$要负责算出每次暴风雪后,王国能拥有多少个农业生产地域。注意这里每次暴风雪是独立的,即每次暴风雪过后,直到每个城镇重新焕发生机,下一次暴风雪才会到来。
正如上文所述,$IcePrincess\text{_}1968$擅长文学但不擅长计算机,于是请你帮忙。
输入格式
输入文件名为$icekingdom.in$。
第一行包含两个正整数$n,q$,表示$IceKingdom$的城镇个数和暴风雪次数。
第$2$至第$n$行,每行两个正整数$x,y$,表示城镇$x$和城镇$y$之间有一条道路。
第$n+1$至第$n+q$行,每行两个正整数$l_i,r_i$,描述一场暴风雪,含义如题面所述。
输出格式
输出文件名$icekingdom.out$。
输出文件共有$q$行,第$i$行表示在第$i$场暴风雪之后农业生产地域的个数。
样例
样例输入:
4 3
1 2
2 3
2 4
1 2
1 3
3 4
样例输出:
1
1
2
数据范围与提示
样例解释:
第一次询问,只有$(1,2)$一个连通块。
第二次询问,只有$(1,2,3)$一个连通块。
第三次询问,有$3$和$4$两个连通块。
数据范围:
对于$30\%$的数据:$n\leqslant 100,q\leqslant 100$;
对于$50\%$的数据:$n\leqslant 2,000,q\leqslant 2,000$;
对于$100\%$的数据:$n\leqslant 200,000,q\leqslant 200,000$,对于所有的暴风雪,$l_i\leqslant r_i$。
题解
官方正解中的两种做法都是用的数据结构,然而我用的是莫队……
加一个点它对答案的贡献是$1-$与它连接的没有受到暴风雪影响的点,$1$是因为它自己可以作为一个新的联通块,减去没有收到暴风雪影响的点是因为它会合并这些联通块;删点同理。
显然$200,000$的数据范围莫队一定要有$\Theta(1)$修改的方法。
不妨以加的操作为例,为做到$\Theta(1)$修改,就需要找到方法快速求出与它连接的没有受到暴风雪影响的点。
先预处理出来所有点的父亲,并设$num[x]$为点$x$的儿子中没有受到暴风雪影响的点的个数,加入一个点的同时将它父亲的$num+1$即可,注意统计答案时不要忘了父亲。
删点同理。
时间复杂度:$\Theta(n\sqrt{n})$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
struct node{int nxt,to;}e[500000];
struct rec{int l,r,pos,id;}q[200001];
int head[200001],cnt;
int n,m;
int ans[200001],l,r,now;
int num[200001],fa[200001];
bool vis[200001];
void add(int x,int y)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
head[x]=cnt;
}
bool cmp(rec a,rec b){return (a.pos)^(b.pos)?a.l<b.l:(((a.pos)&1)?a.r<b.r:a.r>b.r);}
void add(int x)
{
vis[x]=1;
now++;
now-=num[x];
num[fa[x]]++;
if(vis[fa[x]])now--;
}
void del(int x)
{
vis[x]=0;
now--;
now+=num[x];
num[fa[x]]--;
if(vis[fa[x]])now++;
}
void dfs(int x)
{
for(int i=head[x];i;i=e[i].nxt)
if(!fa[e[i].to]&&e[i].to>1){fa[e[i].to]=x;dfs(e[i].to);}
}
int main()
{
scanf("%d%d",&n,&m);
int t=sqrt(n);
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
dfs(1);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&q[i].l,&q[i].r);
q[i].pos=(q[i].l-1)/t+1;
q[i].id=i;
}
sort(q+1,q+m+1,cmp);
l=r=1;add(1);
for(int i=1;i<=m;i++)
{
while(l>q[i].l)add(--l);
while(r<q[i].r)add(++r);
while(l<q[i].l)del(l++);
while(r>q[i].r)del(r--);
ans[q[i].id]=now;
}
for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
return 0;
}
rp++
[CSP-S模拟测试]:飘雪圣域(莫队)的更多相关文章
- NOI模拟 颜色 - 带修莫队/树套树
题意: 一个颜色序列,\(a_1, a_2, ...a_i\)表示第i个的颜色,给出每种颜色的美丽度\(w_i\),定义一段颜色的美丽值为该段颜色的美丽值之和(重复的只计算一次),每次都会修改某个位置 ...
- csps模拟测试74梦境,玩具,飘雪圣域题解
题面:https://www.cnblogs.com/Juve/articles/11679226.html 梦境: 其实还是挺水的,排序错了过不了样例,打了个二分图匹配就跑了 #include< ...
- 「10.15」梦境(贪心)·玩具(神仙DP)·飘雪圣域(主席树\树状数组\莫队)
A. 梦境 没啥可说的原题.... 贪心题的常见套路我们坐标以左端点为第一关键字,右端点为第二关键字 然后对于每个转折点,我们现在将梦境中左端点比他小的区间放进$multiset$里 然后找最近的右端 ...
- [CSP-S模拟测试]:ants(回滚莫队)
题目描述 然而贪玩的$dirty$又开始了他的第三个游戏. $dirty$抓来了$n$只蚂蚁,并且赋予每只蚂蚁不同的编号,编号从$1$到$n$.最开始,它们按某个顺序排成一列.现在$dirty$想要进 ...
- [CSP-S模拟测试]:sum(数学+莫队)
题目传送门(内部题63) 输入格式 第一行有一个整数$id$,表示测试点编号.第一行有一个整数$q$,表示询问组数.然后有$q$行,每行有两个整数$n_i,m_i$. 输出格式 一共有$q$行,每行一 ...
- [CSP-S模拟测试]:蔬菜(二维莫队)
题目描述 小$C$在家中开垦了一块菜地,可以抽象成一个$r\times c$大小的矩形区域,菜地的每个位置都种着一种蔬菜.秋天到了,小$C$家的菜地丰收了. 小$C$拟定了$q$种采摘蔬菜的计划,计划 ...
- 联赛模拟测试12 C. sum 莫队+组合数
题目描述 分析 \(80\) 分的暴力都打出来了还是没有想到莫队 首先对于 \(s[n][m]\) 我们可以很快地由它推到 \(s[n][m+1]\) 和 \(s[n][m-1]\) 即 \(s[n] ...
- csp-s模拟测试50(9.22)「施工(单调栈优化DP)」·「蔬菜(二维莫队???)」·「联盟(树上直径)」
改了两天,终于将T1,T3毒瘤题改完了... T1 施工(单调栈优化DP) 考场上只想到了n*hmaxn*hmaxn的DP,用线段树优化一下变成n*hmaxn*log但显然不是正解 正解是很**的单调 ...
- 【10.11校内测试】【优先队列(反悔贪心)】【莫队】【stl的应用??离线处理+二分】
上次做过类似的题,原来这道还要简单些?? 上次那道题是每天可以同时买进卖出,所以用两个优先队列,一个存买进,一个存卖出(供反悔的队列). 这道题实际上用一个就够了???但是不好理解!! 所以我还是用了 ...
随机推荐
- [19/06/04-星期二] HTML基础_实体(转义字符)、图片标签(img)、元标签(meta)、语法规范、内联框架(iframe)、超链接
一.实体(转义字符) 在HTML中,一些诸如<.> 就是普通的小于号和大于号不能直接使用,因为浏览可能会把它当成一个标签去解析,所以需要一些特殊字符去表示这些特殊字符, 这些字符我们称他们 ...
- CentOS7 内核模块管理
1.查看所有模块:lsmod 2.查看指定模块的详细信息:modinfo 模块名 3.动态加载模块:modprobe 模块名 4.动态卸载模块:modprobe -r 模块名 5.开机自动加载模块:假 ...
- npm学习(一)之安装、更新以及管理npm版本
安装npm 安装前须知: npm是在Node中编写的,因此需要安装Node.js才能使用npm.可以通过Node.js网站安装npm,或者安装节点版本管理器NVM. 如果只是想开始探索npm,使用No ...
- maven联通网络下中央仓库不能访问的解决办法
最近刚开始学习maven工具,下载解压完毕,环境变量配置完毕,运行如下命令尝试快速构建一个maven项目: mvn archetype:generate 结果就有问题: [INFO] Scanning ...
- js验证小数或者整数
利用正则表达式校验是否为小数或者整数,废话不多说直接上demo(此正则表达式无法校验负数和数字为00开头的数字). PS:(如果有不对之处,请批评指教) <!DOCTYPE html> & ...
- ab压测
安装:yum install -y httpd-tools 验证:ab -V ab -help:-n requests 要执行请求总数,默认会执行一个请求 -c concurrency 一次执行多个请 ...
- Java实现文件上传-按钮弹出上传页面
转自: https://blessht.iteye.com/blog/1405057 最近自己在做一个小系统玩的时候涉及到了文件的上传,于是在网上找到Java上传文件的方案,最后确定使用common- ...
- 30. Substring with Concatenation of All Words (JAVA)
You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...
- 拼接HTML代码在UIWebVIew中显示
其原理:通过网络请求获得相关的信息,再通过手机端进行拼HTML,然后在WebView进行展示,此处还对文章中的图片增加点击效果,可以保存到相册中:文章的样式已经存在项目中,直接去调用: 1:首先了解两 ...
- 来到园子的第two天!!!!!
经过这几天的打字练习 从练习的第一天到今天(应该是第三天吧) 从67到133字/分钟,我练的是英文文章测试,总的来说挺不容易 ,感觉后几天提升就不好提了呀 不说废话了 简单说一下今天的收获吧 都是 ...