题目

给定一棵树,现在需要找到一条由节点1出发长度为\(x\)的路径,

问最多经过的节点数,重复经过只计算一次(不一定是简单路径)

UVA的那道题多组数据多组询问,边权还不一定是1,\(n\leq 500\)


分析

设\(dp[x][ans][0/1]\)表示在以\(x\)为根的子树内,

经过的节点数为\(ans\),当前答案的终点是否为点\(x\)的最短路径长度

那么

\[dp[x][j+k][0]=\min\{dp[x][j][1]+dp[y][k][0]+w,dp[x][j][0]+dp[y][k][1]+w*2\}
\]
\[dp[x][j+k][1]=\min\{dp[x][j][1]+dp[y][k][1]+w*2\}
\]

由于\(\min\{dp[x][ans][0],dp[x][ans][1]\}\)显然具有单调性,所以可以二分

时间复杂度\(O(T(n^2+Qlog_2n))\)


代码

  1. #include <cstdio>
  2. #include <cctype>
  3. #include <cstring>
  4. #define rr register
  5. using namespace std;
  6. const int N=511; struct node{int y,w,next;}e[N];
  7. int dp[N][N][2],siz[N],as[N],ans[N],n,Test;
  8. inline signed iut(){
  9. rr int ans=0; rr char c=getchar();
  10. while (!isdigit(c)) c=getchar();
  11. while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
  12. return ans;
  13. }
  14. inline void print(int ans){
  15. if (ans>9) print(ans/10);
  16. putchar(ans%10+48);
  17. }
  18. inline signed min(int a,int b){return a<b?a:b;}
  19. inline void dfs(int x){
  20. dp[x][1][0]=dp[x][1][1]=0,siz[x]=1;
  21. for (rr int i=as[x];i;i=e[i].next){
  22. dfs(e[i].y),siz[x]+=siz[e[i].y];
  23. for (rr int j=siz[x]-siz[e[i].y];j;--j)
  24. for (rr int o=siz[e[i].y];o;--o){
  25. dp[x][j+o][0]=min(dp[x][j+o][0],dp[x][j][1]+dp[e[i].y][o][0]+e[i].w);
  26. dp[x][j+o][0]=min(dp[x][j+o][0],dp[x][j][0]+dp[e[i].y][o][1]+e[i].w*2);
  27. dp[x][j+o][1]=min(dp[x][j+o][1],dp[x][j][1]+dp[e[i].y][o][1]+e[i].w*2);
  28. }
  29. }
  30. }
  31. signed main(){
  32. while (1){
  33. n=iut(); if (!n) return 0;
  34. printf("Case %d:\n",++Test);
  35. memset(as,0,sizeof(as)),
  36. memset(dp,42,sizeof(dp));
  37. for (rr int i=1;i<n;++i){
  38. rr int x=iut()+1,F=iut()+1,w=iut();
  39. e[i]=(node){x,w,as[F]},as[F]=i;
  40. }
  41. dfs(1);
  42. for (rr int i=1;i<=n;++i)
  43. ans[i]=min(dp[1][i][0],dp[1][i][1]);
  44. for (rr int Q=iut();Q;--Q){
  45. rr int W=iut();
  46. rr int l=1,r=n;
  47. while (l<r){
  48. rr int mid=(l+r+1)>>1;
  49. if (ans[mid]>W) r=mid-1;
  50. else l=mid;
  51. }
  52. print(l),putchar(10);
  53. }
  54. }
  55. }

