小度挪车

news/2024/10/5 14:47:30/文章来源:https://www.cnblogs.com/watersail/p/18287701
  • 子树余树的信息可以通过全局信息减去子树信息来统计
  • 在最后一刻,其实你已经意识到,问题大概出在((g[fa][0]-f[n1][0])+n-sum-cnt[n1][0])这个式子上
  • 但你最终没能找出错误,因为你只关注到式子的逻辑有没有问题,而没有意识到变量对式子的诠释是否恰当——
  • 你需要的其实是O节点的个数,但n代表的是所有节点的总个数
点击查看代码
#include <bits/stdc++.h> 
using namespace std;
vector<int>a[500005];
long long s[500005],d[500005],cnt[500005][2],sum,n;
bool c[500005],pd;
long long ans,f[500005][2],g[500005][2];
int read1()
{char cc=getchar();while(!(cc>=48&&cc<=57)){cc=getchar();}int s=cc-48;while(1){cc=getchar();if(cc>=48&&cc<=57){s=s*10+cc-48;}else{break;}}return s;
}
void dfs1(int n1,int fa)
{s[n1]=1;f[n1][c[n1]]=d[n1];cnt[n1][c[n1]]=1;for(int i=0;i<a[n1].size();i++){if(a[n1][i]!=fa){d[a[n1][i]]=d[n1]+1;dfs1(a[n1][i],n1);s[n1]+=s[a[n1][i]];f[n1][0]+=f[a[n1][i]][0];f[n1][1]+=f[a[n1][i]][1];cnt[n1][0]+=cnt[a[n1][i]][0];cnt[n1][1]+=cnt[a[n1][i]][1];}}if(s[n1]==sum||n-s[n1]==sum){pd=true;}
}
void dfs2(int n1,int fa)
{for(int i=0;i<a[n1].size();i++){if(a[n1][i]!=fa){g[n1][0]=g[n1][0]+f[a[n1][i]][0];g[n1][1]=g[n1][1]+f[a[n1][i]][1];}else if(fa!=0){g[n1][0]+=((g[fa][0]-f[n1][0])+n-sum-cnt[n1][0]);g[n1][1]+=((g[fa][1]-f[n1][1])+sum-cnt[n1][1]);}}for(int i=0;i<a[n1].size();i++){if(a[n1][i]!=fa){dfs2(a[n1][i],n1);}}if(s[n1]==sum){ans=min(ans,f[n1][0]+g[fa][1]-f[n1][1]);}if(n-s[n1]==sum){ans=min(ans,f[n1][1]+g[fa][0]-f[n1][0]);}
}
int main()
{cin>>n;string s;cin>>s;for(int i=0;i<n;i++){if(s[i]=='P'){c[i+1]=true;sum++;}}for(int i=1;i<n;i++){int u,v;u=read1();v=read1();a[u].push_back(v);a[v].push_back(u);}d[1]=1;dfs1(1,0);if(pd==false){puts("-1");return 0;}for(int i=1;i<=n;i++){f[i][0]-=(cnt[i][0]*(d[i]-1));f[i][1]-=(cnt[i][1]*(d[i]-1));}ans=LLONG_MAX;dfs2(1,0);cout<<ans<<endl;return 0;
}
/*
10
OPPPOPPOPO
1 2
2 3
3 4
3 5
1 6
1 7
7 8
7 9
7 105
PPPPO
1 2
1 3
1 4
1 5
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/739518.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java反射与Fastjson的危险反序列化

Preface 在前文中,我们介绍了 Java 的基础语法和特性和 fastjson 的基础用法,本文我们将深入学习fastjson的危险反序列化以及预期相关的 Java 概念。 什么是Java反射? 在前文中,我们有一行代码 Computer macBookPro = JSON.parseObject(preReceive,Computer.class); 这行代…

Win10双屏设置 之 鼠标不能从中间划过 问题解决

Win10双屏设置 之 鼠标不能从中间划过解决-百度经验 (baidu.com)

比赛获奖的武林秘籍:03 好的创意选取-获得国奖的最必要前提

本文主要介绍了大学生电子计算机类比赛和创新创业类比赛创意选取的重要性,并列举了好的创意选取和坏的创意选取的例子,同时说明了好的创意选取具有哪些特点,同时对常见的创意选取途径与来源进行了基本介绍。比赛获奖的武林秘籍:03 好的创意选取-获得国奖的最必要前提 摘要 …

阶段测试

Sre网络班阶段测试 一:用sed 命令修改/etc/fstab文件,删除文件中的空行,注释行,并保留文件备份(7分) 答案写这里:二: 用 find 命令查找出 /var/ 目录中大于1M且以db结尾的文件(7分) 答案写这里:三: 先判断当前主机是否安装了nginx包,如果没安装,则执行命令安装,…

时间序列分析专题——利用SPSS专家建模器进行建模

SPSS的专家建模器可以自动识别数据,给出最适合的模型,本章通过三个例题介绍如何使用SPSS实现时间序列分析。由于本人对时间序列分析的理解尚浅,做出模型后在论文上的呈现形式需要取查阅资料,以便更好地在论文上呈现 在此之前,我们还需要了解时间序列分析的一些基础的名词 …

如何在ubuntu上设置清华源

如何在ubuntu上设置清华源 apt介绍 apt(Advanced Packaging Tool)是一个在 Debian 和 Ubuntu 中的 Shell 前端软件包管理器。 apt 命令提供了查找、安装、升级、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。 apt 命令执行需要超级管理员权限(root)。 操作 …

c++ u7-02-高精度乘法

本节课作业: 链接:https://pan.baidu.com/s/13-FC86jSHGziRDA8lqzimg?pwd=owv1 提取码:owv1高精度乘法    #include<iostream> #include<cstdio> #include<cstring> using namespace std; string x , y; int a[50010] , b[50010] , c[50010…

node-red的基本指令

1. inject->debug输入到输出,调试结果在右边如果选择时间戳的话,可以选择立即执行,或者周期性,持续执行inject除了时间戳还有一些其他输入项可以选择inject选择json文件输出写好json文件之后点击格式化json,可以校对文件格式payload.number可以让输出只输出number的内容…

lombokjunit

lombok&junit 1 lombok先去官网或者maven仓库下载jar包https://mvnrepository.com/导入第三方包到项目中右键lib文件夹,点击add as library默认jvm不解析第三方注解,需要手动开启使用//@Setter // 生成set方法 1 //@Getter // 生成get方法 2 //@ToString // 生…

日期类异常类

日期类&异常类 作业:千位数字相乘 public static void main(String[] args) {// 两个千位数字相乘int[] arr1 = {7,8,9,9,8,9};int[] arr2 = {7,9,8,9,6,8};// 定义结果的数组int[] result = new int[12];for (int i = 0; i < arr1.length; i++) {for (int j = 0; j <…

包装类数学类位运算

包装类&数学类&位运算 1 包装类 把基本数据类型包装成引用数据类型byte short int long float double char boolean voidByte Short Integer Long Float Double Character Boolean VoidVoidVoid类构造方法是私有的,所以不能创建对象。并且Void是一个最终类,没有子类。…