当前位置: 首页 > news >正文

Codeforces 771C:Bear and Tree Jumps

Codeforces 771C:Bear and Tree Jumps

题目链接:http://codeforces.com/problemset/problem/771/C

题目大意:给出一个$n(2 \leqslant n \leqslant 200,000)$个结点的无根树及整数$k(1 \leqslant k \leqslant 5)$,求$\sum f(s,t),(s<t)$,其中$f(s,t)=\lceil \frac{dis(s,t)}{k} \rceil$.

树形DP

设$dis(u,v)$为$u$到$v$的简单路径长度,则$f(u,v)=\lceil \frac{dis(u,v)}{k} \rceil=\frac{dis(u,v)+L(u,v)}{k}$,于是问题就转化为求$\sum dis(u,v)$和$\sum L(u,v)$.

$\sum dis(u,v)$可以很容易求得:任取一结点为根,每条边的贡献为$num[x] \times (n-num[x])$,其中$x$为该边的子结点,$num[x]$为$x$的子树的结点个数.

关键在于求$\sum L(u,v)$.定义$dp[i][j]$为从$i$的子树出发到达$i$结点,简单路径长度模$k$为$j$的个数.设$u$为$v$的父节点,根据$dp[u][i]$和$dp[v][j]$,可以求得包含$u$,$v$结点的路径长模为$(i+j+1)\%k$的路径数为$dp[u][i] \times dp[v][j]$条,从而可以求出相应的$\sum L(x,y)$.转移方程为$dp[u][(i+1)\%k]=dp[u][(i+1)\%k]+dp[v][i]$.

于是$ans=\sum \frac{dis(u,v)+L(u,v)}{k}$,复杂度为$O(nk^2)$

代码如下:

 1 #include <iostream>
 2 #include <vector>
 3 #include <cstring>
 4 #define N 200005
 5 using namespace std;
 6 typedef long long ll;
 7 int n,k;
 8 ll ans,dp[N][6],sum[N];
 9 vector<int>e[N];
10 ll dfs(int u,int pre){
11     dp[u][0]=sum[u]=1;
12     for(int t=0;t<(int)e[u].size();++t){
13         int v=e[u][t];
14         if(v!=pre){
15             sum[u]+=dfs(v,u);
16             for(int i=0;i<k;++i)
17             for(int j=0;j<k;++j){
18                 ll need=(k-(i+j+1)%k)%k;//when k-(i+j+1)%k==kor0 it need not add;
19                 ans+=need*dp[u][i]*dp[v][j];
20             }
21             for(int i=0;i<k;++i)
22                 dp[u][(i+1)%k]+=dp[v][i];
23         }
24     }
25     ans+=sum[u]*(n-sum[u]);
26     return sum[u];
27 }
28 int main(void){
29     std::ios::sync_with_stdio(false);
30     cin>>n>>k;
31     for(int i=1;i<n;++i){
32         int u,v;
33         cin>>u>>v;
34         e[u].push_back(v);
35         e[v].push_back(u);
36     }
37     dfs(1,-1);
38     cout<<ans/k;
39 }

 

转载于:https://www.cnblogs.com/barrier/p/6583088.html

相关文章:

  • 胡适:一个最低限度的国学书目
  • 网站功能小Demo——图片文件上传
  • Linux常用命令汇总
  • 科普:Netcat使用手册
  • 磁化强度
  • rpc 理解
  • spark使用
  • 基于 html5的 jquery 轮播插件 flickerplate
  • 定义运算符
  • [转]ZooKeeper 集群环境搭建 (本机3个节点)
  • https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins
  • 《大学章句》光剑续编
  • 犀牛Phinoceros 如何切换中文语言
  • Spring4-EL中正则表达式的使用
  • web开发之Cookie使用
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 2018一半小结一波
  • avalon2.2的VM生成过程
  • CentOS从零开始部署Nodejs项目
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • Koa2 之文件上传下载
  • supervisor 永不挂掉的进程 安装以及使用
  • Swift 中的尾递归和蹦床
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 聚类分析——Kmeans
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 使用docker-compose进行多节点部署
  • 通过git安装npm私有模块
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 以太坊客户端Geth命令参数详解
  • 原生js练习题---第五课
  • 自定义函数
  • 1.Ext JS 建立web开发工程
  • #etcd#安装时出错
  • #git 撤消对文件的更改
  • (14)Hive调优——合并小文件
  • (c语言)strcpy函数用法
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (编译到47%失败)to be deleted
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (推荐)叮当——中文语音对话机器人
  • (转)jQuery 基础
  • .Net 8.0 新的变化
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net core使用ef 6
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布