【SDOI2018】战略游戏【圆方树】【虚树】

题意:给一张 nnnmmm 边的连通无向图,qqq 次询问,每次给出一个点集 SSS ,求有多少个不在 SSS 中的点满足删除后 SSS 中存在两个点不连通。

n≤105,m≤2×105,∑∣S∣≤2×105n\leq 10^5,m\leq 2\times 10^5,\sum |S|\leq 2\times 10^5n105,m2×105,S2×105

显然是虚树

题目相当于求 SSS 的割点数量,想到圆方树

建出圆方树后,对于 SSS 中的一对点,它们路径上任意一个圆点都满足条件。答案相当于求两两路径上的圆点的并集。因为不能取 SSS 中的点,所以要减去 ∣S∣|S|S

套到虚树上,发现就是虚树覆盖的圆点个数。即对于每个点 uuu ,设 faufa_ufau 为其虚树上的父亲,sumusum_usumu 为原树上根到 uuu 的圆点个数。那么答案为 ∑(sumu−sumfau)\sum(sum_u-sum_{fa_u})(sumusumfau)

注意要特判 lca⁡(S)\operatorname{lca}(S)lca(S)

复杂度 O(n+m+∑∣S∣log⁡∣S∣)O(n+m+\sum|S|\log |S|)O(n+m+SlogS)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <vector>
#include <algorithm>
#define MAXN 400005
#define MAXM 800005
using namespace std;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
struct edge{int u,v;}e[MAXM];
int head[MAXN],nxt[MAXM],cnt;
inline void addnode(int u,int v)
{e[++cnt]=(edge){u,v};nxt[cnt]=head[u];head[u]=cnt;
}
int n,m;
int dfn[MAXN],low[MAXN],tim;
int stk[MAXN],tp,vis[MAXN],bcc[MAXN],vcnt;
vector<int> rtt[MAXN];
void tarjan(int u)
{dfn[u]=low[u]=++tim;for (int i=head[u];i;i=nxt[i]){if (!vis[i>>1]&&!bcc[i>>1]) vis[(stk[++tp]=i)>>1]=1;if (!dfn[e[i].v]){tarjan(e[i].v);low[u]=min(low[u],low[e[i].v]);if (dfn[u]==low[e[i].v]){rtt[u].push_back(bcc[i>>1]=++vcnt);rtt[bcc[i>>1]].push_back(u);while (vis[i>>1]){int t=stk[tp--];vis[t>>1]=0;rtt[bcc[t>>1]=vcnt].push_back(e[t].v);}}}else low[u]=min(low[u],dfn[e[i].v]);}
}
int sum[MAXN],dep[MAXN],fa[MAXN][20];
void dfs(int u)
{dfn[u]=++tim;for (int i=1;i<20;i++) fa[u][i]=fa[fa[u][i-1]][i-1];for (int i=0;i<(int)rtt[u].size();i++)if (!dep[rtt[u][i]]){dep[rtt[u][i]]=dep[u]+1;sum[rtt[u][i]]=sum[u]+(rtt[u][i]<=n);fa[rtt[u][i]][0]=u;dfs(rtt[u][i]);	}
}
inline int lca(int x,int y)
{if (dep[x]<dep[y]) swap(x,y);int t=dep[x]-dep[y];for (int i=0;(1<<i)<=t;i++) if (t&(1<<i)) x=fa[x][i];if (x==y) return x;for (int i=19;i>=0;i--) if (fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];return fa[x][0];
}
int lis[MAXM],len;
inline bool cmp(const int& x,const int& y){return dfn[x]<dfn[y];}
inline void solve()
{sort(lis+1,lis+len+1,cmp);int res=len;for (int i=1;i<res;i++) lis[++len]=lca(lis[i],lis[i+1]);sort(lis+1,lis+len+1,cmp);len=unique(lis+1,lis+len+1)-lis-1;int ans=0;tp=0;for (int i=1;i<=len;i++){while (tp&&lca(stk[tp],lis[i])!=stk[tp]) --tp;ans+=(tp? sum[lis[i]]-sum[stk[tp]]:(lis[i]<=n));stk[++tp]=lis[i];}printf("%d\n",ans-res);
}
int main()
{for (int T=read();T;T--){n=read(),m=read();cnt=1;memset(head,0,sizeof(head));memset(nxt,0,sizeof(nxt));memset(bcc,0,sizeof(bcc));memset(dep,0,sizeof(dep));memset(sum,0,sizeof(sum));memset(dfn,0,sizeof(dfn));for (int i=1;i<=vcnt;i++) rtt[i].clear();tim=tp=0;for (int i=1;i<=m;i++){int u,v;u=read(),v=read();addnode(u,v),addnode(v,u);}vcnt=n;tarjan(1);for (int i=n+1;i<=vcnt;i++) {sort(rtt[i].begin(),rtt[i].end());rtt[i].erase(unique(rtt[i].begin(),rtt[i].end()),rtt[i].end());}dep[1]=sum[1]=1,tim=0;dfs(1);for (int q=read();q;q--){len=read();for (int i=1;i<=len;i++) lis[i]=read();solve();}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314929.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round #598 (Div. 3) F. Equalizing Two Strings 思维 + 逆序对

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两个长度为nnn的串a,ba,ba,b&#xff0c;每次可以同时翻转a,ba,ba,b中任意一段长度为L(1≤L≤n)L(1\le L\le n)L(1≤L≤n)的子串&#xff0c;问能否通过若干次操作使两个串相同。 思路&#xff1a; 首…

腾讯发布 Tencent SCF Toolkit VS Code 插件,轻松开发无服务器云函数

在之前的文章中&#xff0c;我们提到了亚马逊、谷歌、IBM 等大厂都上了 Visual Studio Code 的船。阿里巴巴也在近日发布了 Aliyun Serverless VS Code 插件。近期&#xff0c;腾讯也上了 VS Code 的船&#xff0c;发布了基于 VS Code 的 Tencent SCF Toolkit 插件&#xff0c;…

Codeforces Round #726 (Div. 2) D. Deleting Divisors 博弈

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个数nnn&#xff0c;有两个人博弈&#xff0c;每次可以将nnn减去一个nnn的因子&#xff0c;这个因子不能为111或nnn。当不能操作的人输掉游戏。问你先手赢还是后手赢。 思路&#xff1a; 这个题多写…

【POI2007】OSI-Axes of Symmetry【计算几何】【manacher】

题意&#xff1a;给一个 nnn 个点的多边形&#xff0c;求对称轴个数。 n≤105n\leq 10^5n≤105 显然对称轴一定在顶点或边的中点上。 但你 n2n^2n2 枚举完全没有一点能过的样子。 冷静分析&#xff0c;发现有 “中点”&#xff0c;“对称轴”&#xff0c;很自然个鬼地想到了…

端到端测试实践:Jenkins集成TestCafe

上一篇《对产品质量的一点思考》中说到自动化测试的重要性&#xff0c;本文简单介绍下怎样在实际项目中实现端到端测试的自动化&#xff0c;在这里我们使用的端到端测试工具是TestCafe。环境Jenkisn&#xff1a;2.183TestCafe&#xff1a;1.3.0为什么采用TestCafe做自动化测试要…

Codeforces Round #727 (Div. 2) F. Strange Array 线段树 + 区间合并 + 排序优化

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为nnn的数组&#xff0c;对每个位置iii求一个最大价值&#xff0c;价值计算方式如下&#xff1a;选择一个包含iii的[l,r][l,r][l,r]&#xff0c;让后将其拿出来排序&#xff0c;之后价值就是当前…

【CF487E】Tourists【圆方树】【树链剖分】【multiset】

题意&#xff1a;给一张 nnn 点 mmm 边的连通无向图&#xff0c;点帯权&#xff0c;qqq 次操作&#xff1a; 修改一个点的权值。询问两点间所有简单路的最小权值的最小值。 n,m,q≤105n,m,q\leq 10^5n,m,q≤105 显然建出圆方树然后询问路径最小值。多半要树链剖分了。 对于方…

再见Jenkins,从Gitlab代码提交到k8s服务持续交付只需七毛三

Gitlab runner 快速搭建CICD pipeline背景日常开发中&#xff0c;相信大家已经做了很多的自动化运维环境&#xff0c;用的最多的想必就是利用Jenkins实现代码提交到自动化测试再到自动化打包&#xff0c;部署全流水线Jenkins在devops担任了很重要的角色&#xff0c;但是另一方面…

Codeforces Round #726 (Div. 2) F. Figure Fixing 二分图 + 思维

传送门 文章目录题意&#xff1a;思路题意&#xff1a; 给你一张nnn个点mmm条边的图&#xff0c;每个点都有一个当前值aia_iai​&#xff0c;目标值bib_ibi​&#xff0c;每次可以选择一条边(i,j)(i,j)(i,j)&#xff0c;将ai,aja_i,a_jai​,aj​都加上任意一个数&#xff0c;问…

【NOI2020】命运【树形dp】【线段树合并】

题意&#xff1a;给一棵 nnn 个点的树&#xff0c;每条边需要染成黑白两种颜色中的一种。给出 mmm 个条件&#xff0c;每个条件给出 u,vu,vu,v&#xff0c;其中 uuu 是 vvv 的祖先&#xff0c;要求 uuu 到 vvv 的链上至少一条黑边。求方案数 模 998244353998244353998244353。 …

.NET Core 3.0之深入源码理解Kestrel的集成与应用(二)

前言前一篇文章主要介绍了.NET Core继承Kestrel的目的、运行方式以及相关的使用&#xff0c;接下来将进一步从源码角度探讨.NET Core 3.0中关于Kestrel的其他内容&#xff0c;该部分内容&#xff0c;我们无需掌握&#xff0c;依然可以用好Kestrel&#xff0c;本文只是将一些内部…

Codeforces Round #726 (Div. 2) E2. Erase and Extend (Hard Version) 贪心

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为nnn的串sss&#xff0c;你有两个操作可以使用&#xff1a; (1)(1)(1)从sss的结尾删除一个字母。 (2)sss(2)sss(2)sss。 让你通过若干次操作使其变成一个长度为kkk的串&#xff0c;且其字典序最…

【BZOJ3451】Normal【期望线性性】【点分治】【NTT卷积】

题意&#xff1a;随机分治中心点分治的期望操作次数 n≤3104n\leq 3\times 10^4n≤3104 即求点分树的 siz 之和的期望 即祖孙关系对数期望 考虑一有序点对 (u,v)(u,v)(u,v)&#xff0c;uuu 在点分树上是 vvv 祖先当且仅当 uuu 是 u∼vu\sim vu∼v 路径上第一个被选为分治中心…

译 | 使用Roslyn分析器高效编写更好的代码

原文&#xff1a;Mika Dumont翻译&#xff1a;汪宇杰Roslyn 是 .NET 编译器平台&#xff0c;即使在运行代码之前&#xff0c;它也能帮助您捕获 Bug。例如内置于 Visual Studio 中的Roslyn 拼写检查分析器。假设您正在创建一个静态方法&#xff0c;并将 static 单词拼错为 statc…

Codeforces Round #724 (Div. 2) F. Omkar and Akmar 组合数学 + 博弈

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先我们先来研究一下这个游戏&#xff0c;手画几个会惊奇的发现&#xff0c;后手这个b怎么怎么画都赢啊&#xff1f;&#xff1f;&#xff1f;对&#xff0c;没错&#xff0c;就是怎么画都…

Visual Studio 支持 Java?谣言止于智者

在去年的某一段时间内&#xff0c;我们经常会看到标题类似为“宇宙第一 IDE Visual Studio 支持 Java 了&#xff01;”的文章。当时&#xff0c;韩老师看到这篇文章也是一脸懵逼。公司里做 Java 的开发童鞋们就坐在韩老师附近&#xff08;嗯&#xff0c;不超过五米的距离&…

【SCOI2014】方伯伯的商场之旅【数位dp】【单峰函数】

题意&#xff1a;给定 l,r,kl,r,kl,r,k &#xff0c;对于一个 kkk 进制数&#xff0c;将数码看成这个位置的石子个数&#xff0c;每将一个石子移动 111 的距离需要 111 的代价。求 [l,r][l,r][l,r] 中的所有数在 kkk 进制下将石子集中在一个位置的最小代价之和。 l≤r≤1015,k≤…

Codeforces Round #597 (Div. 2) D. Shichikuji and Power Grid 最小生成树 + 虚拟点

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 看错题导致误入歧途&#xff0c;如果能早点看见翻译也不至于一天多也没想出来。 求联通的最小代价&#xff0c;自然的想到了能不能建边跑最小生成树。 对于两点之间比较好弄&#xff0c;直…

【NOI2007】货币兑换【任意坐标斜率优化】【CDQ分治】

题意&#xff1a;有 A&#xff0c;B 两种金券&#xff0c;给出 nnn 天内分别的单位价格和可以购买的数量的比例。开始有 SSS 元&#xff0c;求 nnn 天后最多能有多少元。 提示&#xff1a;每次操作一定全买全卖 n≤105n\leq 10^5n≤105 设 fnf_nfn​ 表示第 nnn 天结束后手上…

小白开学Asp.Net Core 《八》

小白开学Asp.Net Core 《八》— — .Net Core 数据保护组件1、背景我在搞&#xff08;https://github.com/AjuPrince/Aju.Carefree&#xff09;这个开源项目的时候&#xff0c;想做一些防止恶意攻击的小功能&#xff08;如果 我通过页面 /Dome/GetData?id123&#xff0c;那是不…