description

装饰者坐在树荫下听着长者讲述以前的故事:

大神 yk 非常喜欢树,便钦点班里的 n 个小蒟蒻站在一棵 n 个点以 1 为根的树上,并且每个点上恰好有 1 个小蒟蒻。

大神 yk 非常喜欢 fake,尤其是 fake 比他弱的人。根据可靠消息,大神 yk 拟定了m 个假人计划,每个假人计划形如 fake 树上从点 u 到点 v 的简单路径上站的小蒟蒻。但大神 yk 不喜欢拐角,所以假人计划选择的简单路径的端点满足 v 在 1 到 u 的简单路径上或者 u 在 1 到 v 的简单路径上。

每个小蒟蒻毕竟是人,忍耐是有限度的,站在 i 号点的小蒟蒻的忍耐值为 ci。当这个小蒟蒻被 fake 的次数超过 ci 后,这个小蒟蒻会非常地愤怒。

大神 yk 可以从 m 个假人计划中选出任意多个执行,但是大神 yk 不想让任意一个小蒟蒻感到愤怒,因为这样会破坏友谊。

装饰者听到这里,很好奇大神 yk 最多能实施多少假人计划。但是这个问题太简单了,装饰者秒掉了它。于是它被当成模拟赛的签到题扔你做。


analysis

  • 美国的那个华莱士比你们不知道高到哪里去了我跟他谈笑风生

  • 对于每个操作,放在\(dfs\)序深度最深的节点开始放操作

  • 然后对于放完所有操作的点,询问一下是否超过了当前点的限载

  • 如果超过,考虑贪心把深度最浅的操作一个个删掉,相当于给祖先节点释放压力

  • 那么就用线段树合并,合并每一个儿子节点

  • 感觉线段树合并很智障,要认真记一下套路


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#define MAXN 300005
#define MAXM MAXN*2
#define MAX MAXN*20
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)
#define rep(i,a) for (reg i=last[a];i;i=next[i]) using namespace std; ll last[MAXM],next[MAXM],tov[MAXM];
ll tr[MAX],lson[MAX],rson[MAX];
ll c[MAXN],root[MAXN],depth[MAXN];
vector<ll>v[MAXN];
ll n,m,tot; inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline void link(ll x,ll y){next[++tot]=last[x],last[x]=tot,tov[tot]=y;}
inline void dfs(ll x,ll y){rep(i,x)if (tov[i]!=y)depth[tov[i]]=depth[x]+1,dfs(tov[i],x);}
inline void insert(ll &t,ll l,ll r,ll x)
{
if (!t)t=++tot;++tr[t];
if (l==r)return;ll mid=(l+r)>>1;
if (x<=mid)insert(lson[t],l,mid,x);
else insert(rson[t],mid+1,r,x);
}
inline void merge(ll x,ll y)
{
if (!x || !y)return;tr[x]+=tr[y];
merge(lson[x],lson[y]),merge(rson[x],rson[y]);
if (!lson[x])lson[x]=lson[y];
if (!rson[x])rson[x]=rson[y];
}
inline ll query(ll t,ll l,ll r,ll x,ll y)
{
if (!t)return 0;
if (l==x && y==r)return tr[t];
ll mid=(l+r)>>1;
if (y<=mid)return query(lson[t],l,mid,x,y);
else if (x>mid)return query(rson[t],mid+1,r,x,y);
else return query(lson[t],l,mid,x,mid)+query(rson[t],mid+1,r,mid+1,y);
}
inline void delet(ll t,ll l,ll r)
{
if (!t)return;--tr[t];
if (l==r)return;ll mid=(l+r)>>1;
if (tr[lson[t]]>0)delet(lson[t],l,mid);
else delet(rson[t],mid+1,r);
}
inline void dfs1(ll x,ll y)
{
if (v[x].size()>0)fo(i,0,v[x].size()-1)insert(root[x],1,n,v[x][i]);
rep(i,x)if (tov[i]!=y)dfs1(tov[i],x),merge(root[x],root[tov[i]]);
while (query(root[x],1,n,1,depth[x])>c[x])delet(root[x],1,n);
}
int main()
{
freopen("fake.in","r",stdin);
freopen("fake.out","w",stdout);
n=read(),m=read();fo(i,1,n)c[root[i]=i]=read();
fo(i,1,n-1){ll x=read(),y=read();link(x,y),link(y,x);}
depth[1]=1,dfs(1,0),tot=n;
fo(i,1,m)
{
ll x=read(),y=read();
if (depth[x]<depth[y])swap(x,y);
v[x].push_back(depth[y]);
}
dfs1(1,0),printf("%lld\n",tr[1]);
return 0;
}

