「LG2664 树上游戏」

题目

这真是一道神仙的一批的题目

定义\(s(i,j)\)表示从点\(i\)到点\(j\)经过的颜色数量

\[sum_i=\sum_{j=1}^ns(i,j)\]

求出所有的\(sum_i\)

考虑点分治

对于一个点我们用两种方式来统计其答案

  1. 这个点作为分治重心时,分值区域内所有点到这个点贡献

  2. 这个点不是分治重心的时候,当前分治区域内其他子树到这个点的贡献

第一种贡献我们很好统计,点分治的时候把所有子树遍历一遍就好了

第二种就需要转换一下思路了,我们不能直接求\(s(i,j)\)了,我们应该求某一种颜色一共被数了多少次

我们开一个桶\(tax\)\(tax[i]\)表示\(i\)这种颜色控制的大小一共是多少,也就是这个颜色会被多少个终点数到,我们可以通过提前遍历好所有子树得到这个信息

每次进入一棵子树的时候,提前减掉这个子树的贡献,之后进入子树\(dfs\)就好了,如果一旦出现一种新颜色,显然这种颜色会被当前分治区域内所有点数上,更改一下贡献即可

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#define maxn 100005
#define re register
#define inf 99999999
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read() {int x=0;char c=getchar();while(c<'0'||c>'9') c=getchar();while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
struct E{int v,nxt;}e[maxn<<1];
int col[maxn],head[maxn],vis[maxn],sum[maxn],mx[maxn];
int f[maxn],tax[maxn],d[maxn],st[maxn],tmp[maxn];
int num,n,m,now,S,rt,top;
LL ans,Ans[maxn],res;
std::vector<int> v[maxn],c[maxn];
inline void add(int x,int y) {e[++num].v=y;e[num].nxt=head[x];head[x]=num;}
void getroot(int x,int fa) {sum[x]=1,mx[x]=0;for(re int i=head[x];i;i=e[i].nxt) {if(vis[e[i].v]||e[i].v==fa) continue;getroot(e[i].v,x);sum[x]+=sum[e[i].v],mx[x]=max(mx[x],sum[e[i].v]);}mx[x]=max(mx[x],S-sum[x]);if(mx[x]<now) now=mx[x],rt=x;
}
void getdis(int x,int fa,int now,int t) {if(!f[col[x]]) now++;if(!tmp[col[x]]) st[++top]=col[x];tmp[col[x]]=1;sum[x]=1;f[col[x]]++;Ans[t]+=now;for(re int i=head[x];i;i=e[i].nxt) {if(vis[e[i].v]||e[i].v==fa) continue;getdis(e[i].v,x,now,t);sum[x]+=sum[e[i].v];}if(f[col[x]]==1) d[col[x]]+=sum[x];f[col[x]]--;
}
void find(int x,int fa) {if(!f[col[x]]) ans-=tax[col[x]],ans+=res;Ans[x]+=ans;f[col[x]]++;for(re int i=head[x];i;i=e[i].nxt) {if(vis[e[i].v]||e[i].v==fa) continue;find(e[i].v,x);} if(f[col[x]]==1) ans-=res,ans+=tax[col[x]];f[col[x]]--;
}
void dfs(int x) {vis[x]=1;ans=0;f[col[x]]=1;for(re int i=head[x];i;i=e[i].nxt) {if(vis[e[i].v]) continue;top=0;getdis(e[i].v,0,1,x);for(re int j=1;j<=top;j++) if(st[j]!=col[x]) v[e[i].v].push_back(d[st[j]]),c[e[i].v].push_back(st[j]);for(re int j=1;j<=top;j++) if(st[j]!=col[x]) tax[st[j]]+=d[st[j]],ans+=d[st[j]];for(re int j=1;j<=top;j++) tmp[st[j]]=0,d[st[j]]=0;}f[col[x]]=0;ans+=S,tax[col[x]]=S;for(re int i=head[x];i;i=e[i].nxt) {if(vis[e[i].v]) continue;res=S-sum[e[i].v];ans-=sum[e[i].v],tax[col[x]]-=sum[e[i].v];for(re int j=0;j<v[e[i].v].size();j++) ans-=v[e[i].v][j],tax[c[e[i].v][j]]-=v[e[i].v][j];find(e[i].v,0);for(re int j=0;j<v[e[i].v].size();j++) ans+=v[e[i].v][j],tax[c[e[i].v][j]]+=v[e[i].v][j];ans+=sum[e[i].v],tax[col[x]]+=sum[e[i].v];}for(re int i=head[x];i;i=e[i].nxt) {if(vis[e[i].v]) continue;for(re int j=0;j<v[e[i].v].size();j++)tax[c[e[i].v][j]]-=v[e[i].v][j];v[e[i].v].clear(),c[e[i].v].clear();}tax[col[x]]=0;for(re int i=head[x];i;i=e[i].nxt) {if(vis[e[i].v]) continue;now=inf,S=sum[e[i].v],getroot(e[i].v,0),dfs(rt);}
}
int main() {n=read();int x,y;for(re int i=1;i<=n;i++) col[i]=read();for(re int i=1;i<n;i++) x=read(),y=read(),add(x,y),add(y,x);S=n,now=inf,getroot(1,0);dfs(rt);for(re int i=1;i<=n;i++) printf("%lld\n",Ans[i]+1ll);return 0;
}

转载于:https://www.cnblogs.com/asuldb/p/10425326.html

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

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

相关文章

DUBBO 使用问题记录

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 官方ISSUE参考 https://github.com/alibaba/dubbo/issues 注册中心ZookeeperRegistry.doSaveProperties warn 2014-10-1419:56:51WARN …

真格量化学习处理——几个功能小函数

真格这周是学习使用了不少,功能算是很不错,但在做的时候也发现了一个问题: 数据缺失:我在做回测,要求获取每天的delta值,并从中筛选条件值时,报错,显示无数据。不得不使用pass,影响我的回测连贯性。 现在开始讲下,我做的几个功能函数: 算起来,挺烦的,就是各种细节…

软件技术发展的驱动力

软件产品的终极目标是为了实现用户需求从而满足人们的需要。也正是为了不断满足人们的需要使得软件行业不断向前发展。比如&#xff0c;新的算法&#xff08;MPEG-1、MPEG-2、MPEG-4、H.264、……&#xff09;等的出现都在当时为了满足不同的需要而被发明。然而&#xff0c;人们…

The Model Driven Software Network

国外的一个模型驱动软件开发的讨论社区&#xff0c;The Model Driven Software Network这个社区讨论的都是模型驱动开发相关的话题&#xff0c;虽然建立不久&#xff0c;但加入的人越来越多&#xff0c;建立群组的是Mark Dalgarno以下是一些讨论: Textual v Graphical models W…

无敌简单快速的文件服务器sgfs

前言 想要构建一个Linux文件服务器&#xff1f;看看下面几个要求是不是你想要的&#xff1f; 1、只需要单节点部署就够了 2、部署启动简单&#xff0c;下载之后&#xff0c;一键启动&#xff0c;一键关闭 3、不需要任何其他的依赖安装&#xff0c;而且运行时占用内存资源少 4、…

springboot多数据源配置

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 之前在介绍使用JdbcTemplate和Spring-data-jpa时&#xff0c;都使用了单数据源。在单数据源的情况下&#xff0c;Spring Boot的配置非常…

pyhon量化数据处理小细节3---日期格式转换

不同的数据文档&#xff0c;会获得不同日期格式&#xff0c;常见的有str(20200101),datetime(20200101),又或者是2020-01-01&#xff0c;,2020-1-1,20-1-1&#xff0c;20-Apr_20th,2020/01/01,20/01/01等等&#xff0c;总之类型很多。因此需要我们对日期格式进行统一化。这里我…

面向对象和基于对象

面向对象大家都很熟悉&#xff0c;可是基于对象就不一定了。两个听起来好象是同一回事&#xff0c;而事实上它们却千差万别。基于对象是指&#xff1a;我们采用对象封装技术&#xff0c;将数据和操作捆绑在一起&#xff0c;但是并没有合理地使用多态、继承等面向对象技术进行软…

CSS margin 属性简介

CSS margin 属性 设置外边距的最简单的方法就是使用 margin 属性。 margin 属性接受任何长度单位&#xff0c;可以是像素、英寸、毫米或 em。 margin 可以设置为 auto。更常见的做法是为外边距设置长度值。下面的声明在 h1 元素的各个边上设置了 1/4 英寸宽的空白&#xff1a;h…

MVC中使用代码创建数据库(code first +mysql+EF)

1.新建一个mvc项目 2.安装mysql需要的几个文件 EntityFramework、MySql.Data&#xff08;6.9.12&#xff09;和MySql.Data.Entity &#xff08;6.9.12&#xff09; 这里有几点要注意 1.MySql.Data和MySql.Data.Entity 版本必须一致 2.我试用了6.10的版本 要报错 3.我测试没有问…

github 学习使用

博主第一次使用github&#xff0c;所以会将过程全成描述欢迎使用Github注册安装进入仓库&#xff0c;创建、修改、上传文件。强制推送强制覆盖上传文件欢迎使用Github 注册 直接进入github官网&#xff1a;https://github.com 点击sigh up 进行注册 直接填写即可然后验证通过…

Java中9大内置基本数据类型Class实例和数组的Class实例

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1、Java中9大内置几本数据类型&#xff1a; 对于对象来说,可以直接使用对象.getClass()或者Class.forName(className);、类名.class都可以…

软件质量管理之困境与对策思考

相信在不少与软件开发相关的企业内&#xff0c;质量管理部门与软件开发部门在日常运作中形成了如下图所示的“哑铃形”组织结构。 开发部门执行质量管理部门所制定的流程&#xff0c;通过提供证据的形式将各种流程执行后的数据反馈给质量管理部门&#xff08;包括缺陷率和各种流…

GDI+用PNG图片做半透明异型窗口

{*******************************************************}{ }{ GDI用PNG图片做半透明异型窗口 }{ }{ 版权所有 (C) 2008 QQ:…

java Spring Boot中使用Swagger2构建API文档

1、添加Swagger2的依赖 在pom.xml中加入Swagger2的依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.2.2</version> </dependency> <dependency><groupId&g…

什么是 FreeMarker

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 转自官方文档&#xff0c;只是记录下官方在线手册地址&#xff1a;http://freemarker.foofun.cn/ FreeMarker 是一款 模板引擎&#xff…

TP函数

U方法用于完成对URL地址的组装&#xff0c;特点在于可以自动根据当前的URL模式和设置生成对应的URL地址&#xff0c;格式为&#xff1a;U(地址,参数,伪静态,是否跳转,显示域名);在模板中使用U方法而不是固定写死URL地址的好处在于&#xff0c;一旦你的环境变化或者参数设置改变…

爬虫——————爬取中金所,深交所,上交所期权数据

先从深交所开始&#xff1a;直接上传源码&#xff1a; from bs4 import BeautifulSoup from lxml import etree import pandas as pd import akshare as ak import datetime import requests import csv from contextlib import closing import time from urllib.request impo…

linux下的C语言开发

linux下的C语言开发&#xff08;开篇&#xff09; 在很多人的眼里&#xff0c;C语言和linux常常是分不开的。这其中的原因很多&#xff0c;其中最重要的一部分我认为是linux本身就是C语言的杰出作品。当然&#xff0c;linux操作系统本身对C语言的支持也是相当到位的。作为一个…

sql语法学习

本人数据库目前使用的是sql&#xff0c;主要是使用python语言&#xff0c;然后用pandas调用&#xff08;真的很方便&#xff09;。所以就总结一下&#xff0c;也为自己以后调用数据查找方便使用。 导入包 from sqlalchemy import create_engine import pymssql连接数据库 con…