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

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. Centos 安装libreoffice 生成office 报错信息见内容

    个人博客:https://blog.sharedata.info/ 错误信息:/opt/libreoffice5.2/program/soffice.bin: error while loading ...

  2. u-boot下载模式LCD显示图片修改方法(基于TQ2440)

    1.明确液晶型号,这点非常重要,我手头的液晶是天嵌4.3寸屏,让人很郁闷的是液晶背面竟然写着LCD 3.5,这一点让我在上面浪费了好几个小时: 2.根据液晶型号,修改u-boot1.1.6--> ...

  3. Spring 和 filter

    标题是 spring和filter,但是这里却是说的spring MVC 项目中需要用到filter,filter中需要用到spring实例化的bean,于是为了简化就形成spring和filter了 ...

  4. 使用Zxing.net实现asp.net mvc二维码功能

    新建一个html辅助类 public static class HtmlHelperExtensions { , , ) { var barcodeWriter = new BarcodeWriter ...

  5. 牛人blog汇总

    1.天一思维: https://blog.csdn.net/tszty1997?t=1

  6. 九度OJ 1342:寻找最长合法括号序列II (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:898 解决:366 题目描述: 假如给你一个由'('和')'组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给 ...

  7. 关于Android app的launcher图标更换后,仍然显示默认的ic_launcher图标的解决方法

    <h1>概要</h1>在做手机适配的时候,遇到了一个很奇怪的问题,在1080x720的手机可以正常显示替换的ic_launcher.png图标,但是在1920x1080的手机上 ...

  8. Python读属性文件

    # coding:utf-8 class Properties: def __init__(self, file_name): self.file_name = file_name self.prop ...

  9. Symfony 安装FOUSerBundle

    第一按照官网安装 : https://symfony.com/doc/current/bundles/FOSUserBundle/index.html#main 可能版本无法安装 : $ compos ...

  10. mysql用户和权限管理(Linux系统下)

    在mysql自带的库中有一个mysql,这个库包含了太多的东西,其中有一张表user,这张表存储了所有的用户信息. mysql> select user,host,password from u ...