bzoj5315/luoguP4517 [SDOI2018]战略游戏(圆方树,虚树)

bzoj Luogu

题目描述略(太长了)

题解时间

切掉一个点,连通性变化。

上圆方树。

$ \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]战略游戏(圆方树,虚树)的更多相关文章

  1. [SDOI2018]战略游戏 圆方树,树链剖分

    [SDOI2018]战略游戏 这题是道路相遇(题解)的升级版,询问的两个点变成了\(S\)个点. LG传送门 还是先建出圆方树,考虑对于询问的\(S\)个点,答案就是圆方树上能包含这些点的最小连通块中 ...

  2. BZOJ5329:[SDOI2018]战略游戏(圆方树,虚树)

    Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战略游戏的地图由n个城市以及m条连接这些城市的双向道路构成,并且从任意一个城市出发总能沿着 ...

  3. Luogu4606 SDOI2018 战略游戏 圆方树、虚树、链并

    传送门 弱化版 考虑到去掉一个点使得存在两个点不连通的形式类似割点,不难想到建立圆方树.那么在圆方树上对于给出的关键点建立虚树之后,我们需要求的就是虚树路径上所有圆点的数量减去关键点的数量. 因为没有 ...

  4. BZOJ.5329.[SDOI2018]战略游戏(圆方树 虚树)

    题目链接 显然先建圆方树,方点权值为0圆点权值为1,两点间的答案就是路径权值和减去起点终点. 对于询问,显然可以建虚树.但是只需要计算两关键点间路径权值,所以不需要建出虚树.统计DFS序相邻的两关键点 ...

  5. Luogu P4606 [SDOI2018] 战略游戏 圆方树 虚树

    https://www.luogu.org/problemnew/show/P4606 把原来的图的点双联通分量缩点(每个双联通分量建一个点,每个割点再建一个点)(用符合逻辑的方式)建一棵树(我最开始 ...

  6. 【SDOI2018】战略游戏(同时普及虚树)

    先看一道虚树普及题:给你一棵 $n$ 个点的树,$m$ 次询问,每次询问给你 $k$ 个关键点,求把这些点都连起来的路径并的最短长度.$1\le n,m\le 100000,\space 1\le \ ...

  7. [SDOI2018]战略游戏(圆方树+虚树)

    喜闻乐见的圆方树+虚树 图上不好做,先建出圆方树. 然后答案就是没被选到的且至少有两条边可以走到被选中的点的圆点的数量. 语文不好,但结论画画图即可得出. 然后套路建出虚树. 发现在虚树上DP可以得出 ...

  8. 仙人掌 && 圆方树 && 虚树 总结

    仙人掌 && 圆方树 && 虚树 总结 Part1 仙人掌 定义 仙人掌是满足以下两个限制的图: 图完全联通. 不存在一条边处在两个环中. 其中第二个限制让仙人掌的题做 ...

  9. [bzoj5329] P4606 [SDOI2018]战略游戏

    P4606 [SDOI2018]战略游戏:广义圆方树 其实会了圆方树就不难,达不到黑,最多算个紫 那个转换到圆方树上以后的处理方法,画画图就能看出来,所以做图论题一定要多画图,并把图画清楚点啊!! 但 ...

随机推荐

  1. Solution -「NOI 2020」「洛谷 P6776」超现实树

    \(\mathcal{Description}\)   Link.   对于非空二叉树 \(T\),定义 \(\operatorname{grow}(T)\) 为所有能通过若干次"替换 \( ...

  2. Solution -「LOCAL」模板

    \(\mathcal{Description}\)   OurOJ.   给定一棵 \(n\) 个结点树,\(1\) 为根,每个 \(u\) 结点有容量 \(k_u\).\(m\) 次操作,每次操作 ...

  3. [LeetCode]7. 整数反转(Java)

    原题地址: reverse-integer 题目描述: 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果. 如果反转后整数超过 32 位的有符号整数的范围 [−2^31,  ...

  4. [LeetCode]3.无重复字符的最长子串(Java)

    原题地址: longest-substring-without-repeating-characters/submissions 题目描述: 示例 1: 输入: s = "pwwkew&qu ...

  5. SpringBoot整合Redis案例缓存首页数据、缓解数据库压力

    一.硬编码方式 1.场景 由于首页数据变化不是很频繁,而且首页访问量相对较大,所以我们有必要把首页数据缓存到redis中,减少数据库压力和提高访问速度. 2.RedisTemplate Jedis是R ...

  6. operator的解释

    operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名. 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算 ...

  7. hacker模拟环境

    https://geekprank.com/hacker/

  8. [题解]Codeforces Round #254 (Div. 2) B - DZY Loves Chemistry

    链接:http://codeforces.com/contest/445/problem/B 描述:n种药品,m个反应关系,按照一定顺序放进试管中.如果当前放入的药品与试管中的药品要反应,危险系数变为 ...

  9. Go1.14版本vendor和gomodule冲突问题

    Go1.14版本vendor和gomodule冲突问题 go1.14版本使用go mod tidy构建依赖时会出现问题(见链接), 这个问题在go1.12版本是不会出现的. https://githu ...

  10. 换行符号(\r\n)的历史

    文章来源:https://cloud.tencent.com/developer/article/1730918 \r\n与\n是有区别的. 如果要通用的则是\r\n,因为有些编辑器它不认\n &qu ...