codeforces293E (树上点分治+树状数组)
和poj1747相比起来,只不过是限制条件多了一维。
而多了这一维,所以需要用树状数组来维护,从而快速得到答案。
因为没注意传进树状数组函数的参数可能是<=0的,导致超时了好久。
#pragma warning(disable:4996)
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <bitset>
#include <algorithm>
#include <iostream>
#include <string>
#include <functional>
const int INF = << ;
typedef __int64 LL;
/**/
const int N = + ; int n, L, W;
struct Edge
{
int to, dis, next;
}g[N*];
struct Node
{
int l, w;
bool operator<(const Node&rhs)const
{
return w < rhs.w;
}
}a[N];
int head[N], e;
int tree[N];
int size[N], p, total, mins, root;
bool vis[N];
LL ans;
int maxL;
int lowbit(int x)
{
return x &(-x);
} //树状数组如果pos<=0,那么会死循环, 卡这里超时了好久。
void modify(int pos, int val)
{
pos += ;
while (pos <= maxL+)
{
tree[pos] += val;
pos += lowbit(pos);
}
}
int getSum(int pos)
{
pos += ;
if (pos <= ) return ;
int ret = ;
while (pos > )
{
ret += tree[pos];
pos -= lowbit(pos);
}
return ret;
} void addEdge(int u, int v, int dis)
{
g[e].to = v;
g[e].dis = dis;
g[e].next = head[u];
head[u] = e++;
} void getRoot(int u, int fa)
{
int maxs = ;
size[u] = ;
for (int i = head[u];i != -;i = g[i].next)
{
int v = g[i].to;
if (v == fa || vis[v]) continue;
getRoot(v, u);
size[u] += size[v];
maxs = std::max(maxs, size[v]);
}
maxs = std::max(maxs, total - size[u]);
if (mins > maxs)
{
mins = maxs;
root = u;
}
}
void getA(int u, int fa, int l, int w)
{
a[p].l = l;
a[p++].w = w;
maxL = std::max(maxL, l);
for (int i = head[u];i != -;i = g[i].next)
{
int v = g[i].to;
if (v == fa || vis[v]) continue;
getA(v, u, l + , w + g[i].dis);
}
} LL counts(int u, int ll, int ww)
{
p = ;
maxL = ;
getA(u, -, ll, ww);
std::sort(a, a + p);
int l = , r = p - ;
LL ret = ;
while (l < r &&a[l].w + a[r].w>W)
r--;
if (l < r)
{
for (int i = l+;i <= r;++i)
modify(a[i].l,);
while (l < r)
{
if (a[l].w + a[r].w <= W)
{
ret += getSum(std::min(L - a[l].l,maxL));
l++;
modify(a[l].l,-);
}
else
{
modify(a[r].l,-);
r--;
}
}
}
return ret;
} void go(int u)
{
vis[u] = true;
ans += counts(u, , );
for (int i = head[u];i != -;i = g[i].next)
{
int v = g[i].to;
if (vis[v]) continue;
ans -= counts(v, , g[i].dis);
mins = INF;
total = size[v];
getRoot(v, -);
go(root);
}
}
int main()
{
scanf("%d%d%d", &n, &L, &W); int u, v, dis;
memset(head, -, sizeof(head));
for (int i = ;i < n;++i)
{
u = i + ;
scanf("%d%d", &v, &dis);
addEdge(u, v, dis);
addEdge(v, u, dis);
}
mins = INF;
total = n;
getRoot(, -);
go(root);
printf("%I64d\n", ans); return ;
}
codeforces293E (树上点分治+树状数组)的更多相关文章
- BZOJ_3262_陌上花开_CDQ分治+树状数组
BZOJ_3262_陌上花开_CDQ分治+树状数组 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的 ...
- 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组
[BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...
- BZOJ 1176 Mokia CDQ分治+树状数组
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
- 【bzoj3262】陌上花开 CDQ分治+树状数组
题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...
- 【BZOJ3460】Jc的宿舍(树上莫队+树状数组)
点此看题面 大致题意: 一棵树,每个节点有一个人,他打水需要\(T_i\)的时间,每次询问两点之间所有人去打水的最小等待时间. 伪·强制在线 这题看似强制在线,但实际上,\(pre\ mod\ 2\) ...
- 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组
题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...
- BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组
BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组 Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , , 之后, ...
- BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组
BZOJ_3295_[Cqoi2011]动态逆序对_CDQ分治+树状数组 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一 ...
- BZOJ_2225_[Spoj 2371]Another Longest Increasing_CDQ 分治+树状数组
BZOJ_2225_[Spoj 2371]Another Longest Increasing_CDQ 分治+树状数组 Description 给定N个数对(xi, yi),求最长上升子 ...
随机推荐
- 一起来开发Android的天气软件(三)——使用Volley实现网络通信
距离上一篇一起来开发Android天气软件二的时间又将近半个月了,之间一直由于有事而没有更新实在抱歉,近期会加快更新的步伐.争取在2015年到来前写完这系列的博文,上一章我们已经使用LitePal框架 ...
- kgdb接收一个数据包详解
0 kdb>kgdb // 可进入kgdb 模式 if (dbg_kdb_mode) { error = kdb_stub(ks); } else ...
- Python标准库:内置函数dict(iterable, **kwarg)
本函数是从可迭代对象来创建新字典.比方一个元组组成的列表,或者一个字典对象. 样例: #dict() #以键对方式构造字典 d1 = dict(one = 1, two = 2, a = 3) pri ...
- MVC3和MVC4中CRUD操作
MVC3中EF实现的CRUD操作 public class HomeController : Controller { // // GET: /Home/ CarModelContainer db = ...
- 3D空间中射线与三角形的交叉检測算法
引言 射线Ray,在3D图形学中有非常多重要的应用.比方,pick操作就是使用射线Ray来实现的,还有诸如子弹射线的碰撞检測等等都能够使用射线Ray来完毕. 所以,在本次博客中,将会简单的像大家介绍下 ...
- flex中在basewidget中不能使用图表组件问题
参考 http://blog.sina.com.cn/s/blog_51e3d0e70101hljz.html
- clearcase 中一些概念和操作
clearcase 中一些概念和操作 视图 常用命令 ClearCase 安装和使用的一些FAQ 参考 ClearCase具体的说是做配置管理的工具,只是SCM管理工具其中的一种.是RATIONAL公 ...
- android面试题 不仅仅是面试是一个很好的学习
下面的问题是在网上找到的总结,感谢您分享!希望,我们的共同进步,找到自己心仪的公司,: 1.android dvm 流程和Linux这个过程.无论是应用程序对同一概念: 答案:dvm是dalivk虚拟 ...
- Spring4 MVC 多文件上传(图片并展示)
开始需要在pom.xml加入几个jar,分别是 <dependency> <groupId>commons-fileupload</groupId> <art ...
- 14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器
14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器 当InnoDB 被开发, 内分配齐 提供了与操作系统和运行库往往缺乏 ...