点此进入

题意:

一棵树,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的更多相关文章

  1. 死亡之ping(Ping of Death)

    最简单的基于IP的攻击可能要数著名的死亡之ping,这种攻击主要是由于单个包的长度超过了IP协议规范所规定的包长度.产生这样的包很容易,事实上,许多操作系统都提供了称为ping的网络工具.在为Wind ...

  2. Windows防火墙开启ping,禁ping的配置

    当我通过本机Ping另一台在同一局域网内(即在同一网段)的计算机时,发现,如果防火墙开启的话,无论如何也ping不通.一旦关闭防火墙就可以ping通了.这是为什么呢?究竟该怎么设置呢? 原因是这样的, ...

  3. Windows防火墙开启ping,禁ping的配置方法

    Windows 7,Win 2008 R2,2012 R2: Windows防火墙 --> 高级设置 --> 入站规则 --> 在列表里找到“文件和打印机共享(回显请求 - ICMP ...

  4. 无法上外网, ping网关ping不通的解决——arp命令

    转自:http://jingyan.baidu.com/article/3c48dd34873909e10be35894.html 转自:http://man.linuxde.net/arp 用来管理 ...

  5. Linux Centos7使用ping命令ping不通网络的解决方案

    本解决方案不配置dns,都是ping的IP地址,所以如果想ping域名,则加上DNS项的配置后自行尝试吧 我使用的虚拟机系统信息: Linux:Centos7 Network:虚拟机设置的桥接模式(自 ...

  6. 数位dp & 热身训练7

    数位dp 数位dp是一种计数用的dp,一般就是要统计一段区间$[L,R]$内,满足一定条件的数的个数,或者各个数位的个数. 数位dp使得暴力枚举变为满足一定状态的记忆化,更加优秀. 数位dp常常会考虑 ...

  7. 热身训练4 Article

    Article 在这个学期即将结束时,DRD开始写他的最后一篇文章. DRD使用著名的Macrohard的软件World来写他的文章. 不幸的是,这个软件相当不稳定,它总是崩溃. DRD需要在他的文章 ...

  8. 热身训练4 Eighty seven

    Eighty seven 简要题意: n个卡片,其中第i个卡片的数值为$a[i]$.一共q次询问,每次询问将删去其中3个卡片(可能删除若干相同的卡片)后,问能否选出10个卡片,数值之和等于87. n≤ ...

  9. 热身训练2 The All-purpose Zero

    The All-purpose Zero 简要题意:  长度为n的数组,每个数字为S[i],$0$是一种很神奇的数字,你想要的,它都可以变! 问这个序列的最长上升子序列长度为多少? 分析: 我们将除了 ...

随机推荐

  1. Git - 命令行 常用

    一.合并其他分支的commit(A分支中的commit合并至B分支) 切换到A分支,查询commit历史命令行 : $ git log 复制要合并的commit id (如:663802dfb121e ...

  2. scrum项目冲刺_day04总结

    摘要:今日完成任务. 1.图像识别已优化 2.语音识别正在进行 3.搜索功能 正在进行 总任务: 一.appUI页面(已完成) 二.首页功能: 1.图像识别功能(已完成) 2.语音识别功能 3.垃圾搜 ...

  3. 解决sofaboot项目右键入口方法没有run sofa application

    选中入口方法名,右键出现run sofa application

  4. STM32L0系列EEPROM中结构体的读取

    在STM32L0中操作EEPROM本来参考了上篇操作FLASH的方法,多多少少都有些问题.我觉得可能是结构体在转换成其他变量的时候出了问题. 比如下面这段代码,在Windows上可以正常运行(使用g+ ...

  5. TP5缩放图片加水印

    // 给图片增加水印文字 试验缩放图片,放大图片,加水印,加文字功能 public function doCreateImage1($data,$path) { $basePath = ROOT_PA ...

  6. Dapr + .NET Core实战(五)Actor

    什么是Actor模式 Actors 为最低级别的"计算单元" 以上解释来自官方文档,看起来"晦涩难懂".大白话就是说Actors模式是一段需要单线程执行的代码块 ...

  7. python之jsonpath

    json 官方文档:http://docs.python.org/library/json.html JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使 ...

  8. WPF进阶技巧和实战02-布局

    窗体 无边框 窗体无边框(最大化及标题位置)WindowStyle="None" 窗体透明 AllowsTransparency="True",必须设置窗体无边 ...

  9. 02-token

    随着互联网技术的发展,cookie+session形式的用户认真逐渐不适应需求的扩展.在当前分布式微服务广泛流行的场景下,显然这种cookie+session无法满足,因为各个服务之间无法相互获取se ...

  10. github注册教程最新版(十年程序员保姆级教程)

    您可以在墨抒颖的网站体验本文章的纯净版 准备 拥有一个可以接受信息的邮箱即可 开始 点击github官网github step1.进入注册页面 点击Sign Up进入注册流程 step2.输入邮箱 这 ...