https://www.luogu.org/problemnew/show/P4577

https://loj.ac/problem/2521

参考:https://www.luogu.org/blog/ShadowassIIXVIIIIV/solution-p4577

自己再说下另一种理解方法吧。

我们设f[i][j]为i的子树下找到的点集最小值为j的大小。

但不是很好统计,所以我们开f[i][j]表示j~INF的和即为原来的含义。

则我们合并其子树的时候,考虑加入i的w[i]时,其答案f[i][w[i]]还是没有问题的,但是对于比w[i]小的值就全大1了,所以我们找到第一个比w[i]小的w,将其--,之后统计即可。

(当然如果没有比其小的w,我们当然就不需要减啦!)

复杂度O(nlog^2n)只要评测机好点就能过。

  1. #include<map>
  2. #include<cmath>
  3. #include<stack>
  4. #include<queue>
  5. #include<cstdio>
  6. #include<cctype>
  7. #include<vector>
  8. #include<cstdlib>
  9. #include<cstring>
  10. #include<iostream>
  11. #include<algorithm>
  12. using namespace std;
  13. typedef long long ll;
  14. const int N=2e5+;
  15. #define fi first
  16. #define se second
  17. inline int read(){
  18. int X=,w=;char ch=;
  19. while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
  20. while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
  21. return w?-X:X;
  22. }
  23. struct node{
  24. int to,nxt;
  25. }e[N];
  26. int n,m,cnt,head[N],w[N],b[N];
  27. map<int,int>f[N];
  28. map<int,int>::iterator it;
  29. inline void add(int u,int v){
  30. e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;
  31. }
  32. inline void merge(int u,int v){
  33. if(f[u].size()<f[v].size())swap(f[u],f[v]);
  34. for(it=f[v].begin();it!=f[v].end();it++){
  35. f[u][it->fi]+=it->se;
  36. }
  37. f[v].clear();
  38. }
  39. void dfs(int u){
  40. for(int i=head[u];i;i=e[i].nxt){
  41. int v=e[i].to;
  42. dfs(v);
  43. merge(u,v);
  44. }
  45. it=f[u].begin();
  46. if(it->fi>=w[u])return;
  47. it=f[u].lower_bound(w[u]);it--;
  48. if(it->se==)f[u].erase(it);
  49. else it->se-=;
  50. }
  51. inline void LSH(){
  52. sort(b+,b+m+);
  53. m=unique(b+,b+m+)-b-;
  54. for(int i=;i<=n;i++)
  55. w[i]=lower_bound(b+,b+m+,w[i])-b;
  56. }
  57. int main(){
  58. n=read();
  59. for(int i=;i<=n;i++)w[i]=b[++m]=read();
  60. LSH();
  61. for(int i=;i<=n;i++)f[i][w[i]]=;
  62. for(int v=;v<=n;v++){
  63. int u=read();add(u,v);
  64. }
  65. dfs();
  66. int ans=;
  67. for(it=f[].begin();it!=f[].end();it++)ans+=it->se;
  68. printf("%d\n",ans);
  69. return ;
  70. }

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

