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),求最长上升子 ...
随机推荐
- HashSet的排序
import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util ...
- Codeforces Round #218 (Div. 2)
500pt, 题目链接:http://codeforces.com/problemset/problem/371/A 分析:k-periodic说明每一段长度为k,整个数组被分成这样长度为k的片段,要 ...
- ABP启动配置
ABP启动配置 返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行 ...
- vc中改变对话框的背景色
---- 笔者曾在<软件报>2000年第5期中讨论过如何改变控件的颜色,但还有相当一部分的读者来信提问:一个基于对话框的MFC AppWizard应用程序中,如何改变对话框的背景颜色呢?对 ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(四)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(四) 4.索引对搜索排序的影响 搜索的时候,同一个搜索关键字和同一份索引,决定了一个结果,不但决定了结果的集合,也确定了结果的顺序.那个 ...
- C#日期函数使用大全
1 DateTime dt = DateTime.Now; 2 3 dt.ToString();//2005-11-5 13:21:25 4 5 dt.ToFileTime().ToString(); ...
- 深入分析 Java 中的中文编码问题(1)
几种常见的编码格式 为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答这个问题必须要回到计算机是如何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的语言 ...
- C++ 多源码文件简单组织
C++ 多源码文件简单组织 基本上和C的是一样的,只不过C++的方法要在类中声明.看一个简单实例.ainimal.h 类里面对外公开的信息. 点击(此处)折叠或打开 #ifndef _ANIMAL_ ...
- Java 螺纹第三版 第一章Thread介绍、 第二章Thread创建和管理学习笔记
第一章 Thread导论 为何要用Thread ? 非堵塞I/O I/O多路技术 轮询(polling) 信号 警告(Alarm)和定时器(Timer) 独立的任务(Ta ...
- SharePoint 内容部署-PowerShell
1. 创建一个新的内容部署路径 New-SPContentDeploymentPath –Name "Marketing Internet Content" –SourceSPWe ...