[莫队算法] WHU Problem 1605 - Distance on Tree
来源:互联网 发布:数据库设计第三范式 编辑:程序博客网 时间:2024/06/04 01:05
Problem 1605 - Distance on Tree
题意:
一棵树有N个节点,标号从0开始,再给一个常数k,0号点以外的任意节点i和i/k号点有一条边,边权是i。
每次询问
题解:
显然0号点是树根。
对于
然后假设我们已经求得
其中两项容易算出:
然后就是要快速算出
要算
因为这一维护过程,
代码里面用len维护
#include<stdio.h>#include<math.h>#include<algorithm>typedef long long ll;const int N = 10005;const int MAXQ = 10005;struct qry{ int l, r, id, bk; bool operator < (const qry &a)const{ if(bk != a.bk) return bk < a.bk; return r < a.r; }}Q[MAXQ];int n, k, q, f[N];int unit;ll mk[N], dis[N];ll ans, sumdis, len;ll anss[N];void add(int x){ ans += len*dis[x] + sumdis; sumdis += dis[x], len += 1; while(x){ ans -= 2*mk[x]; mk[x] += x; x = f[x]; }}void del(int x){ sumdis -= dis[x], len -= 1; ans -= len*dis[x] + sumdis; while(x){ mk[x] -= x; ans += 2*mk[x]; x = f[x]; }}int main(){ while(scanf("%d%d%d", &n, &k, &q) != EOF){ ans = sumdis = 0, len = 0; for(int i = 1; i < n; ++i){ f[i] = i/k; dis[i] = dis[f[i]]+i; mk[i] = 0; } unit = int(sqrt(n)+0.5); for(int i = 1; i <= q; ++i){ Q[i].id = i; scanf("%d%d", &Q[i].l, &Q[i].r); Q[i].bk = Q[i].l/unit; } std::sort(Q+1, Q+q+1); int l = 1, r = 0; for(int i = 1; i <= q; ++i){ while(r < Q[i].r) add(++r); while(r > Q[i].r) del(r--); while(l < Q[i].l) del(l++); while(l > Q[i].l) add(--l); anss[Q[i].id] = ans; } for(int i = 1; i <= q; ++i) printf("%lld\n", anss[i]); }}
- [莫队算法] WHU Problem 1605 - Distance on Tree
- WOJ 1605 Distance on Tree(莫队算法)
- whuProblem 1605 - Distance on Tree
- [CODECHEF]Prime Distance On Tree
- CodeChef PRIMEDSTPrime Distance On Tree
- [CC]Prime Distance On Tree
- WHU-1551-Pairs(莫队算法+分块实现)
- whu oj 1551 Pairs (莫队算法)
- WHU Contest Problem J.
- 【CodeChef PRIMEDST】Prime Distance On Tree
- codechef Prime Distance On Tree FFT
- 【spoj】【COT2 - Count on a tree II】【莫队算法】
- CC Prime Distance On Tree (树的点分治 + FFT)
- Codechef Prime Distance On Tree(点分治+FFT)
- 素数路径 Prime Distance On Tree 点分治+FFT
- codechef Prime Distance On Tree(树分治+fft)
- 解题报告:Prime Distance On Tree 点分治 + FFT
- whu Problem 1464 - Deal with numbers
- c++中减字符0的作用
- 如果时间不够 ,无法进行充分的测试怎么办?
- c专家编程3、4章读书笔记
- 共享内存
- 在类中使用类成员函数创建线程
- [莫队算法] WHU Problem 1605 - Distance on Tree
- 消息队列通讯
- Unable to get package info for [包路径]; is package not installed
- HDU 1253
- 由于没有详细了解Timestamp和Date之间的关系犯的错
- 自定义View,ViewGroup
- 多线程程序设计
- JVM系列2:垃圾收集器与内存分配策略
- TCP/IP卷一(第二章学习)