题面:#10471. 「2020-10-02 提高模拟赛」灌溉 (water)

假设只有一组询问,我们可以用二分求解:二分最大距离是多少,然后找到深度最大的结点,并且把它的\(k\)倍祖先的一整子树删掉,看一下一共要删几次,显然满足单调性。

现在要询问所有取值。上面二分的过程启发我们可以反过来,通过枚举答案,然后找到答案对应哪些询问。显然对于当前\(\text{ans}\),一次删除最少删掉\(ans+1\)个点,最多删\(\frac{n}{ans+1}\)次,因此是一个调和级数\(\frac{1}{1}+\frac{1}{2}+\frac{1}{3}+\frac{1}{4}+....+\frac{1}{n} -> n\ln(n)\),只要保证每次枚举的时间复杂度与\(n\)脱钩就行,用线段树维护剩余数的最大值的位置就行了,时间复杂度\(n\log^2(n)\)。

这个线段树的实现比较巧妙,\(\text{lazytag}\)有三种取值,\(0\)表示没有操作,\(1\)表示要把孩子们全删了,\(2\)表示要把孩子们全弄回来。若一个点的懒标记大于零,就直接用它的懒标记覆盖它儿子们的懒标记。为了实现恢复操作,要额外存下每个点最初始的值用作恢复用。


int tree[maxn * 4], val[maxn * 4], fir[maxn * 4]; /// val: 0 -> 无要求; 1 -> 要求填满; 2 -> 要求删掉 int pushup(int x, int y)
{
return dep[x] < dep[y] ? y : x;
} void spread(int x)
{
if (val[x] == 1)
{
val[x << 1] = val[x << 1 | 1] = 1;
tree[x << 1] = fir[x << 1];
tree[x << 1 | 1] = fir[x << 1 | 1];
}
if (val[x] == 2)
{
val[x << 1] = val[x << 1 | 1] = 2;
tree[x << 1] = tree[x << 1 | 1] = 0;
}
val[x] = 0;
} void build(int x, int l, int r)
{
val[x] = true;
if (l == r)
{
fir[x] = tree[x] = pnt[l];
return;
}
int mid = (l + r) >> 1;
build(x << 1, l, mid);
build(x << 1 | 1, mid + 1, r);
fir[x] = tree[x] = pushup(tree[x << 1], tree[x << 1 | 1]);
} void erase(int x, int l, int r, int ll, int rr)
{
//tree[x] *= val[x];
//tree[x] = fir[x] * val[x];
if (ll <= l && r <= rr)
{
tree[x] = 0; val[x] = 2;
return;
}
spread(x);
int mid = (l + r) >> 1;
if (ll <= mid)
{
erase(x << 1, l, mid, ll, rr);
}
if (rr > mid)
{
erase(x << 1 | 1, mid + 1, r, ll, rr);
}
tree[x] = pushup(tree[x << 1], tree[x << 1 | 1]);
} int calc(int k)
{
//insert(1, 1, 1, 1, n);
val[1] = 1;
tree[1] = fir[1];
int ret = 0;
while (tree[1])
{
int del = Kfat(tree[1], k);
erase(1, 1, n, dfn[del], dfn[del] + sze[del] - 1);
ret++;
}
return ret;
}

