题意

B 君的第三题(haskell)

题目描述

大学四年,我为什么,为什么不好好读书,没找到和你一样的工作。

B 君某天看到了这样一个题,勾起了无穷的回忆。

输入\(n, k\) 和一棵\(n\) 个点的树,有边权,没有点权。两点\(i, j\) 之间的距离\(D(i, j)\) 定义为路径上的边权和。求

\[\sum_{1 \leq i < j \leq n} \left\lceil \frac{D(i,j)}{k} \right\rceil
\]

换句话说,枚举无序的两个点,求出距离除以\(k\) 上取整的和。

输入格式

输入第一行包含两个整数\(n, k\)。

接下来\(n-1\) 行,每行三个整数\(x, y, z\),表示\(x\) 和\(y\) 之间有一条边,边权为\(z\)。

输出格式

输出一行一个整数,表示答案。

样例输入

4 6

1 2 2

1 3 3

1 4 4

样例输出

7

数据规模与约定

对于100% 的数据,满足\(1 \leq n \leq 100000, 1 \leq k \leq 10\)。

对于100% 的数据,满足\(1 \leq x, y \leq n, 1 \leq z \leq 10\)。

对于30% 的数据,满足\(n \leq 1000\)。

对于另20% 的数据,满足\(k = 1\)。

对于另20% 的数据,满足\(k = 2\)。

分析

先考虑没有取整的情况,是一个经典题。

然后考虑有多少条路径模 k 余 1, 2, . . .。

这题是NOI2011道路修建和BZOJ2152聪聪可可改编而成的一道好题。

\[\lceil \frac{x}{k} \rceil = \frac{x + k - x \mod{k}}{k}
\]

所以我们需要求出分别有多少路径模k等于1,2,..k-1。

考虑dp。

用\(f(i,j)\)表示i的子树中有多少点到i的距离mod k = j,\(c(i)\)表示全局有多少路径mod k = i。

f、c都能在dfs的时候求出,注意顺序,不能用子树乘自己本身的方案。

代码

