热身训练1 ping ping ping
题意:
一棵树,n+1 个节点,以0号节点为根,给出端点(a,b),节点a到节点b的路径上,至少有一个点是“坏掉的”,求“坏掉的点”最少
分析:
Step1:贪心
每次给出的两个端点,我们可以得到他俩的lca,画一下图我们即可知道,lca深度越深,下面的点就越需要单独选一下,并且选了之后,对lca在上面的点影响不大
同时,我们每次选一段路径上的点时,肯定选深度较低的,这样最优
Step2:线段树标记选过的点
我们选过的节点,那么它的子树我们都可以不用选了
用DFS序+线段树,标记。
easy~~~
#include<bits/stdc++.h>
using namespace std;
#define re register int
#define LL long long
const int N=30005, M=50005;
int tt, las[N], nt[M], ed[M];
inline void add(const int x, const int y)
{
ed[++tt]=y; nt[tt]=las[x]; las[x]=tt;
}
int dep[N], in[N], ou[N], fa[N][25], total;
void DFS(const int x, const int FA)
{
dep[x]=dep[FA]+1;
in[x]=++total;
fa[x][0]=FA;
for(re i=1;i<=20;++i) fa[x][i] = fa[fa[x][i-1]][i-1];
for(re i=las[x];i;i=nt[i])
{
int v=ed[i];
if(v != FA)
{
DFS(v, x);
}
}
ou[x]=total;
}
inline int lca(int x,int y)
{
if(dep[x] < dep[y]) swap(x, y);
int del = (dep[x] - dep[y]);
for(re i=0;i<=20;++i) if(del&(1<<i)) x = fa[x][i];
if(x == y) return x;
for(re i=20;i >= 0;--i)
if(fa[x][i] != fa[y][i])
x = fa[x][i], y = fa[y][i];
return fa[x][0];
}
int n, m, ans;
struct rdin{int a, b, ca;}ask[50005];
bool cmp(const rdin&x, const rdin&y)
{
return dep[x.ca] > dep[y.ca];
}
struct segment{int a, b, v;}tr[N<<3];
inline void build(const int p, const int x, const int y)
{
tr[p]=(segment){x, y, 0};
if(x != y)
{
int mid=(x+y)>>1;
build(p<<1, x, mid);
build(p<<1|1, mid+1, y);
}
}
void modi(const int p, const int x, const int y)
{
if(x <= tr[p].a && tr[p].b <= y)
{
tr[p].v = 1;
return;
}
int mid=(tr[p].a+tr[p].b)>>1;
if(x <= mid) modi(p<<1, x, y);
if(y > mid) modi(p<<1|1, x, y); tr[p].v = (tr[p<<1].v && tr[p<<1|1].v);
}
int query(const int p, const int x)
{
if(tr[p].v == 1)
{
return 1;
}
if(tr[p].a == x && x == tr[p].b)
{
return tr[p].v;
}
int mid=(tr[p].a+tr[p].b)>>1;
if(x <= mid) return query(p<<1, x);
else return query(p<<1|1, x);
}
signed main()
{
while(scanf("%d",&n) != EOF)
{
ans = tt = total = 0;
memset(las, 0, sizeof(las)); for(re i=1;i<=n;++i)
{
int x, y;
scanf("%d%d",&x,&y);
x++; y++;
add(x, y);
add(y, x);
}
n++;
DFS(1, 0);
scanf("%d",&m);
for(re i=1;i<=m;++i)
{
scanf("%d%d",&ask[i].a,&ask[i].b);
ask[i].a++; ask[i].b++;
ask[i].ca = lca(ask[i].a, ask[i].b);
}
sort(ask+1, ask+1+m, cmp);
build(1, 1, n+5);
for(re i=1;i<=m;++i)
{
int a=query(1, in[ask[i].a]);
int b=query(1, in[ask[i].b]);
if(a==0 && b==0)
{
modi(1, in[ask[i].ca], ou[ask[i].ca]);
ans++;
}
}
printf("%d\n", ans);
}
}
热身训练1 ping ping ping的更多相关文章
- 死亡之ping(Ping of Death)
最简单的基于IP的攻击可能要数著名的死亡之ping,这种攻击主要是由于单个包的长度超过了IP协议规范所规定的包长度.产生这样的包很容易,事实上,许多操作系统都提供了称为ping的网络工具.在为Wind ...
- Windows防火墙开启ping,禁ping的配置
当我通过本机Ping另一台在同一局域网内(即在同一网段)的计算机时,发现,如果防火墙开启的话,无论如何也ping不通.一旦关闭防火墙就可以ping通了.这是为什么呢?究竟该怎么设置呢? 原因是这样的, ...
- Windows防火墙开启ping,禁ping的配置方法
Windows 7,Win 2008 R2,2012 R2: Windows防火墙 --> 高级设置 --> 入站规则 --> 在列表里找到“文件和打印机共享(回显请求 - ICMP ...
- 无法上外网, ping网关ping不通的解决——arp命令
转自:http://jingyan.baidu.com/article/3c48dd34873909e10be35894.html 转自:http://man.linuxde.net/arp 用来管理 ...
- Linux Centos7使用ping命令ping不通网络的解决方案
本解决方案不配置dns,都是ping的IP地址,所以如果想ping域名,则加上DNS项的配置后自行尝试吧 我使用的虚拟机系统信息: Linux:Centos7 Network:虚拟机设置的桥接模式(自 ...
- 数位dp & 热身训练7
数位dp 数位dp是一种计数用的dp,一般就是要统计一段区间$[L,R]$内,满足一定条件的数的个数,或者各个数位的个数. 数位dp使得暴力枚举变为满足一定状态的记忆化,更加优秀. 数位dp常常会考虑 ...
- 热身训练4 Article
Article 在这个学期即将结束时,DRD开始写他的最后一篇文章. DRD使用著名的Macrohard的软件World来写他的文章. 不幸的是,这个软件相当不稳定,它总是崩溃. DRD需要在他的文章 ...
- 热身训练4 Eighty seven
Eighty seven 简要题意: n个卡片,其中第i个卡片的数值为$a[i]$.一共q次询问,每次询问将删去其中3个卡片(可能删除若干相同的卡片)后,问能否选出10个卡片,数值之和等于87. n≤ ...
- 热身训练2 The All-purpose Zero
The All-purpose Zero 简要题意: 长度为n的数组,每个数字为S[i],$0$是一种很神奇的数字,你想要的,它都可以变! 问这个序列的最长上升子序列长度为多少? 分析: 我们将除了 ...
随机推荐
- 尚硅谷Java高级笔记
尚硅谷Java高级笔记 idea的使用: 一些小区别: 其他细节参考idea配置pdf 多线程: 基本概念: 多线程的优点: 何时需要多线程: 线程的创建和使用: 创建多线程的第一种方式: /** * ...
- 【PHP数据结构】图的应用:最短路径
上篇文章的最小生成树有没有意犹未尽的感觉呀?不知道大家掌握得怎么样,是不是搞清楚了普里姆和克鲁斯卡尔这两种算法的原理了呢?面试的时候如果你写不出,至少得说出个大概来吧,当然,如果你是要考研的学生,那就 ...
- Shell系列(5)- 输出输入重定向及wc命令
输出重定向: 在Linux当中,0代表输入:1代表正确输出:2代表错误输出 类型 符号 作用 正确输出重定向 命令 > 文件 以覆盖得方式,把命令得正确输出,输出到指定文件或设备当中 命令 &g ...
- 剑指offer计划25(模拟中等)---java
1.1.题目1 剑指 Offer 29. 顺时针打印矩阵 1.2.解法 常规开头,先判断特殊情况,然后创建四个变量存放矩阵四边的长度限制. 创建res数组存放结果. 循坏开始,遍历完一行或者一列,就将 ...
- flask_sqlalchemy 查询结果转dict 终极解决方案
之前为了学习Python,试着拿Flask作框架搞小网站,感觉还不错,基本就抛弃了PHP.前段时间做了一个微信小程序,想着yii框架拿来写几十个小接口是不是浪费了,就继续用flask写api了,哪想到 ...
- P3706-[SDOI2017]硬币游戏【高斯消元,字符串hash】
正题 题目链接:https://www.luogu.com.cn/problem/P3706 题目大意 给出 \(n\) 个长度为 \(m\) 的 \(H/T\) 串. 开始一个空序列,每次随机在后面 ...
- P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】
正题 题目链接:https://www.luogu.com.cn/problem/P4457 题目大意 开始一个人最大生命值为\(n\),剩余\(hp\)点生命,然后每个时刻如果生命值没有满那么有\( ...
- Visual Studio 6.0 在 Windows 10 下崩溃的一种解决方法
Visual Studio 6.0 下载地址: https://winworldpc.com/product/microsoft-visual-stu/60 安装步骤: https://www.cod ...
- Matrix Analysis and Application
Chap 1: Linear Equations and Matrix Linear equations Gaussian elimination Pivot; Triangularize; Back ...
- 1-基本建表sql语句
基本的建表语句的总结 --建表语法 CREATE TABLE 表名( --约束可以没有 列名1 数据类型 [约束], 列名2 数据类型 [约束], ......, [约束], ..... ); --该 ...