洛谷4577 & LOJ2521:[FJOI2018]领导集团问题——题解的更多相关文章

  1. 「题解报告」P4577 [FJOI2018]领导集团问题

    题解 P4577 [FJOI2018]领导集团问题 题解区好像没有线段树上又套了二分的做法,于是就有了这片题解. 题目传送门 怀着必 WA 的决心交了两发,一不小心就过了. 题意 求一个树上最长不下降 ...

  2. 【BZOJ5469】[FJOI2018]领导集团问题(动态规划,线段树合并)

    [BZOJ5469][FJOI2018]领导集团问题(动态规划,线段树合并) 题面 BZOJ 洛谷 题解 题目就是让你在树上找一个最大的点集,使得两个点如果存在祖先关系,那么就要满足祖先的权值要小于等 ...

  3. [FJOI2018]领导集团问题

    [FJOI2018]领导集团问题 dp[i][j],i为根子树,最上面的值是j,选择的最大值 观察dp方程 1.整体Dp已经可以做了. 2.考虑优美一些的做法: dp[i]如果对j取后缀最大值,显然是 ...

  4. [FJOI2018]领导集团问题 mulitset合并

    P4577 [FJOI2018]领导集团问题 链接 luogu bzoj 他是个重题 bzoj4919: [Lydsy1706月赛]大根堆 代码改改就过了 思路 求树上的lis,要好好读题目的!!! ...

  5. P4577 [FJOI2018]领导集团问题

    P4577 [FJOI2018]领导集团问题 我们对整棵树进行dfs遍历,并用一个multiset维护对于每个点,它的子树可取的最大点集. 我们遍历到点$u$时: 不选点$u$,显然答案就为它的所有子 ...

  6. 5469: [FJOI2018]领导集团问题

    5469: [FJOI2018]领导集团问题 链接 题意: 要求在一棵树内选一个子集,满足子集内的任意两个点u,v,如果u是v的祖先,那么u的权值小于等于v. 分析: dp[u][i]表示在u的子树内 ...

  7. 题解-FJOI2018 领导集团问题

    题面 FJOI2018 领导集团问题 给一棵树 \(T(|T|=n)\),每个点有个权值 \(w_i\),从中选出一个子点集 \(P=\{x\in {\rm node}|x\in T\}\),使得 \ ...

  8. 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)

    洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...

  9. 洛谷P3387 【模板】缩点 题解

    背景 今天\(loj\)挂了,于是就有了闲情雅致来刷\(luogu\) 题面 洛谷P3387 [模板]缩点传送门 题意 给定一个\(n\)个点\(m\)条边有向图,每个点有一个权值,求一条路径,使路径 ...

随机推荐

  1. 三年同行,质造未来,腾讯WeTest五大服务免费体验

    WeTest 导读 2018年10月26日,腾讯WeTest将正式迎来三周岁生日.三周年庆典期间,只要在WeTest平台注册的用户,均可免费体验标准兼容.云真机.压测大师.手游安全扫描.应用安全扫描等 ...

  2. beauifulsoup模块的介绍

    01   爬虫基础知识介绍 相关库:1.requests,re  2.BeautifulSoup   3.hackhttp 使用requests发起get,post请求,获取状态码,内容: 使用re匹 ...

  3. Objective-C 构造方法 分类 类的深入研究

    构造方法 1.对象创建的原理 new的拆分两部曲 Person *p = [Person alloc]; 分配内存(+alloc) Person *p = [p init]; 初始化(-init) 合 ...

  4. python编程os、os.path 模块中关于文件、目录常用的函数使用方法

    os模块中关于文件/目录常用的函数使用方法   函数名 使用方法 getcwd() 返回当前工作目录 chdir(path) 改变工作目录 listdir(path='.') 列举指定目录中的文件名( ...

  5. Python 的非正式介绍

    在下面的例子中,通过提示符 (>>> 与 ...) 的出现与否来区分输入和输出:如果你想复现这些例子,当提示符出现后,你必须在提示符后键入例子中的每一个词:不以提示符开头的那些行是解 ...

  6. 配置vConsole调试console

    1.使用 npm 安装: npm install vconsole 再使用webpack,然后js代码中 import VConsole from 'vconsole/dist/vconsole.mi ...

  7. JavaScript写的一个带AI的井字棋

    最近有一门课结束了,需要做一个井字棋的游戏,我用JavaScript写了一个.首先界面应该问题不大,用html稍微写一下就可以.主要是人机对弈时的ai算法,如何使电脑方聪明起来,是值得思考一下的.开始 ...

  8. Vue-cli 工具 / 通过 Vue-cli 工具重构 todoList

    本博文归纳在 Vue 学习过程中, Vue-cli 工具的使用说明.除此之外还通过 Vue-cli 工具将之前 Vuejs 基本语法当中实现的 todoList 进行重构. 安装 npm instal ...

  9. 【halcon】算子

    算子 rgb1_to_gray  灰度化 threshold:英文是阈的意思    二值化算子 Connection Compute connected components of a region. ...

  10. eos智能合约开发最佳实践

    安全问题 1.可能的错误 智能合约终止 限制转账限额 限制速率 有效途径来进行bug修复和提升 2.谨慎发布智能合约 对智能合约进行彻底的测试 并在任何新的攻击手法被发现后及时制止 赏金计划和审计合约 ...