#树形dp,二分#UVA1407 Caves 洛谷 3698 [CQOI2017]小Q的棋盘的更多相关文章

  1. BZOJ4813或洛谷3698 [CQOI2017]小Q的棋盘

    BZOJ原题链接 洛谷原题链接 贪心或树形\(DP\)都可做,但显然\(DP\)式子不好推(因为我太菜了),所以我选择贪心. 很显然从根出发主干走最长链是最优的,而剩下的点每个都需要走两步,所以用除去 ...

  2. 洛谷 P3698 [CQOI2017]小Q的棋盘 解题报告

    P3698 [CQOI2017]小Q的棋盘 题目描述 小 Q 正在设计一种棋类游戏. 在小 Q 设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上 ...

  3. 洛谷P3698 [CQOI2017]小Q的棋盘

    传送门 考虑一个贪心,先在根节点周围转一圈,然后再往下走最长链肯定是最优的 然后设最长链的长度为$d$,如果$m\leq d$,那么答案为$m+1$ 否则的话还剩下$m-d+1$步,又得保证能走回来, ...

  4. 洛谷 P3700 - [CQOI2017]小Q的表格(找性质+数论)

    洛谷题面传送门 又是一道需要一些观察的数论 hot tea-- 注意到题目中 \(b·f(a,a+b)=(a+b)·f(a,b)\) 这个柿子长得有点像求解 \(\gcd\) 的辗转相除法,因此考虑从 ...

  5. Luogu 3698 [CQOI2017]小Q的棋盘

    BZOJ 4813 虽然数据范围很迷人,但是想树形$dp$没有前途. 先发现一个事情,就是我们可以先选择一条链,最后要走到这一条链上不回来,走到链上的点每一个只需要一步,而如果要走这条链之外的点,一个 ...

  6. luogu 3698 [CQOI2017]小Q的棋盘 树形dp

    Code: #include <bits/stdc++.h> #define N 107 #define setIO(s) freopen(s".in","r ...

  7. [bzoj4815] [洛谷P3700] [Cqoi2017] 小Q的表格

    Description 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理. 每当小Q不知道如何解决时,就只好向你求助.为了完成任务,小Q需要列一个表格 ...

  8. bzoj 4813: [Cqoi2017]小Q的棋盘 [树形背包dp]

    4813: [Cqoi2017]小Q的棋盘 题意: 某poj弱化版?树形背包 据说还可以贪心... #include <iostream> #include <cstdio> ...

  9. 洛咕 P3700 [CQOI2017]小Q的表格

    洛咕 P3700 [CQOI2017]小Q的表格 神仙题orz 首先推一下给的两个式子中的第二个 \(b\cdot F(a,a+b)=(a+b)\cdot F(a,b)\) 先简单的想,\(F(a,a ...

  10. [BZOJ4813][CQOI2017]小Q的棋盘(DP,贪心)

    4813: [Cqoi2017]小Q的棋盘 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 804  Solved: 441[Submit][Statu ...

随机推荐

  1. git回退至指定版本,并更新远程仓库

    1. git log   查到commit记录 2.复制 commit 后面的id 3. git reset --hard  commit 后面的id   // 回退 4. 强制更新远程仓库  git ...

  2. live555开发笔记(一):live555介绍、windows上msvc2017编译和工程模板

    前言   在pc上搭建流媒体服务器软件,打开视频接受推流,使用live555方案.   live555介绍   Live555是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了标准流媒体传输 ...

  3. pinject依赖注入模块

    pinject 是一个基于 Python 的轻量级依赖注入库,可以方便地实现依赖注入的功能. 下面我们将通过一个简单的示例来演示如何使用 pinject 实现依赖注入. 首先,我们需要安装 pinje ...

  4. django学习第一天---MVC和MTV框架,request对象的属性,url路由系统

    jinja2模板渲染简单使用 下载安装 pip install jinja2 使用示例 html文件中写法 <!DOCTYPE html> <html lang="zh-C ...

  5. 【应用服务 App Service】 App Service Rewrite 实例 -- 限制站点的访问

    问题描述 在Azure App Service中,当需要限制某些特殊的情况对其进行访问时候,可以通过IP限制,逻辑代码判断,或者Rewrite规则.通过IP限制则需要知道客户端访问的IP,而通过逻辑代 ...

  6. 【Azure 应用服务】App Service For Windows 中如何设置代理实现前端静态文件和后端Java Spring Boot Jar包

    问题描述 部署在App Service For Windows 中的网站使用 Java Spring Boot + 静态文件 (浏览器端使用Vue.js 与服务器端Java Spring Boot交互 ...

  7. Linux上使用CMake简单例子

    记录一下自己简单在linux-Ubuntu上用cmake的例子 首先安装cmake sudo apt install cmake 然后创建一个文件夹,里面放点例子代码 main.cpp //main. ...

  8. JAVA 多线程---面经

    线程与进程 提到进程那就要说程序,程序有指令和数据,程序从磁盘加载到内存,cpu获得指令进行执行,其中还会用到各种资源如网络资源,磁盘等.一个程序从磁盘进入内存,就是进程实例的创建. 一个程序可以有多 ...

  9. 通过python获取SSL证书到期时间

    在前面的文章中曾介绍过如何通过openssl命令获取SSL证书的到期时间:通过zabbix监控ssl证书到期时间. 有人反馈实践中这种方式存在缺陷,可能会出现部分域名证书无法获取的情况,报错如下: 1 ...

  10. Python使用pyecharts库构建股票交易 可交互可视化展示——基于Tushare大数据开放社区

    Python使用pyecharts库构建股票交易 可交互可视化展示--基于Tushare大数据社区 1.前言 大家好!欢迎各位访问我的博客,今天给大家分享的是 python使用pyecharts库构建 ...