CF375D Tree and Queries(dsu on tree)
题解:
个人感觉这个题目是一个挺不错的题的。(这里就不说dsu on tree的这个过程是什么了)
我们在dsu on tree计算答案时需要有一个小小技巧去优化一下时间复杂度。
就是当我们用一个cnt数组把这颗某种颜色的个数都给统计下来后,我们如何才能在非常快的情况下找到超过次数为k的节点个数呢?
这里我们引入一个sum数组,用来储存超过次数为k的结点个数,怎么用呢?
假设当前颜色x的个数为cnt[x]。
那么如果cnt[x]+1,就代表着sum[cnt[x]+1]这个值,也会+1.
这样问题就解决了!
详情看cal函数这里面的代码
代码:
/*Keep on going Never give up*/
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
//#define int long long#define endl '\n'
#define Accepted 0
#define AK main()
#define I_can signed
using namespace std;
const int maxn =2e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;vector<int> edge[maxn];
vector<pair<int,int> > Q[maxn];
bool visited[maxn];
int a[maxn],sz[maxn],son[maxn];
int ans[maxn];
int sum[maxn],cnt[maxn];
void dfs(int x,int fa){sz[x]=1;for(auto i:edge[x]){if(i==fa) continue;dfs(i,x);sz[x]+=sz[i];if(sz[son[x]]<sz[i]) son[x]=i;}
}
int flag;
void cal(int x,int fa,int val){if(val==1){sum[cnt[a[x]]+1]++;}else{sum[cnt[a[x]]]--;}cnt[a[x]]+=val;for(auto i:edge[x]){if(i==fa||i==flag) continue;cal(i,x,val);}
}
void dsu(int x,int fa,int keep){for(auto i:edge[x]){if(i==fa||i==son[x]) continue;dsu(i,x,false);}if(son[x]){dsu(son[x],x,true);flag=son[x];}cal(x,fa,1);flag=0;for(auto i:Q[x]){ans[i.second]=sum[i.first];}if(!keep) cal(x,fa,-1);}
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int n,m;cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];for(int i=0;i<n-1;i++){int x,y;cin>>x>>y;edge[x].push_back(y);edge[y].push_back(x);}for(int i=1;i<=m;i++){int x,y;cin>>x>>y;Q[x].push_back({y,i});}dfs(1,0);dsu(1,0,0);for(int i=1;i<=m;i++){cout<<ans[i]<<endl;}}
CF375D Tree and Queries(dsu on tree)相关推荐
- B. Alyona and a tree(dsu on tree + bit)
B. Alyona and a tree(dsu on tree + bit) 给定一颗以111号节点为根的树,每个点有点权aia_iai,边有边权,如果vvv控制了点uuu,当且仅当uuu是vvv ...
- 2020 China Collegiate Programming Contest Changchun F - Strange Memory(dsu on tree + 位运算小技巧)
题目连接: https://codeforces.com/gym/102832/problem/F 首先写这个题的时候要注意内存的问题 不要瞎几把define int long long 题解: 考虑 ...
- CF570D Tree Requests(dsu on tree)
题解: dsu on tree 首先dsu on tree是一个离线的算法,所以我们需要先把他们的询问储存起来,然后进行操作. 针对于每一个结点,我们先统计出他和他子树的所有信息,然后对于这个结点来说 ...
- dsu on tree 模板题目(CF600E Lomsat gelral)
题解: dsu on tree 对于结点i来说,步骤为: 递归轻儿子,不保留贡献. 递归重儿子,保留贡献. 统计当前结点及所有轻儿子的贡献. 拿个样例来解释算法的流程 比如说样例2: 如图所示,有多个 ...
- 【CodeForces】741 D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree)
[题意]给定n个点的树,每条边有一个小写字母a~v,求每棵子树内的最长回文路径,回文路径定义为路径上所有字母存在一种排列为回文串.n<=5*10^5. [算法]dsu on tree [题解]这 ...
- 牛客 NC201908 小睿睿的伤害(dsu on tree, 启发式合并)
传送门 题目大意 给你一棵树,每个节点有一个权值valvalval,每一对点对(i,j)(i,j)(i,j) 可以在他们的lcalcalca处造成gcd(val[i],val[j])gcd(val ...
- 树上启发式合并(dsu on tree)
dsu on tree dsu \text{dsu} dsu一般指 disjoint set union \text{disjoint set union} disjoint set union,即并 ...
- 小 Q 与树(dsu on tree + segment tree)牛客练习赛 81 D
小 Q 与树 给定一棵带权的树,每条边的距离都为111,要我们求∑u=1n∑v=1nmin(au,av)dis(u,v)\sum\limits_{u = 1} ^{n} \sum\limits_{v ...
- Codeforces Round #383 (Div. 1): D. Arpa’s letter-marked tree…(dsu on tree+状压)
题意: 给你一棵n个节点的树,每条边都代表着一个字母(a~v),对于每个节点u,求出以u为根的子树中有多少条路径满足:路径上的字符重新排列后可以得到一个回文字符串 思路: 前置:dsu on tree ...
最新文章
- Javacript Remove Elements from Array
- 虚拟机Linux和宿主机传输文件
- Job for slapd.service failed because the control process exited with error code. See systemctl stat
- 亲测可用小米刷旧版开发版固件,刷入华硕、潘多拉固件
- html如何添加竖虚线,在word中添加竖虚线的方法
- Chrome 浏览器小恐龙游戏变身超级马利奥
- 【错题】#10兰州烧饼——思考角度的转换
- 关于烂代码的那些事(下)
- Ubuntu 台式机 usb WiFi 接收器设置方法
- 如何在数据库mysql中储存图片
- 旋转卡(qia)壳 平面最远点对
- mysql火焰图_perf + 火焰图分析程序性能 - 刘志鹏的Blog - 博客园
- 2021届校招求职流程全解析(IT企业和国企)
- “蘑菇书”是怎样磨出来的?
- 入网许可证_入网许可证查询
- 是否可以将一个控件的outerHTML赋值?
- IEEE xplore免费下载论文
- 成都大数据语言培训:如何提高数据分析能力
- 王道计算机考研j机试指南,王道论坛计算机考研机试指南 三 Hash的应用
- win10中Mysql安装配置
热门文章
- TensorFlow之图结构与TensorBoard可视化
- 聊天机器人之需求分析和流程介绍
- ACMNO.13求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。 输入 n 输出 和 样例输入 5 样例输出 153
- 知乎热议:985计算机视觉研究生找不到工作?
- Confluence 6 配置文件和key
- metaq的简单封装dataChange解读
- iOS单独集成QQ分享功能
- 用户列表-投资记录sql
- Mysql性能优化方案
- Windows Phone 7 开“.NET研究”发之:工具栏