热身训练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$是一种很神奇的数字,你想要的,它都可以变! 问这个序列的最长上升子序列长度为多少? 分析: 我们将除了 ...
随机推荐
- C#简单工厂模式学习
刚学习设计模式,还不是太了解,感觉只有多数据库的情况下才用的到,待学习 首先创建空白解决方案,依次创建类库Model,IDAL,SqlServerDAL,DALFactory,BLL,DBUtilit ...
- 【曹工杂谈】Maven IOC容器的下半场:Google Guice
Maven容器的下半场:Guice 前言 在前面的文章里,Maven底层容器Plexus Container的前世今生,一代芳华终落幕,我们提到,在Plexus Container退任后,取而代之的底 ...
- 了解HTTP基本知识板块
一.HTTP 协议概述 HTTP协议采用了请求/响座模型. 客户端向服务器发送-个请求,请求头包含请求的方法.URT..协议版本.以以 及包含请求修饰符.客户信息和内容的类似于MIME的消息结构. 服 ...
- 从零开始学习SQL SERVER(1)--- 了解SQL
SQL是什么 SQL (发音为 sequal [' sikwəl ' ]) SQL指 Structured Query Language 结构化查询语言,是用于访问和处理数据库的标准的计算机语言. ...
- SQLSERVER存储过程基础
SQLSERVER存储过程基础 1.声明变量 DECLARE @F001 SMALLINT, (三元素,声明declare+变量名+类型) @F002 INTEGER, @F003 V ...
- 聊聊ReentrantLock基于AQS的公平锁和非公平锁的实现区别
ReentrantLock锁的实现是基于AQS实现的,所以先简单说下AQS: AQS是AbstractQueuedSynchronizer缩写,顾名思义:抽象的队列同步器,它是JUC里面许多同步工具类 ...
- php超时报错: Maximum execution time of 300 seconds exceeded
php.ini里max_execution_time = 30,原因是这个脚本执行时间太小了,增加一些,或者改成0不限制 可以增加代码: set_time_limit(0);
- ✔PHP文件包含漏洞全面总结
我的另一篇博客总结的不够全面,但依然有借鉴价值:https://www.cnblogs.com/Zeker62/p/15192610.html 目录 文件包含的定义 文件包含漏洞常见函数 文件包含漏洞 ...
- Shell条件判断(6)- 多重条件判断
多重条件判断 多个条件判断一起使用 测试选项 作用 判断1 -a 判断2 逻辑与,判断1和判断2都成立,最终的结果才为真 判断1 -o 判断2 逻辑或,判断1和判断2有一个成立,最终的结果就为真 ! ...
- pycharm 操作excel
一.安装openpyxl Python中,往excel写入数据通常使用openpyxl库.也可以使用pandas库.这里讲解如何通过openpyxl库操作excel.pip install openp ...