#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#define rg register
#define il inline
#define co const
#pragma GCC optimize ("O0")
using namespace std;
template<class T> il T read(rg T&x)
{
rg T data=0;
rg int w=1;
rg char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff; const int MAXN=1e5+7,MAXK=11;
int n,k; struct Edge
{
int nx,to,w;
}E[MAXN<<1];
int head[MAXN],ecnt; void addedge(rg int x,rg int y,rg int w)
{
E[++ecnt].to=y,E[ecnt].w=w;
E[ecnt].nx=head[x],head[x]=ecnt;
} int siz[MAXN];
int f[MAXN][MAXK];
ll c[MAXN];
ll ans; il void dfs(rg int x,rg int fa)
{
siz[x]=1;
f[x][0]=1;
for(rg int i=head[x];i;i=E[i].nx)
{
rg int y=E[i].to,w=E[i].w;
if(y==fa)
continue;
dfs(y,x);
siz[x]+=siz[y];
ans += (ll) (n - siz[y]) * siz[y] * w;
for(rg int p=0;p<k;++p)
for(rg int q=0;q<k;++q)
c[(p + q + w) % k] += f[x][p] * f[y][q];
for(rg int j=0;j<k;++j)
f[x][(j + w) % k] += f[y][j];
}
} int main()
{
freopen("haskell.in","r",stdin);
freopen("haskell.out","w",stdout);
read(n);read(k);
for(rg int i=1;i<n;++i)
{
rg int x,y,w;
read(x);read(y);read(w);
addedge(x,y,w);
addedge(y,x,w);
}
dfs(1,0);
for(rg int i=1;i<k;++i)
{
ans += (k-i) * c[i];
}
printf("%lld\n",ans/k);
// fclose(stdin);
// fclose(stdout);
return 0;
}

test20181016 B君的第三题的更多相关文章

  1. test20181015 B 君的第三题

    题意 B 君的第三题(zhengzhou) 题目描述 让你在战争和耻辱中做一块选择,你选择耻辱,可你将来还得进行战争. 在平面上有n 个整点(横纵坐标都是整数) B 君想找到一个整点,使得这个点,到所 ...

  2. test20181018 B君的第三题

    题意 B 君的第三题(shenyang) 题目描述 客似云来,万里无云 B 君得到了一个数组\(\{a_1,a_2,\dots,a_n\}\). B 君想通过修改让数组中个每对数都互质. 每次使一个数 ...

  3. test20181019 B君的第三题

    题意 B 君的第三题(urumqi) 题目描述 风雨如晦,鸡鸣不已. B 君最近在研究自己的学长都在做什么工作,每个学长属于一个公司. B 君会获得一些信息,比如x 和y 在相同公司,x 和y 在不同 ...

  4. noiac132 B君的第三题 (树形dp)

    传送门 本来想用点分治做,结果root又求不对 算的时候还算错了 我好菜啊 结果szr大佬告诉我是树形dp 我好菜啊!! 我们有$\lceil \frac{x}{k} \rceil = \frac{x ...

  5. shanquan2的两年三题系列

    好像只有2个月就退役啦 不管了,先说一下哪三题:多点求值.lcm.替罪羊树(bzoj3065) [upd0]2016.3.29 多点求值A掉啦,myy卡常数sxbk(不是说好的是shanquan2出的 ...

  6. Java-集合-第三题 有如下Student 对象, private String name; private int age; private int score; private String classNum; 其中,classNum 表示学生的班号,例如“class05”。 有如下List List list = new ArrayList(); l

    第三题 有如下Student 对象, private String name; private int age; private int score; private String classNum; ...

  7. NOIP 2008提高组第三题题解by rLq

    啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...

  8. NOIP2008提高组(前三题) -SilverN

    此处为前三题,第四题将单独发布 火柴棒等式 题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0 ...

  9. 《学习OpenCV》练习题第四章第三题b

    #include <highgui.h> #include <cv.h> #include "opencv_libs.h" /* *<学习OpenCV ...

随机推荐

  1. CCPC 2016-2017, Finals Solution

    A - The Third Cup is Free 水. #include<bits/stdc++.h> using namespace std; ; int n; int arr[max ...

  2. Android SurfaceView入门学习

    学习资料: Android 开发群英传 搜索学习资料时,搜到了罗升阳老师的Android视图SurfaceView的实现原理分析,老罗老师写的一系列博客,一年前开始学习Android时看不懂,现在依然 ...

  3. Django快速搭建博客系统

    Django快速搭建博客系统 一.开发环境 Windows 7(64bit) python 3.6   https://www.python.org/ Django 2.0  https://www. ...

  4. Coursera SDN M1.2.1 SDN History: Programmable Networks 1

    接上第二点 NOTE (2)active networks => Programmability in networks(1990s) Sturcture: What are active ne ...

  5. mysql获取随机数据的方法

    order by rand() 数据多了极慢,随机性非常好,适合非常小数据量的情况. 复制代码 代码如下: SELECT * FROM table_name AS r1 JOIN (SELECT (R ...

  6. JAVA基础知识详解

    1. JVM是什么 JVM是Java Virtual Mechine的缩写.它是一种基于计算设备的规范,是一台虚拟机,即虚构的计算机. JVM屏蔽了具体操作系统平台的信息(显然,就像是我们在电脑上开了 ...

  7. 【SQL Server高可用性】数据库复制:SQL Server 2008R2中数据库复制

    经常在论坛中看到有人问数据同步的技术,如果只是同步少量的表,那么可以考虑使用链接服务器+触发器,来实现数据同步,但当要同步的数据表比较多,那么可以考虑用数据库复制技术,来实现数据的同步. 一.使用场景 ...

  8. 豆知识( DNS; HTTP入门;网络协议)

    DNS入门知识 DNS服务器 通过DNS服务器,才能知道某个域名的IP地址到底是什么. Linux系统里面,DNS服务器的IP地址保存在/etc/resolv.conf文件 使用工具软件dig可以查询 ...

  9. 基于Oracle的SQL优化(崔华著)-整理笔记-工具集

    一.脚本display_cursor_9i.sql是可以得到SQL的真实执行计划,使用示例 使用示例,请看以下case 1.执行测试sql: SELECT T1.*,T2.* FROM T_0504 ...

  10. 移动前端兼容性笔记 - 安卓2.x 自带原生浏览器箭头问题

    这样的箭头用CSS-3实现,整段代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta c ...