https://codeforces.com/contest/1467/problem/E

这题反过来想以后就很简单了,当时正着想半天都想不出来怎么搞,但是我们反过来标记那些不合法点,只要被标记一次他就是不合法的,那么就很容易了

不合法的时候分两种情况,如果当前点a[u],他的祖先节点中存在a[u],那么找到最近的那个vis[a[u]],那么vis[a[u]]向上,u向下,都是非法点,那么我们利用dfs序对树的这个值进行差分,就可以O(1)标记

第二种情况就是如果它的祖先节点中不存在a[u],但是之前已经存在了过了,那么他们就是通过根节点1,相连的一对点,他们分别的子树都是非法的

这题实现细节还挺多的,wa了好几次。。。还看了wa点的数据才想清楚怎么写

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;const int maxl=4e5+10;int n,m,ind,ans,cnt;ll tot;
int a[maxl],b[maxl];
int lasta[maxl],vis[maxl],nxt[maxl],dfn[maxl],out[maxl];
ll val[maxl];
vector<int> e[maxl];inline void predfs(int u,int fa)
{dfn[u]=++ind;for(int v:e[u])if(v!=fa)predfs(v,u);out[u]=ind;
}inline void prework()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];sort(b+1,b+1+n);cnt=unique(b+1,b+1+n)-b-1;for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+1+cnt,a[i])-b;for(int i=1;i<=n-1;i++){int u,v;scanf("%d%d",&u,&v);e[u].push_back(v);e[v].push_back(u);}predfs(1,0);
}inline void dfs(int u,int fa)
{if(vis[a[u]]){tot++;val[dfn[nxt[a[u]]]]--;val[out[nxt[a[u]]]+1]++;val[dfn[u]]++;val[out[u]+1]--;}else if(lasta[a[u]]>0){val[dfn[lasta[a[u]]]]++;val[out[lasta[a[u]]]+1]--;val[dfn[u]]++;val[out[u]+1]--;}int lastvis=vis[a[u]];vis[a[u]]=u;int lastnxt=nxt[a[u]];for(int v:e[u])if(v!=fa)nxt[a[u]]=v,dfs(v,u);vis[a[u]]=lastvis;nxt[a[u]]=lastnxt;lasta[a[u]]=u;
}inline void mainwork()
{dfs(1,0);for(int i=1;i<=n;i++){val[i]+=val[i-1];if(tot+val[i]==0)ans++;}
}inline void print()
{printf("%d\n",ans);
}int main()
{prework();mainwork();print();return 0;
}

codeforces1467E. Distinctive Roots in a Tree相关推荐

  1. codeforces1467 E. Distinctive Roots in a Tree(树上差分)

    E. Distinctive Roots in a Tree 树上差分 如果当前节点u的某一棵子树中的某个节点的值和当前节点相同,那么除了当前节点这一棵子树节点,其他节点(其他子树以及u上面的节点)一 ...

  2. Codeforces Round #695(Div. 2)

    Codeforces Round #695 (Div. 2) 1467A Wizard of Orz 1467B Hills And Valleys 1467C Three Bags 1467D Su ...

  3. Paper翻译:《A Novel Convolutional Neural Network Based Model for Recognition and Classification of App》

    论文名称:<A Novel Convolutional Neural Network Based Model for Recognition and Classification of Appl ...

  4. LintCode2016年8月8日算法比赛----子树

    子树 题目描述 有两个不同大小的二叉树:T1有上百万的节点:T2有好几百的节点.请设计一种算法,判定T2是否为T1的子树. 注意事项若 T1 中存在从节点 n 开始的子树与 T2 相同,我们称 T2 ...

  5. 人工智能研究的内容:_更深入:人工智能研究的思想史

    人工智能研究的内容: by Elena Nisioti 由Elena Nisioti 更深入:人工智能研究的思想史 (Going deeper: A history of ideas in AI re ...

  6. Instruments详解

    使用Instruments可以监测分析app内存相关的 Overall Memory Use. Leaked Memory. Abandoned Memory. Zombies等内容. 1.Blank ...

  7. Polygon zkEVM——Hermez 2.0简介

    1. 引言 前序博客有: ZK-Rollups工作原理 近期,Polygon团队开源了其Hermez 2.0 zkEVM代码,公开测试网即将上线: https://github.com/0xpolyg ...

  8. 树形结构数据封装(及拉平)的几种方法

    java(for循环处理.递归处理.map处理) public class DemoApplicationTests {/*for循环写法*//*** @param args*/public stat ...

  9. EasyUI:combotree(树形下拉框)复选框选中父节点(子节点的状态也全部选中)输入框中只显示父节点的文本值

    在开发过程中遇到的小案例 效果展示 未处理之前的效果: 处理之后的效果: 需求详情 combotree(树形下拉框)复选框选中父节点时输入框只显示父节点的文本值,但是子节点的状态是选中的. 当所有子节 ...

  10. 数据结构二叉排序树建立_数据结构101什么是二叉搜索树

    数据结构二叉排序树建立 In everyday life, we need to find things or make decisions, and one way to make that pro ...

最新文章

  1. ZZNU 1993: cots' friends
  2. Serverless应用场景
  3. python表头写进csv文件_Python读取CSV文件列并在CSV-fi中写入文件名和列名
  4. Visio 方向工程连接 Oracle 10G
  5. 【NUMBER】有关Oracle NUMBER类型定义中precision和scale的测试和总结
  6. [CODEVS 1036]商务旅行
  7. 就算给穷人一百万,他们也很难赚到一块钱利润
  8. 超分辨率技术如何发展?这6篇ECCV 18论文带你一次尽览
  9. Linux Malloc分析-从用户空间到内核空间【转】
  10. 软件安装管家matlab教程,timesat软件怎么安装 timesat安装使用图文教程 - 驱动管家...
  11. 关于word中的DDE如何查看
  12. 看看人家那公众号管理系统,那叫一个优雅(附源码)
  13. CNCC 2018参会回顾、总结
  14. 6月13日云栖精选夜读:数梦工场完成A轮7.5亿融资 三个维度构建“新型互联网”
  15. c# Process监控进程 与 ManagementEventWatcher 监控进程
  16. html树状图在线画板,五款在线思维导图工具,总有一款适合你
  17. C++ windows下判断鼠标点击及获取像素点
  18. 蜂鸣器、风扇、震动马达
  19. 豆瓣,清华源下载 pip3
  20. 自组网(Adhoc)和基础网(Infra)

热门文章

  1. 8位并行左移串行转换电路_单片机试题
  2. mysql/hive求实际活动时间
  3. python自动生成加减法算术题
  4. 苹果计算机怎样恢复桌面,mac桌面整理_使Mac桌面恢复整洁的四种技巧
  5. The JAVA_HOME environment variable is not defined correctly(亲测有效)
  6. CSS简单的图片居中
  7. STIM300读取数据
  8. 程序员英语5:number和digit都是数字,有什么区别?
  9. virtualbox安装.img文件
  10. Android红外功能模拟触摸鼠标事件唤醒屏幕