#10471. 「2020-10-02 提高模拟赛」灌溉 (water)的更多相关文章

  1. #10470. 「2020-10-02 提高模拟赛」流水线 (line)

    题面:#10470. 「2020-10-02 提高模拟赛」流水线 (line) 题目中的那么多区间的条件让人感觉极其难以维护,而且贪心的做法感觉大多都能 hack 掉,因此考虑寻找一些性质,然后再设计 ...

  2. 「2019-8-13提高模拟赛」树 (tree)

    传送门 Description 你有一个 \(n\)个点的树,第 \(i\)个点的父亲是\(p_i\).每个点有一个权值 \(t_i\) 和一个颜色黑或者白.所有点一开始都是白色. 你要进行 \(m\ ...

  3. 「2019-8-11提高模拟赛」女装盛宴 (flag)

    传送门 Solution  基环树+倍增+双指针 第一次因为#define int long long而玄学RE 为什么标程都不用开\(long long\)啊 Code  /*玄学RE 看来defi ...

  4. 「CSP-S模拟赛」2019第四场

    「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...

  5. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  6. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  7. JZOJ 2020.10.7 提高B组反思

    JZOJ 2020.10.7 提高B组反思 T1 比较简单的一道题 跑\(k\)遍\(SPFA\) 然后全排列顺序枚举求解 TLE 60 双向存边数组没开两倍-- T2 搞出分母 分子不会求 \(n^ ...

  8. JZOJ 2020.10.6 提高B组反思

    JZOJ 2020.10.6 提高B组反思 T1 NYG的动态数点 最简单的一题 很容易想到\(O(n)\)的做法 枚举最小的那个数,即\(a_k\) 然后向左和向右扩展 然后可以直接从右端点+1继续 ...

  9. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

随机推荐

  1. 如何将jdk12的源码导入idea

    如何将jdk12的源码导入idea中 一 首先,在idea中新建一个java工程 接着,在本地找到jdk所在的文件目录,进入jdk目录,找到javasrc目录或者一个src.zip的压缩包, 在向下或 ...

  2. Takin Talks·上海 |开源后首场主题研讨会来了,一起解密Takin技术吧!

      自 6 月 25 日全球首款生产环境全链路压测平台 Takin 正式开源,短短 13 天时间,Github 主页上 Star 数已超过 730,开发者社群也积累了 1500+粉丝.群内技术研讨氛围 ...

  3. iPhone SE切换颜色特效

    Apple 网站的特效, iPhone SE 共有黑.白.红三种颜色,在卷动页面的时候会逐步替换,看起来效果非常时尚,在此供上代码学习. <!DOCTYPE html> <html& ...

  4. Harbour.Space Scholarship Contest 2021-2022 (Div. 1 + Div. 2) Editorial题解

    A 略,发现只有当末尾为9时才满足条件.. B 简单模拟,注意数组大小!!! C 简单模拟. D 比较暴力的一个做法就是每次找一个开始匹配的起始点,然后每次不同时向后跳2就行了. 注意这里最后还要判断 ...

  5. cf12E Start of the season(构造,,,)

    题意: 给一个偶数N. 构造出一个矩阵. 满足:主对角线上全为0.每一行是0~N-1的一个全排列.矩阵关于主对角线对称. 思路: 觉得是智商题,,,,看完题解后觉得不难,但是我就是没想出来.只想到了前 ...

  6. The art of multipropcessor programming 读书笔记-3. 自旋锁与争用(2)

    本系列是 The art of multipropcessor programming 的读书笔记,在原版图书的基础上,结合 OpenJDK 11 以上的版本的代码进行理解和实现.并根据个人的查资料以 ...

  7. AliRTC 开启视频互动 “零计算” 时代

    在 2021 云栖大会<产业视频化创新与最佳实践>视频云主题论坛中,阿里云智能高级技术专家在<AliRTC 开启视频互动 "零处理" 时代>的主题演讲中,发 ...

  8. C 函数指针语法总结

    C 函数指针语法总结 函数指针 定义 每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针. 注意:函数指针的本质是一个指针变量,且指针指向的函数的入口地址. 语法 返 ...

  9. MapReduce Service更换集群外部时钟源,仅需10步

    摘要:MapReduce Service 集群使用NTP进行时钟同步.本文简要介绍了MapReduce Service集群NTP机制及NTP的配置方式. 本文分享自华为云社区<MapReduce ...

  10. Cannot find ./catalina.sh The file is absent or does not have execute permission This file is needed to run this program(问题解决)

    web项目没有打成包,直接放在了linux服务器上. 进入tomcat/bin目录,执行启动的时候出现如下错误: 解决方法: 在tomcat 的bin目录下 执行这条命令chmod +x *.sh   ...