有一个圆方树,每次给出一个点集,询问虚树上圆点数量-询问点数量

sol:题意读懂就很简单了...可以建虚树dp

也可以考虑每一条链对答案的贡献,最后要注意单独计算虚树根对答案的贡献

#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC target("avx")
#include<bits/stdc++.h>
#define LL long long
using namespace std;
#define gtchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++)
static char buf[],*p1=buf,*p2=buf;
inline int read()
{
int x = ,f = ;char ch = gtchar();
for(;!isdigit(ch);ch = gtchar())if(ch == '-')f = -f;
for(;isdigit(ch);ch = gtchar())x = * x + ch - '';
return x * f;
}
int n,m;
const int maxn = 2e5 + ;
vector<int> G[maxn],Tree[maxn];
int dfn[maxn],low[maxn],_tim,stk[maxn],top,vis[maxn];
int tot;
inline void write(int x,char opt = )
{
int t=,len=; while(t<=x)t*=,len++;
while(len--)t/=,putchar(x/t+),x%=t;
if(opt)putchar(opt);
return;
}
inline void Tarjan(int x,int fa)
{
dfn[x] = low[x] = ++_tim;stk[++top] = x;vis[x] = ;
for(auto targ : G[x])
{
if(targ == fa)continue;
if(!vis[targ])
{
Tarjan(targ,x);
low[x] = min(low[x],low[targ]);
if(low[targ] >= dfn[x])
{
tot++;
Tree[x].push_back(tot);
do
{
Tree[tot].push_back(stk[top]);
}while(targ != stk[top--]);
}
}
else low[x] = min(low[x],dfn[targ]);
}
}
int s[maxn];
int fa[maxn],dep[maxn],size[maxn],bl[maxn],dis[maxn];
inline void dfs1(int x)
{
size[x] = ;
for(auto targ : Tree[x])
{
if(targ == fa[x])continue;
fa[targ] = x;
dis[targ] = dis[x] + (targ <= n);
dep[targ] = dep[x] + ;
dfs1(targ);
size[x] += size[targ];
}
}
inline void dfs2(int x,int col)
{
int k = ;
bl[x] = col;dfn[x] = ++_tim;
for(auto targ : Tree[x])
if(dep[targ] > dep[x] && size[targ] > size[k])k = targ;
if(!k){low[x] = _tim;return;}
dfs2(k,col);
for(auto targ : Tree[x])
if(dep[targ] > dep[x] && targ != k)dfs2(targ,targ);
low[x] = _tim;
}
inline int lca(int x,int y)
{
while(bl[x] != bl[y])
{
if(dep[bl[x]] < dep[bl[y]])swap(x,y);
x = fa[bl[x]];
}
return dep[x] < dep[y] ? x : y;
}
int q[maxn];
int main()
{
int T = read();
while(T--)
{
_tim = ;
tot = n = read();m = read();
for(int i=;i<maxn;i++)G[i].clear(),Tree[i].clear();
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(vis,,sizeof(vis));
for(int i=;i<=m;i++)
{
int u = read(),v = read();
G[u].push_back(v);G[v].push_back(u);
}
for(int i=;i<=n;i++)if(!dfn[i])Tarjan(i,);
int ques = read();_tim = ;dis[] = ;dfs1(),dfs2(,);
while(ques--)
{
int len = read();int k = len,top = ,ans = ;
for(int i=;i<=len;i++)s[i] = read();
sort(s + ,s + len + ,[](int u,int v){return dfn[u] < dfn[v];});
for(int i=;i<k;i++)s[++len] = lca(s[i],s[i + ]);
sort(s + ,s + len + ,[](int u,int v){return dfn[u] < dfn[v];});
len = unique(s + ,s + len + ) - (s + );
if(s[] <= n)ans = ;
else ans = ;
for(int i=;i<=len;i++)
{
while(top && low[q[top]] < dfn[s[i]])top--;
if(top)ans += (dis[s[i]] - dis[q[top]]);
q[++top] = s[i];
}
write(ans - k,'\n');
}
}
}

bzoj5329 战略游戏的更多相关文章

  1. 【BZOJ5329】【SDOI2018】战略游戏(圆方树,虚树)

    [BZOJ5329][SDOI2018]战略游戏(圆方树,虚树) 题面 BZOJ 洛谷 Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战 ...

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

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

  3. [BZOJ5329][SDOI2018]战略游戏

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

  4. BZOJ5329: [SDOI2018]战略游戏——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5329 https://www.luogu.org/problemnew/show/P4606 省选 ...

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

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

  6. D3D游戏编程系列(三):自己动手编写即时战略游戏之寻路

    说起即时战略游戏,不得不提的一个问题是如何把一个物体从一个位置移动到另一个位置,当然,我说的不是瞬移,而是一个移动的过程,那么在这个移动的过程中我们如何来规划路线呢,这就不得不提到寻路了. 我所了解到 ...

  7. 【BZOJ3924】幻想乡战略游戏(动态点分治)

    [BZOJ3924]幻想乡战略游戏(动态点分治) 题面 权限题...(穷死我了) 洛谷 题解 考虑不修改 发现一个贪心的做法 假设当前放在当前位置 如果它有一个子树的兵的总数大于总数的一半 那么,放到 ...

  8. 『战略游戏 最大利润 树形DP』

    通过两道简单的例题,我们来重新认识树形DP. 战略游戏(luoguP1026) Description Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题.他要 ...

  9. LOJ2135 「ZJOI2015」幻想乡战略游戏

    题意 题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来,更别说和 ...

随机推荐

  1. POJ 1845-Sumdiv【经典数学题目---求因子和】

    转载请注明出处:http://blog.csdn.net/lyy289065406/article/details/6648539 優YoU  http://user.qzone.qq.com/289 ...

  2. nginx服务器的内核调优

    TCP公有类 net.core.somaxconn = 262144 net.core.netdev_max_backlog = 262144 net.ipv4.ip_local_port_range ...

  3. [note]最近公共祖先

    最近公共祖先(LCA)https://www.luogu.org/problemnew/show/P3379 #define RG register #include<cstdio> #i ...

  4. android 半透明弹窗

    <style name="edit_AlertDialog_style" parent="@android:style/Theme.Dialog"> ...

  5. 安装了包,pycharm却提示找不到包

    这段时间,我爬虫爬到了一个论坛的数据,有个分析需要知道他的字符编码,因此使用到了 chardet,我在终端很顺利的安装了这个,但是在pycharm里使用的时候老是提示有错误,向下面这样: 其实这个是因 ...

  6. python多版本管理

    1.查看系统中的安装了那些python版本 2.查看系统中的alternatives命令是否安装 3.使用alternatives --install 接管python -install 选项使用了多 ...

  7. 【SHARE】WEB前端学习资料

    参考资料:https://github.com/karlhorky/learn-to-program 学习网站:http://www.codecademy.com/learn https://www. ...

  8. (转载)C #开源框架

    Json.NET http://json.codeplex.com/ Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过Li ...

  9. Python:笔记(3)——面向对象编程

    Python:笔记(3)——面向对象编程 类和面向对象编程 1.类的创建 说明:和Java不同的是,我们不需要显示的说明类的字段属性,并且可以在后面动态的添加. 2.构造函数 构造函数的功能毋庸置疑, ...

  10. 使用nginx进行负载均衡

    nginx主要用于1:请求分流 2:负载均衡.用在大型系统(集群)上,在单机上体现不出优势.  本实例在windows环境下进行.  一.安装nginx  1.下载nginx1.8.0版 2.解压至1 ...