正题


题目大意

有一颗树,求一条路径长度k,要求S≤k≤ES\leq k\leq ES≤k≤E,求最小的k。


解题思路

其实对于每个点进行点分治,每次将整棵子树的路径加入平衡树,然后在统计一次答案。时间复杂度O(n2)O(n^2)O(n2)。
之后我们发现其实每次就找该子树的重心继续,不用遍历整棵子树。时间复杂度O(能过)O(能过)O(能过)


code

#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;
const int N=100100;
struct node{int to,w,next;
}a[N*3];
set<int> ga;
int siz[N],ls[N],v[N],root,S,E,n,f[N],ans,tot,x,y,w;
void addl(int x,int y,int w)
{a[++tot].to=y;a[tot].w=w;a[tot].next=ls[x];ls[x]=tot;
}
void groot(int x,int fa)//寻找重心
{siz[x]=1;f[x]=0;for(int i=ls[x];i;i=a[i].next)if(a[i].to!=fa&&!v[a[i].to]){groot(a[i].to,x);siz[x]+=siz[a[i].to];f[x]=max(f[x],siz[a[i].to]);}f[x]=max(f[x],n-siz[x]);if (f[x]<f[root]) root=x;
}
void dfs(int x,int fa,int w,int flag)//点分治
{if(flag) ga.insert(w);else{if(S>=w&&w<=E) ans=min(ans,E);int maxs=*--ga.end();if (w+maxs>=S){int fnd=w+*ga.lower_bound(S-w);if (S<=fnd&&fnd<=E) ans=min(ans,fnd);}}for(int i=ls[x];i;i=a[i].next)if (!v[a[i].to]&&a[i].to!=fa)dfs(a[i].to,x,w+a[i].w,flag);
}
void dp(int x)
{v[x]=1;ga.clear();ga.insert(0);for(int i=ls[x];i;i=a[i].next)if(!v[a[i].to]){dfs(a[i].to,x,a[i].w,0);//根到他的路径加入平衡树dfs(a[i].to,x,a[i].w,1);//统计答案}for(int i=ls[x];i;i=a[i].next)if(!v[a[i].to]){n=siz[a[i].to];root=0;groot(a[i].to,0);//寻找重心dp(root);//从重心继续分治}
}
int main()
{scanf("%d%d%d",&n,&S,&E);for(int i=1;i<n;i++){scanf("%d%d%d",&x,&y,&w);addl(x,y,w);addl(y,x,w);}ans=f[0]=2147483647;groot(1,0);dp(root);if(ans>E) ans=-1;printf("%d",ans);
}

nssl1248-B【点分治,平衡树】相关推荐

  1. NKOJ 2703 (WC 2014)紫荆花之恋 (点分治+平衡树+替罪羊)

    P2703[WC2014]紫荆花之恋(强数据版) 问题描述 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花废物的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了 ...

  2. ssl提高组周一备考赛【2018.10.29】

    前言 想去德育基地- 成绩 RankRankRank PersonPersonPerson ScoreScoreScore AAA BBB CCC 111 2017myself2017myself20 ...

  3. python画图绘制紫荆花_数据结构(平衡树,树分治,暴力重构):WC 2014 紫荆花之恋(示例代码)...

    [题目描述] 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花飞舞的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了出来. 仔细看看的话,这棵大树实际上是一个带权 ...

  4. 斜率优化(CDQ分治,Splay平衡树):BZOJ 1492: [NOI2007]货币兑换Cash

    Description Input 第一行两个正整数N.S,分别表示小Y 能预知的天数以及初始时拥有的钱数. 接下来N 行,第K 行三个实数AK.BK.RateK,意义如题目中所述 Output 只有 ...

  5. BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]

    传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...

  6. 【教程】简易CDQ分治教程学习笔记

    前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦!       CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...

  7. NOI2007 货币兑换 - CDQ分治斜率优化dp

    斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...

  8. SGU - 507 启发式合并维护平衡树信息

    题意:给定一颗树,每个叶子节点\(u\)都有权值\(val[u]\),求每个非叶子节点子树的最小叶子距离,若该子树只有一个叶子节点,输出INF 貌似本来是一道树分治(并不会)的题目,然而可以利用平衡树 ...

  9. BZOJ3435[Wc2014]紫荆花之恋——动态点分治(替罪羊式点分树套替罪羊树)

    题目描述 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花飞舞的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了出来.仔细看看的话,这个大树实际上是一个带权树.每 ...

最新文章

  1. Mybatis的selectKey使用
  2. vue项目 预览照片的插件 v-viewer
  3. JAVA里16进制和字节数组互转
  4. Qt通过ODBC读取excel文件
  5. php网页的注册界面设计,HTML开发博客之注册页面设计(一)
  6. 【BZOJ3524】 [Poi2014]Couriers
  7. macOS Mojave 升级到macOS Monterey
  8. 计算机共享文件怎样添加,怎么添加另一台电脑的共享文件夹
  9. 编程机器人考级证书有用吗_机器人编程有等级考试吗?
  10. 【第四章】详解Feign的实现原理
  11. ESP8266串口转wifi模块AT指令调试TCP通信
  12. ztree树默认根据ID默认选中该条数据
  13. 如何从 vue-element-admin 迁移到 Fantastic-admin
  14. 电脑笑脸蓝屏问题 也许你可以尝试一下这个
  15. Roll A Ball
  16. 基于微信平台的电影购票系统设计与实现(程序+论文)
  17. Oracle锁3:DDL锁
  18. NAND FLASH MT29F4G08
  19. 概率DP,递推(麻球繁殖,UVA 11021)
  20. 洞房花烛夜山西人必喝的和气拌汤——西红柿鸡蛋拌汤

热门文章

  1. c语言求平衡因子,平衡二叉树(AVL树)的基本操作
  2. php maximum,解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示...
  3. c语言输入n个数按大小输出,输入n个整数并输出,用c语言表达
  4. drbd heartbeat mysql_Heartbeat+DRBD+MySQL Replication故障处理
  5. linux把终端嵌入桌面,在Ubuntu Linux桌面上嵌入终端窗口
  6. 制作oracle11g yum源,利用安装盘简单制作yum源
  7. python 日期格式校验_python – 如何验证时间格式?
  8. 算法设计与分析——分治与递归——整数划分问题
  9. 算法设计与分析——动态规划——矩阵连乘问题
  10. python resample函数_python时序分析之重采集(resample)