POJ1741&&BZOJ1468 男人八题
来源:互联网 发布:臭氧消毒知乎 编辑:程序博客网 时间:2024/06/05 08:40
去年这个时候就做这道题了 那个时候完全不懂
今天重新来学了一下点分治 发现自己很多不会
没有照着别人的程序打点分治的时候思路很乱 可能是自己太弱了
后来看了黄学长的代码发现有些东西我打的太复杂了。。。。
然后我就像到了一个新世界
每次都去找中心就好了。。。。
#include<cstdio>#include<iostream>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;char c;bool flag;inline void read(int &a){a=0,flag=false;do c=getchar();while(c!='-'&&(c<'0'||c>'9'));if(c=='-')flag=true,c=getchar();while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar(); if(flag)a=-a;}int root;struct Chain{Chain *next;int u,len;Chain(){next=NULL;}}*Head[100001];bool choose[10001];int sum;int Max[100001],son[100001];void Get_Root(int u,int fa){son[u]=1;Max[u]=0;for(Chain *tp=Head[u];tp;tp=tp->next){if(tp->u==fa||choose[tp->u])continue;Get_Root(tp->u,u);son[u]+=son[tp->u];Max[u]=max(Max[u],son[tp->u]);}Max[u]=max(Max[u],sum-son[u]);if(Max[u]<Max[root])root=u;}int deep[100001];inline void addside(int a,int b,int len){Chain *tp=new Chain;tp->u=b,tp->len=len,tp->next=Head[a];Head[a]=tp;swap(a,b); tp=new Chain;tp->u=b,tp->len=len,tp->next=Head[a];Head[a]=tp;}int D[100001];inline void De(int u,int fa){for(Chain *tp=Head[u];tp;tp=tp->next) if(tp->u!=fa&&!choose[tp->u]) D[tp->u]=D[u]+tp->len,deep[++deep[0]]=D[tp->u],De(tp->u,u);}int k;int Sol_dep(int u,int delta){int res=0; deep[0]=0; D[u]=deep[++deep[0]]=delta; De(u,u); sort(deep+1,deep[0]+deep+1); int l=1,r=deep[0]; while(l<r) { if(deep[l]+deep[r]>k) r--; else res+=r-l,l++; } return res;}int ans;int Div(int u){ans+=Sol_dep(u,0);choose[u]=true;for(Chain *tp=Head[u];tp;tp=tp->next) { if(choose[tp->u])continue; ans-=Sol_dep(tp->u,tp->len); sum=son[tp->u]; root=0; Get_Root(tp->u,root); Div(root); }}int main(){ int a,b,c;while(true){int n;read(n),read(k);memset(choose,false,sizeof(choose));if(!n)return 0;for(int i=1;i<=n;i++) Head[i]=NULL;for(int i=1;i<n;i++) { read(a),read(b),read(c),addside(a,b,c); }sum=n;root=0;Max[0]=1<<29;ans=0;Get_Root(1,0);Div(root);printf("%d\n",ans);}return 0;}
0 0
- POJ1741&&BZOJ1468 男人八题
- 楼教主男人八题--POJ1741--点分治
- [POJ1741][BZOJ1468]经典点分题
- POJ1741 Tree(BZOJ1468)
- Cogs 1714. [POJ1741][男人八题]树上的点对(点分治)
- 【楼天城男人八题】【树分治|Treap+启发式合并】POJ1741 Tree
- 楼天成男人8题(树的分治-POJ1741)
- ltc男人八题
- 男人八题系列
- 男人八题
- 男人八题总结
- 男人八题coins
- bzoj1468
- 楼教主男人八题之poj1743
- poj 1741 Tree 据说是男人八题
- POJ 1741(男人八题)
- POJ1742.Coins(背包DP && 男人八题)
- POJ 1741 Tree (男人八题
- C#类型基础----不可变类型
- Yii的日志的处理机制以及扩展案例
- Thinking in Java 读书笔记(一) --对象导论
- HDU 1003 Max Sum (DP)
- json和object之间相互转换
- POJ1741&&BZOJ1468 男人八题
- 2015年总结
- Java 字符串索引indexOf
- 代理模式
- BZOJ-1433 假期的宿舍 最大流+基础建图
- 全面解析Linux 内核 3.10.x - 进程链表
- 第一次面试经历
- 基于RaspberryPi 2 model B 的游戏机
- UI期的基础类 UIView 基本运行顺序