bzoj1468 Tree
2016-05-13 00:24
330 查看
1468: Tree
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1038 Solved: 544
[Submit][Status][Discuss]
Description
给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于KInput
N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下来是kOutput
一行,有多少对点之间的距离小于等于kSample Input
71 6 13
6 3 9
3 5 7
4 1 3
2 4 20
4 7 2
10
Sample Output
5HINT
Source
LTC男人八题系列树的点分治裸题,同poj1741。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #define F(i,j,n) for(int i=j;i<=n;i++) #define D(i,j,n) for(int i=j;i>=n;i--) #define ll long long #define maxn 40005 using namespace std; int n,k,sum,cnt,tot,mn,root,ans; int head[maxn],sz[maxn],mx[maxn],dis[maxn]; bool vst[maxn]; struct edge_type{int next,to,v;}e[maxn*2]; inline int read() { int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } inline void add_edge(int x,int y,int z) { e[++cnt]=(edge_type){head[x],y,z};head[x]=cnt; e[++cnt]=(edge_type){head[y],x,z};head[y]=cnt; } inline void getroot(int x,int fa) { sz[x]=1;mx[x]=0; for(int i=head[x];i;i=e[i].next) { int y=e[i].to; if (!vst[y]&&y!=fa) { getroot(y,x); sz[x]+=sz[y]; mx[x]=max(mx[x],sz[y]); } } mx[x]=max(mx[x],sum-sz[x]); if (mx[x]<mx[root]) root=x; } inline void dfs(int x,int d,int fa) { dis[++tot]=d; for(int i=head[x];i;i=e[i].next) { int y=e[i].to; if (y!=fa&&!vst[y]) dfs(y,d+e[i].v,x); } } inline int calc(int x,int d) { int ret=0; tot=0; dfs(x,d,0); sort(dis+1,dis+tot+1); int i=1,j=tot; while (i<j) { while (dis[i]+dis[j]>k&&i<j) j--; ret+=j-i; i++; }//左端点递增,右端点递减,巧妙的思路 return ret; } inline void solve(int x) { ans+=calc(x,0); vst[x]=true; for(int i=head[x];i;i=e[i].next) { int y=e[i].to; if (!vst[y]) { ans-=calc(y,e[i].v); root=0;sum=sz[y]; getroot(y,0); solve(root); } } } int main() { n=read(); F(i,1,n-1) { int x=read(),y=read(),z=read(); add_edge(x,y,z); } k=read(); mx[0]=sum=n;getroot(1,0); solve(root); printf("%d\n",ans); return 0; }
相关文章推荐
- 表达式求值
- GridView-网格布局案例
- bzoj2152 聪聪可可
- CROS请求
- [Android]使用AIDL进行进程间通信
- neu 1694 Primorial vs LCM 数论
- POJ 1080 DP
- POJ 1080 DP
- 系统参数设计,即用户词典,把一些词组单独放一表中,系统启动即加载到Application中
- 安卓中进行基于Http协议的网络访问基础总结-1
- java8 lambda表达式
- 阿里巴巴常考面试题及汇总答案
- win7上的python脚本无法连接运行在virtualbox上的mongodb
- Android_仿ios状态栏一体化
- 计算使用线性探测、平方探测以及双散列插入的长随机序列所需要的冲突次数
- 一次位运算疑惑
- js中boolean类型的理解
- Jmeter连接Mysql和Mysql编码问题
- 指针二三事
- LinearLayout、RelativeLayout、FrameLayout居中显示