BZOJ 3365 Distance Statistics 树的点分治

题目大意:同POJ1741

链接:http://blog.csdn.net/popoqqq/article/details/39959803

和POJ1741一样的题,土豪题,POJ有道一样的题,做完1741可以水水

我会告诉你我直接改了下上题的代码么0.0

数据范围4W 距离最大1000 不会爆INT 放心写吧

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 40400
using namespace std;
struct abcd{
	int to,f,next;
	bool ban;
}table[M<<1];
int head[M],tot=1;
int n,m,k,ans;
int siz[M],fa[M],dist[M];
int stack[M],top;
void Add(int x,int y,int z)
{
	table[++tot].to=y;
	table[tot].f=z;
	table[tot].next=head[x];
	head[x]=tot;
	table[tot].ban=0;
}
void Get_Centre_Of_Gravity(int x,int size,int &cg)
{
	int i;
	bool flag=1;
	siz[x]=1;
	for(i=head[x];i;i=table[i].next)
		if(!table[i].ban)
			if(table[i].to!=fa[x])
			{
				fa[table[i].to]=x;
				Get_Centre_Of_Gravity(table[i].to,size,cg);
				if(siz[table[i].to]>size>>1)
					flag=0;
				siz[x]+=siz[table[i].to];
			}
	if(size-siz[x]>size>>1)
		flag=0;
	if(flag)
		cg=x;
}
void DFS1(int x,int dis)
{
	int i;
	dist[x]=dis;
	for(i=head[x];i;i=table[i].next)
	{
		if(table[i].ban)
			continue;
		if(table[i].to==fa[x])
			continue;
		fa[table[i].to]=x;
		DFS1(table[i].to,dis+table[i].f);
	}
}
void DFS2(int x)
{
	int i;
	stack[++top]=dist[x];
	for(i=head[x];i;i=table[i].next)
	{
		if(table[i].ban)
			continue;
		if(table[i].to==fa[x])
			continue;
		DFS2(table[i].to);
	}
}
int Calculate(int root)
{
	int i,j,re=0;
	top=0;
	DFS2(root);
	sort(stack+1,stack+top+1);
	for(i=1,j=top;i<=top;i++)
	{
		for(;j&&stack[j]+stack[i]>k;j--);
		re+=j;
	}
	return re;
}
void Tree_Divide_And_Conquer(int root,int size)
{
	int i,cg;
	fa[root]=0;
	Get_Centre_Of_Gravity(root,size,cg);
	siz[fa[cg]]=size-siz[cg];
	fa[cg]=0;
	DFS1(cg,0);
	ans+=Calculate(cg);
	for(i=head[cg];i;i=table[i].next)
		if(!table[i].ban)
		{
			table[i].ban=table[i^1].ban=1;
			ans-=Calculate(table[i].to);
			Tree_Divide_And_Conquer(table[i].to,siz[table[i].to]);
		}
}
int main()
{
	int i,x,y,z;
	char p[10];
	cin>>n>>m;
	for(i=1;i<n;i++)
		scanf("%d%d%d%s",&x,&y,&z,p),Add(x,y,z),Add(y,x,z);
	cin>>k;
	Tree_Divide_And_Conquer(1,n);
	cout<<(ans-n>>1)<<endl;
}
时间: 2024-10-28 19:18:44

BZOJ 3365 Distance Statistics 树的点分治的相关文章

POJ 1987 BZOJ 3365 Distance Statistics 树的分治(点分治)

题目大意:(同poj1741,刷一赠一系列) CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 40010 #define INF 0x3f3f3f3f using namespace std; int points,edges,k; int head[MAX],total; int next[MAX <<

POJ 1987 Distance Statistics 树分治

Distance Statistics Description Frustrated at the number of distance queries required to find a reasonable route for his cow marathon, FJ decides to ask queries from which he can learn more information. Specifically, he supplies an integer K (1 <= K

BZOJ 4012 HNOI2015 开店 树的边分治

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4012 题意概述:给出一颗N点的树,保证树上所有点的度不超过3,树上每个点有权值,每条边有权值,现在有Q组询问,每组给出信息u,L,R,问点权在区间[L,R]的点到点u的距离和为多少.强制在线. N<=150000,Q<=200000. 可能这是我这几天做过的题里面最水但是最码的一个了.... 实际上看见树上所有点的度不超过3就感觉可以用边分治做,具体的思路实际上很简单,建立一个边分治结

BZOJ 3672 NOI2014 购票 树的点分治+斜率优化

题目大意:给定一棵以1为根的有根树,每条边有边权,每个点有三个值pi,qi,li 从一个点可以走到它的某个祖先处,前提是距离d不超过li,花销为pi*d+qi 求从每个点到达根节点的最小花销 这道题的上一份题解:http://blog.csdn.net/popoqqq/article/details/39009219 很不幸我作死去重写了一发233 之前的写法真是SB的1B... 为何要暴力- - 明明是分治结构直接排序不行么- - 简述一下做法: 0.先推出斜率优化的动归方程 1.找到当前分治

bzoj 3435: [Wc2014]紫荆花之恋 替罪羊树维护点分治 &amp;&amp; AC400

3435: [Wc2014]紫荆花之恋 Time Limit: 240 Sec  Memory Limit: 512 MBSubmit: 159  Solved: 40[Submit][Status][Discuss] Description 强 强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花飞舞的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了出来. 仔细看看的话,这个大树实际上是一个带权树.每个时刻它会长出一个新的叶子节点.每个节点上有一个可爱的小精灵,

bzoj 2152: 聪聪可可 树的点分治

2152: 聪聪可可 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 485  Solved: 251[Submit][Status] Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏.他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个“

【bzoj3362/3363/3364/3365】[Usaco2004 Feb]树上问题杂烩 并查集/树形dp/LCA/树的点分治

题目描述 农夫约翰有N(2≤N≤40000)个农场,标号1到N,M(2≤M≤40000)条的不同的垂直或水平的道路连结着农场,道路的长度不超过1000.这些农场的分布就像下面的地图一样, 图中农场用F1..F7表示, 每个农场最多能在东西南北四个方向连结4个不同的农场.此外,农场只处在道路的两端.道路不会交叉且每对农场间有且仅有一条路径.邻居鲍伯要约翰来导航,但约翰丢了农场的地图,他只得从电脑的备份中修复了.每一条道路的信息如下: 从农场23往南经距离10到达农场17 从农场1往东经距离7到达农

POJ1987——Distance Statistics

Distance Statistics Time Limit: 2000MS   Memory Limit: 64000K Total Submissions: 1667   Accepted: 532 Case Time Limit: 1000MS Description Frustrated at the number of distance queries required to find a reasonable route for his cow marathon, FJ decide

poj 1741(树的点分治)

Tree Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define dist(u,v)=The min distance between node u and v. Give an integer k,for every pair (u,v) of vertices is called valid if and only if dist(u,v) not exceed k