bzoj5315/luoguP4517 [SDOI2018]战略游戏(圆方树,虚树)
bzoj5315/luoguP4517 [SDOI2018]战略游戏(圆方树,虚树)
题目描述略(太长了)
题解时间
切掉一个点,连通性变化。
上圆方树。
$ \sum |S| $ 。
上虚树。
就是将圆方树构建好后每次询问一个连通块的圆点个数。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
template<typename TP>inline void read(TP &tar)
{
TP ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){ret=ret*10+ch-'0';ch=getchar();}
tar=ret*f;
}
namespace RKK
{
const int N=200011;
int log[N];
struct sumireko{int to,ne;}e[N<<1];int he[N],ecnt;
void addline(int f,int t){e[++ecnt].to=t;e[ecnt].ne=he[f];he[f]=ecnt;}
int TAT,n,nn,m,qaq;
int lst[N],ln,lk;
int sta[N],stp;
int dfn[N],low[N],da;
vector<int>to[N];
void tj(int x,int f)
{
dfn[x]=low[x]=++da,sta[++stp]=x;
for(int i=he[x],t=e[i].to;i;i=e[i].ne,t=e[i].to)
{
if(!dfn[t])
{
tj(t,x),low[x]=min(low[x],low[t]);
if(low[t]>=dfn[x])
{
nn++;int px=0;
while(px!=t)
{
px=sta[stp--];
to[nn].push_back(px);
to[px].push_back(nn);
}
px=x;
to[nn].push_back(px);
to[px].push_back(nn);
}
}else if(t!=f) low[x]=min(low[x],dfn[t]);
}
}
int fa[N][20],sz[N],sp[N],ep[N],dep[N];
void dfs(int x)
{
sp[x]=++da;
for(int k=1;k<=log[dep[x]];k++) fa[x][k]=fa[fa[x][k-1]][k-1];
sz[x]+=(x<=n);int t;
vector<int>::iterator it;
for(it=to[x].begin();it!=to[x].end();it++)
{
t=*it;if(t==fa[x][0]) continue;
sz[t]=sz[x],fa[t][0]=x,dep[t]=dep[x]+1,dfs(t);
}
ep[x]=da;
}
int lca(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
for(int k=log[dep[x]-dep[y]];k>=0;k--)
if((1<<k)<=dep[x]-dep[y]) x=fa[x][k];
for(int k=log[dep[x]];k>=0;k--)
if(fa[x][k]!=fa[y][k]) x=fa[x][k],y=fa[y][k];
return x==y?x:fa[x][0];
}
bool cmp(const int &a,const int &b){return sp[a]<sp[b];}
int ans;
void add(int anc,int x){ans+=sz[x]-sz[anc];}
void solve()
{
stp=0,ans=0;
read(lk),ln=lk;
for(int i=1;i<=ln;i++) read(lst[i]);
sort(lst+1,lst+1+ln,cmp);
for(int i=1,lim=ln;i<lim;i++) lst[++ln]=lca(lst[i],lst[i+1]);
sort(lst+1,lst+1+ln,cmp),ln=unique(lst+1,lst+1+ln)-lst-1;
ans+=lst[1]<=n;
for(int i=1;i<=ln;i++)
{
while(stp&&ep[sta[stp]]<sp[lst[i]]) stp--;
if(stp) add(sta[stp],lst[i]);sta[++stp]=lst[i];
}
ans-=lk;
printf("%d\n",ans);
}
void memclr()
{
memset(he,0,sizeof(he)),ecnt=0;
memset(dfn,0,sizeof(dfn)),memset(low,0,sizeof(low));
memset(fa,0,sizeof(fa));
for(int i=1;i<=nn;i++) to[i].clear();
}
int Iris()
{
for(int i=2;i<=200000;i++) log[i]=log[i>>1]+1;
read(TAT);while(TAT--)
{
read(n),read(m),nn=n;for(int i=1,x,y;i<=m;i++) read(x),read(y),addline(x,y),addline(y,x);
tj(1,0);
da=0,dfs(1);
read(qaq);
while(qaq--)
solve();
memclr();
}
return 0;
}
}
int main(){return RKK::Iris();}
bzoj5315/luoguP4517 [SDOI2018]战略游戏(圆方树,虚树)的更多相关文章
- [SDOI2018]战略游戏 圆方树,树链剖分
[SDOI2018]战略游戏 这题是道路相遇(题解)的升级版,询问的两个点变成了\(S\)个点. LG传送门 还是先建出圆方树,考虑对于询问的\(S\)个点,答案就是圆方树上能包含这些点的最小连通块中 ...
- BZOJ5329:[SDOI2018]战略游戏(圆方树,虚树)
Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任意一个城市出发总能沿着 ...
- Luogu4606 SDOI2018 战略游戏 圆方树、虚树、链并
传送门 弱化版 考虑到去掉一个点使得存在两个点不连通的形式类似割点,不难想到建立圆方树.那么在圆方树上对于给出的关键点建立虚树之后,我们需要求的就是虚树路径上所有圆点的数量减去关键点的数量. 因为没有 ...
- BZOJ.5329.[SDOI2018]战略游戏(圆方树 虚树)
题目链接 显然先建圆方树,方点权值为0圆点权值为1,两点间的答案就是路径权值和减去起点终点. 对于询问,显然可以建虚树.但是只需要计算两关键点间路径权值,所以不需要建出虚树.统计DFS序相邻的两关键点 ...
- Luogu P4606 [SDOI2018] 战略游戏 圆方树 虚树
https://www.luogu.org/problemnew/show/P4606 把原来的图的点双联通分量缩点(每个双联通分量建一个点,每个割点再建一个点)(用符合逻辑的方式)建一棵树(我最开始 ...
- 【SDOI2018】战略游戏(同时普及虚树)
先看一道虚树普及题:给你一棵 $n$ 个点的树,$m$ 次询问,每次询问给你 $k$ 个关键点,求把这些点都连起来的路径并的最短长度.$1\le n,m\le 100000,\space 1\le \ ...
- [SDOI2018]战略游戏(圆方树+虚树)
喜闻乐见的圆方树+虚树 图上不好做,先建出圆方树. 然后答案就是没被选到的且至少有两条边可以走到被选中的点的圆点的数量. 语文不好,但结论画画图即可得出. 然后套路建出虚树. 发现在虚树上DP可以得出 ...
- 仙人掌 && 圆方树 && 虚树 总结
仙人掌 && 圆方树 && 虚树 总结 Part1 仙人掌 定义 仙人掌是满足以下两个限制的图: 图完全联通. 不存在一条边处在两个环中. 其中第二个限制让仙人掌的题做 ...
- [bzoj5329] P4606 [SDOI2018]战略游戏
P4606 [SDOI2018]战略游戏:广义圆方树 其实会了圆方树就不难,达不到黑,最多算个紫 那个转换到圆方树上以后的处理方法,画画图就能看出来,所以做图论题一定要多画图,并把图画清楚点啊!! 但 ...
随机推荐
- Winds10 安装JDK8.0教程
首先下载一个jdk,可以通过这个链接下载:https://pan.baidu.com/s/1aP6SdL8UQK_C2GvALLb6Wg也可以去官网下载:https://www.oracle.com/ ...
- operator 之旅(一)
环境准备 依赖版本 MAC M1 kubernetes: 1.18.3 go: 1.17.6 kubebuilder:3.1.0 知识必备 Kubernetes的Group.Version.Resou ...
- 巧用 CSS 把图片马赛克化
一.image-rendering 介绍 CSS 中有一个有趣的特性叫 image-rendering,它可以通过算法来更好地显示被缩放的图片. 假设我们有一张尺寸较小的二维码截图(下方左),将其放大 ...
- 昨天面试被问到的 缓存淘汰算法FIFO、LRU、LFU及Java实现
缓存淘汰算法 在高并发.高性能的质量要求不断提高时,我们首先会想到的就是利用缓存予以应对. 第一次请求时把计算好的结果存放在缓存中,下次遇到同样的请求时,把之前保存在缓存中的数据直接拿来使用. 但是, ...
- schtasks
schtasks create 创建新的计划任务. 语法 schtasks /create /tn TaskName /tr TaskRun /sc schedule [/mo modifier ...
- 商业智能干货分享:BI的4大核心技术
如今,我们似乎生活在一个被数据包围的时代,各方面都离不开数据.这种现象在企业的经营活动中尤为明显.在这样的市场环境下,商业智能应运而生,但你真的明白商业智能吗?以下小编将会从商业智能概念和商业智能四 ...
- 打印报表工具,web报表工具对比
1.jasperreport报表 有批量报表打印功能,但一般需要通过专门的编程实现批量报表打印:一些较简单的分片式打印能通过主子表实现:不能自动适应纸张大小:不支持分栏打印:不支持一纸多页打印:不支 ...
- 📚 选择排序和插入排序区别-DS笔记
选择排序法 A[i...n)未排序,A[0...i)已排序 A[i...n]中最小值要放到A[i]的位置 复杂度 \(O(n^2)\) 第一层循环n次 第二层循环:i=0,n次:i=1,n-1次... ...
- 使用lrzsz在windows、Linux之间互传文件
使用xshell自带的传输太慢 使用lrzsz进行文件互传: xshell远程linux 安装工具:yum install -y lrzsz,检查是否安装成功:rpm -qa |grep lrzsz ...
- 华山论剑之 PostgreSQL sequence (一)
前言 本文是 sequence 系列继三大数据库 sequence 之华山论剑 (Oracle PostgreSQL MySQL sequence 十年经验总结) 之后的第二篇,主要分享一下 Post ...