noiac132 B君的第三题 (树形dp)
本来想用点分治做,结果root又求不对 算的时候还算错了 我好菜啊
结果szr大佬告诉我是树形dp
我好菜啊!!
我们有$\lceil \frac{x}{k} \rceil = \frac{x+(k-x)\%k}{k}$
于是可以把这个拆成两部分来求,最后加在一起再除个k
距离和很好求,连接x和fa[x]的边的贡献就是$size[x]*(N-size[x])$
然后考虑到k很小,我们可以直接记x的子树中到x距离%k=y的个数f[x][y],然后拿这个去算
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define pa pair<ll,ll>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=1e5+,maxk=; inline char gc(){
return getchar();
static const int maxs=<<;static char buf[maxs],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,maxs,stdin),p1==p2)?EOF:*p1++;
}
inline ll rd(){
ll x=;char c=gc();bool neg=;
while(c<''||c>''){if(c=='-') neg=;c=gc();}
while(c>=''&&c<='') x=(x<<)+(x<<)+c-'',c=gc();
return neg?(~x+):x;
} int eg[maxn*][],egh[maxn],ect=;
int N,K,siz[maxn],dcnt[maxk],smsiz,fa[maxn];
ll ans;
bool flag[maxn]; inline void adeg(int a,int b,int c){
eg[++ect][]=b,eg[ect][]=c,eg[ect][]=egh[a],egh[a]=ect;
} void getroot(int x,int f,int &rt,int &mis){
siz[x]=;
int mm=;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==f||flag[b]) continue;
fa[b]=x;getroot(b,x,rt,mis);
siz[x]+=siz[b];mm=max(mm,siz[b]);
}
mm=max(mm,smsiz-siz[x]);
if(mm<mis) rt=x,mis=mm;
} void getdis(int x,int f,int d){
dcnt[d]++;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==f||flag[b]) continue;
getdis(b,x,(d+eg[i][])%K);
}
} inline ll calc(int x,int ini){
ll re=;
CLR(dcnt,);getdis(x,,ini);
for(int i=;i<K;i++){
for(int j=i+;j<K;j++){
re+=1ll*dcnt[i]*dcnt[j]*((K+(K-i-j)%K)%K);
}
}
for(int i=;i<K;i++) re+=1ll*dcnt[i]*(dcnt[i]-)/*((K+(K-i-i)%K)%K);
return re;
} void solve(int x){
flag[x]=;
ans+=calc(x,);
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(flag[b]) continue;
ans-=calc(b,eg[i][]%K);
int rt=,mis=1e9;smsiz=siz[b];
getroot(b,,rt,mis);
siz[fa[rt]]=smsiz-siz[rt];
solve(rt);
}
} void dfs(int x,int f){
siz[x]=;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==f) continue;
dfs(b,x);siz[x]+=siz[b];
ans+=1ll*siz[b]*(N-siz[b])*eg[i][];
}
} int main(){
// freopen("t3.in","r",stdin);
// freopen("t3.out","w",stdout);
int i,j,k;
N=rd(),K=rd();
for(i=;i<N;i++){
int a=rd(),b=rd(),c=rd();
adeg(a,b,c);adeg(b,a,c);
}
smsiz=N;int mis=1e9,rt=;
getroot(,,rt,mis);
solve(rt);
dfs(,);
printf("%lld\n",ans/K);
return ;
}
ZZ点分治
#include<bits/stdc++.h>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
typedef pair<int,int> pa;
const int maxn=1e5+,maxk=; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int eg[maxn*][],egh[maxn],ect;
int dp[maxn][maxk],siz[maxn];
int N,K;
ll ans; inline void adeg(int a,int b,int c){
eg[++ect][]=b,eg[ect][]=c,eg[ect][]=egh[a],egh[a]=ect;
} inline void dfs(int x,int f){
siz[x]=;dp[x][]=;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==f) continue;
dfs(b,x);siz[x]+=siz[b];
ans+=1ll*eg[i][]*(N-siz[b])*siz[b];
for(int j=;j<K;j++)
for(int k=;k<K;k++)
ans+=1ll*((K+(-(j+eg[i][])%K-k)%K)%K)*dp[b][j]*dp[x][k];
for(int j=;j<K;j++)
dp[x][(j+eg[i][])%K]+=dp[b][j];
}
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd(),K=rd();
for(i=;i<N;i++){
int a=rd(),b=rd(),c=rd();
adeg(a,b,c);adeg(b,a,c);
}
dfs(,);
printf("%lld\n",ans/K);
return ;
}
noiac132 B君的第三题 (树形dp)的更多相关文章
- test20181016 B君的第三题
题意 B 君的第三题(haskell) 题目描述 大学四年,我为什么,为什么不好好读书,没找到和你一样的工作. B 君某天看到了这样一个题,勾起了无穷的回忆. 输入\(n, k\) 和一棵\(n\) ...
- test20181015 B 君的第三题
题意 B 君的第三题(zhengzhou) 题目描述 让你在战争和耻辱中做一块选择,你选择耻辱,可你将来还得进行战争. 在平面上有n 个整点(横纵坐标都是整数) B 君想找到一个整点,使得这个点,到所 ...
- test20181018 B君的第三题
题意 B 君的第三题(shenyang) 题目描述 客似云来,万里无云 B 君得到了一个数组\(\{a_1,a_2,\dots,a_n\}\). B 君想通过修改让数组中个每对数都互质. 每次使一个数 ...
- test20181019 B君的第三题
题意 B 君的第三题(urumqi) 题目描述 风雨如晦,鸡鸣不已. B 君最近在研究自己的学长都在做什么工作,每个学长属于一个公司. B 君会获得一些信息,比如x 和y 在相同公司,x 和y 在不同 ...
- POJ-3659-最小支配集裸题/树形dp
Cell Phone Network Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7127 Accepted: 254 ...
- 加分二叉树 vijos1991 NOIP2003第三题 区间DP/树形DP/记忆化搜索
描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都有一 ...
- HDU 4679 Terrorist’s destroy (2013多校8 1004题 树形DP)
Terrorist’s destroy Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Othe ...
- 【uva1380 - 一个调度问题】思路题+树形dp
[题意] 有n<=200个恰好需要一天完成的任务,要求用最少的时间完成所有任务.任务可以同时完成.但是有一些约束,分有向和无向两种,其中A-->B表示A必须在B前面完成,而A--B表示A和 ...
- 【DP_树形DP专题】题单总结
转载自 http://blog.csdn.net/woshi250hua/article/details/7644959#t2 题单:http://vjudge.net/contest/123963# ...
随机推荐
- Jmeter使用笔记之html报告扩展(一)
题记:在用loadrunner的时候可以生成一个HTML的报告,并且里面包含各种图表,各种详细的数据.而在使用Jmeter测试完后并不能直接生成Html 的报告(无论是用GUI还是命令行启动). 经过 ...
- Oracle Profile 配置文件
Profile是用户的配置文件,它是密码限制,资源限制的命名集合.利用profile 可以对数据库用户进行基本的资源管理,密码管理. 1 创建profile 的语法 create profile pr ...
- 428.x的n次幂
实现 pow(x,n) 不用担心精度,当答案和标准输出差绝对值小于1e-3时都算正确 样例 Pow(2.1, 3) = 9.261 Pow(0, 1) = 0 Pow(1, 0) = 1 挑战 O(l ...
- vue-cli3.0之vue.config.js的配置项(注解)
module.exports = { // 部署应用时的基本 URL baseUrl: process.env.NODE_ENV === 'production' ? '192.168.60.110: ...
- PermGen space 内存溢出
1.修改D:\tools\tomcat\tomcat - 7\apache-tomcat-7.0.91\bin tomcat 路径下bin 文件的catalina.bat文件 添加 JAVA_OPTS ...
- 修改tomcat控制台title的方法
修改tomcat控制台title的方法,参考:http://www.jspkongjian.net/news.jsp?id=1125,具体如图:
- vue axios 封装(一)
封装一: 'use strict' import axios from 'axios' import qs from 'qs' import NProgress from 'nprogress' im ...
- EChart.js 笔记一
一直对数据可视化比较感兴趣,当年 Alibaba 年报晚会上的大屏显示可谓是技惊四座,够震撼,将数据之美展现得淋漓尽致. 国内的前端数据可视化插件中,echart.js 算是热度很高的,也容易上手,算 ...
- How to install rime on Debian
apt-get install ibus ibus-rime librime-data-wubi reboot cp ~/.config/ibus/rime/default.yaml ~/.confi ...
- Redux学习(2) ----- 异步和中间件
Redux中间件,其实就是一个函数, 当我们发送一个action的时候,先经过它,我们就可以对action进行处理,然后再发送action到达reducer, 改变状态,这时我们就可以在中间件中,对a ...