【LOJ】#2562. 「SDOI2018」战略游戏
题解
圆方树建好之后点是原来的两倍,而st表求lca也要开到点的两倍,所以是四倍
我并没有开小,然而= =,我的预处理log2,写成了200000,而不是400000
我是不是折翼啊= =
很可写,我们对于割点考虑一下圆方树,发现答案就是圆方树上两个圆点之间经过了多少圆点,把圆点拿出来然后建立虚树,统计一下这个点和父亲之间有多少个圆点,建立虚树之后统计一下加入的lca是不是圆点,如果是的话也要把答案+1
代码
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstring>
//#define ivorysi
#define pb push_back
#define MAXN 200005
#define eps 1e-12
#define space putchar(' ')
#define enter putchar('\n')
#define mp make_pair
#define fi first
#define se second
#define mo 974711
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 - '0' + c;
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) putchar('-'),x = -x;
while(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int T;
int N,M,Q,sumE,head[MAXN],Cnt;
struct node {
int to,next;
}E[MAXN * 4];
void add(int u,int v) {
E[++sumE].to = v;
E[sumE].next = head[u];
head[u] = sumE;
}
int dfn[MAXN],low[MAXN],idx,sta[MAXN],top,st[MAXN * 2][20],dep[MAXN],cir[MAXN],len[MAXN * 2];
vector<int> ver[MAXN];
int MK[MAXN],C,ans;
void Tarjan(int u,int fa) {
dfn[u] = low[u] = ++idx;
sta[++top] = u;
for(int i = head[u] ; i ; i = E[i].next) {
int v = E[i].to;
if(dfn[v] && v != fa) {
low[u] = min(dfn[v],low[u]);
}
else if(v != fa){
Tarjan(v,u);
if(low[v] >= dfn[u]) {
++Cnt;
ver[u].pb(Cnt);
while(1) {
int x = sta[top--];
ver[Cnt].pb(x);
if(x == v) break;
}
}
else low[u] = min(low[u],low[v]);
}
}
}
int min_dep(int a,int b) {
return dep[a] < dep[b] ? a : b;
}
int lca(int u,int v) {
u = dfn[u],v = dfn[v];
if(u > v) swap(u,v);
int l = len[v - u + 1];
return min_dep(st[u][l],st[v - (1 << l) + 1][l]);
}
void dfs(int u,int fa) {
dfn[u] = ++idx;
st[idx][0] = u;
cir[u] = cir[fa];
dep[u] = dep[fa] + 1;
if(u <= N) ++cir[u];
for(auto k : ver[u]) {
dfs(k,u);
st[++idx][0] = u;
}
}
bool cmp(int a,int b) {
return dfn[a] < dfn[b];
}
int calc(int a,int b) {
if(dep[a] < dep[b]) swap(a,b);
return cir[a] - cir[b] - (a <= N);
}
void Build_aux() {
sort(MK + 1,MK + C + 1,cmp);
top = 0;
for(int i = 1 ; i <= C ; ++i) {
if(!top) sta[++top] = MK[i];
else {
int l = lca(sta[top],MK[i]);
while(top && dep[sta[top]] > dep[l]) {
if(top == 1 || dep[sta[top - 1]] <= dep[l]) {
ans += calc(sta[top],l);
}
else {
ans += calc(sta[top],sta[top - 1]);
}
--top;
}
if(sta[top] != l) {
if(l <= N) ++ans;
sta[++top] = l;
}
sta[++top] = MK[i];
}
}
for(int i = top ; i >= 2 ; --i) ans += calc(sta[i],sta[i - 1]);
}
void Init() {
read(N);read(M);
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
memset(head,0,sizeof(head));
idx = 0;top = 0;sumE = 0;
for(int i = 1 ; i <= 2 * N ; ++i) ver[i].clear();
Cnt = N;
int u,v;
for(int i = 1 ; i <= M ; ++i) {
read(u);read(v);add(u,v);add(v,u);
}
Tarjan(1,0);
idx = 0;
dfs(1,0);
for(int j = 1 ; j <= 19 ; ++j) {
for(int i = 1 ; i <= idx; ++i) {
if(i + (1 << j) - 1 > idx) break;
st[i][j] = min_dep(st[i][j - 1],st[i + (1 << j - 1)][j - 1]);
}
}
}
void Solve() {
read(Q);
while(Q--) {
read(C);
for(int i = 1 ; i <= C ; ++i) read(MK[i]);
ans = 0;
Build_aux();
printf("%d\n",ans);
}
}
int main() {
#ifdef ivorysi
freopen("01.in","r",stdin);
#endif
for(int i = 2 ; i <= 400000 ; ++i) len[i] = len[i / 2] + 1;
read(T);
while(T--) {
Init();
Solve();
}
return 0;
}
【LOJ】#2562. 「SDOI2018」战略游戏的更多相关文章
- @loj - 2004@ 「SDOI2017」硬币游戏
目录 @description@ @solution@ @accepted code@ @details@ @description@ 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数 ...
- loj#2565. 「SDOI2018」旧试题(反演 三元环计数)
题意 题目链接 Sol 神仙反演题.在洛谷上疯狂被卡常 Orz shadowice #include<bits/stdc++.h> #define Pair pair<int, in ...
- LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)
题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...
- Loj #3056. 「HNOI2019」多边形
Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...
- Loj #3044. 「ZJOI2019」Minimax 搜索
Loj #3044. 「ZJOI2019」Minimax 搜索 题目描述 九条可怜是一个喜欢玩游戏的女孩子.为了增强自己的游戏水平,她想要用理论的武器武装自己.这道题和著名的 Minimax 搜索有关 ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
随机推荐
- Hadoop生态圈-Hive函数
Hadoop生态圈-Hive函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Redis学习四:解析配置文件 redis.conf
一.它在哪 地址: 思考:为什么要将它拷贝出来单独执行? 二.Units单位 1 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit 2 对大小写不敏感 三.INCLUDES包 ...
- Python入门系列教程(三)列表和元组
增 1.insert A = ['] A.insert(0,0) print A 2.append A = ['] A.append(7) print A 3.extend A = ['] B = [ ...
- 基于受限玻尔兹曼机(RBM)的协同过滤
受限玻尔兹曼机是一种生成式随机神经网络(generative stochastic neural network), 详细介绍可见我的博文<受限玻尔兹曼机(RBM)简介>, 本文主要介绍R ...
- Session详解、ASP.NET核心知识(8)
介绍一下Session 1.作用 Cookie是存在客户端,Session是存在服务器端,目的是一样的:保存和当前客户端相关的数据(当前网站的任何一个页面都能取到Session). 在本篇博文的姊妹篇 ...
- Linux基础-vim编辑器
使用vi编辑器编辑文件/1.txt进入编辑模式写入内容“hello world” 命令行模式输入i,进入编辑模式 写入HelloWorld,按ESC进入命令行模式,输入:进入扩展模式输入wq保存退出 ...
- asp.net 调用post方法并获取返回值
/// <summary> /// http协议 post数据 接受返回结果 /// </summary> /// <param ...
- SQL SERVER 视图优化经历
系统中要求对HIS数据进行效益统计,因为HIS数据是需要第三方提供接口导入的,不清楚数据量大小,所以视图以业务为主未对其做性能优化(当时编写试图时就是几条简单的测试数据) 如今在项目接口实施完成后查看 ...
- spfa+差分约束系统(D - POJ - 1201 && E - POJ - 1364&&G - POJ - 1)+建边的注意事项+超级源点的建立
题目链接:https://cn.vjudge.net/contest/276233#problem/D 具体大意: 给出n个闭合的整数区间[ai,bi]和n个整数c1,-,cn. 编写一个程序: 从标 ...
- 2016.5.15——leetcode:Number of 1 Bits ,
leetcode:Number of 1 Bits 代码均测试通过! 1.Number of 1 Bits 本题收获: 1.Hamming weight:即二进制中1的个数 2.n &= (n ...