C. Garland(思维)
2021/5/2 18:55:38
本文主要是介绍C. Garland(思维),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
https://codeforces.com/problemset/problem/767/C
思路:
答案必定%3==0
然后跑子树的和一旦出现了sum/3就可以砍一段,然后记为0接着跑
#include<iostream> #include<vector> #include<queue> #include<cstring> #include<cmath> #include<map> #include<set> #include<cstdio> #include<algorithm> #define debug(a) cout<<#a<<"="<<a<<endl; using namespace std; const int maxn=1e6+100; typedef long long LL; inline LL read(){LL x=0,f=1;char ch=getchar(); while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();} return x*f;} LL val[maxn],siz[maxn]; vector<LL>g[maxn]; vector<LL>ans; LL tar; void dfs(LL u,LL fa){ siz[u]=val[u]; bool flag=1; for(LL i=0;i<g[u].size();i++){ LL v=g[u][i]; if(v==fa) continue; dfs(v,u); } if(siz[u]==tar){ ans.push_back(u); siz[u]=0; } } int main(void){ cin.tie(0);std::ios::sync_with_stdio(false); LL n;cin>>n; LL sum=0; LL root=0; for(LL i=1;i<=n;i++){ LL fat;cin>>fat>>val[i];sum+=val[i]; g[fat].push_back(i); g[i].push_back(fat); if(fat==0) root=i; } if(sum%3!=0){ cout<<"-1"<<"\n"; return 0; } tar=sum/3; dfs(root,0); if(ans.size()<=2){ cout<<"-1"<<"\n"; return 0; } LL num=0; for(LL i=0;i<ans.size();i++){ if(ans[i]==root) continue; num++; cout<<ans[i]<<" "; if(num==2) break; } return 0; }
这篇关于C. Garland(思维)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享