【JZOJ6370】基础 fake 练习题的更多相关文章

  1. 【UOJ#228】基础数据结构练习题 线段树

    #228. 基础数据结构练习题 题目链接:http://uoj.ac/problem/228 Solution 这题由于有区间+操作,所以和花神还是不一样的. 花神那道题,我们可以考虑每个数最多开根几 ...

  2. 6、50道JAVA基础编程练习题跟答案

    50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析 ...

  3. uoj #228. 基础数据结构练习题 线段树

    #228. 基础数据结构练习题 统计 描述 提交 自定义测试 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的 ...

  4. 50道JAVA基础编程练习题

    50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析 ...

  5. 【UOJ228】基础数据结构练习题(线段树)

    [UOJ228]基础数据结构练习题(线段树) 题面 UOJ 题解 我们来看看怎么开根? 如果区间所有值都相等怎么办? 显然可以直接开根 如果\(max-sqrt(max)=min-sqrt(min)\ ...

  6. 50道JAVA基础编程练习题 - 题目

    50道JAVA基础编程练习题[1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? [2]题目:判断 ...

  7. 【线段树】uoj#228. 基础数据结构练习题

    get到了标记永久化 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的好朋友九条可怜酱给她出了一道题. 给出一 ...

  8. 【视频+图文】Java基础经典练习题(一)输出2-100之间的素数,及素数个数

    目录 第一题:判断2-100之间有多少个素数,并输出所有素数. 1.视频讲解: 2.思路分析: 代码讲解:以i=4为例 4.为大家准备了彩蛋: 能解决题目的代码并不是一次就可以写好的 我们需要根据我们 ...

  9. 来点基础的练习题吧,看见CSDN这类基础的代码不多

    来点基础的练习题吧,看见CSDN这类基础的代码不多 //正三角形 void ex03(){ int i,k=0, rows, space; printf("请输入三角形的层次:") ...

随机推荐

  1. 如果在vue中实现一个输入框的抖动效果?

    1. 先来理下思路? 1)抖动就是摆动,现实中的钟摆可以很形象. 2)当摆动到临界点后,就会向相反的方向摆动. 3)在没有动力时,摆动会慢慢停止. 2.用法: :start.sync 里面是抖动器名字 ...

  2. EE5111_A0206839W

      EE5111 Selected Topics in Industrial Control & Instrumentation Assessment: Implement a simple ...

  3. 微信公众号开发上传图文素材带有卡片小程序报错:errcode=45166,errmsg = invalid content hint

    微信公众号开发自从支持允许在群发图文中插入小程序,方便了小程序的运营及推广.最近在三方服务开发中,要支持图文素材插入小程序遇到了一个很是棘手的问题.官方给出的插入小程序的示例支持文字.图片.卡片.如下 ...

  4. Dubbo执行流程?

    Dubbo执行流程? 0 start: 启动Spring容器时,自动启动Dubbo的Provider 1.register: Dubbo的Provider在启动后自动会去注册中心注册内容.注册的内容包 ...

  5. Sql Server 小知识不断扩充中

    1.  char.varchar.nvarchar 区别 char 定长字符数据长度8000字符,小于8000字符时以空格填充. varchar 变长字符数据最大长度8000,小于8000字符时不会以 ...

  6. leetcode-12周双周赛-5090-抛掷硬币

    题目描述: 二维dp: class Solution: def probabilityOfHeads(self, prob: List[float], target: int) -> float ...

  7. leetcode-159周赛-5232-替换子串得到平衡字符串*

    题目描述: 方法: 另: class Solution: def balancedString(self, s: str) -> int: n, req = len(s), len(s) // ...

  8. leetcood学习笔记-112-路径总和

    题目描述: 第一次提交: class Solution(object): def hasPathSum(self, root, sum): """ :type root: ...

  9. Struts2配置详情

    Struts2的核心功能是action,对于开发人员来说,使用Struts2主要就是编写action,action类通常都要实现com.opensymphony.xwork2.Action接口,并实现 ...

  10. bzoj1006题解

    [题意分析] 给你一张弦图,求图的最小染色数. [解题思路] 这篇讲稿已经讲得很详尽了.. 直接求完美消除序列,然后倒着染色即可.复杂度O(n2+nm). [参考程序] 求完美消除序列我是用的MCS( ...