传送门

文章目录

  • 题意:
  • 思路:

题意:

给你一个有nnn个点的树,有mmm个点拥堵,连接两个点的一条边有一个美丽值,让你选择一个路径,使其经过的拥堵点数不超过kkk且美丽值最大。
n≤2e5,m≤n,k≤mn\le2e5,m\le n,k\le mn≤2e5,m≤n,k≤m

思路:

真恶心啊,这个题还卡时间。
明显的点分治的题了,在求不超过kkk的拥堵点数且美丽值最大的时候,明显这是一个前缀最大值,我们用树状数组维护一下即可。
在遍历一颗子树的时候,需要先更新答案,再将这个子树的信息更新到trtrtr数组里,注意更新答案的时候需要算上根的拥堵值,更新信息的时候不能算上根的拥堵值。
让后重置树状数组的时候,需要记录一下更新了那些值,让后更新即可,不能暴力更新。
还有一个坑就是最后答案需要跟000取maxmaxmax,因为可以美丽值为000。
复杂度O(nlog2n)O(nlog^2n)O(nlog2n)

// Problem: B - Free tour II
// Contest: Virtual Judge - 点分治
// URL: https://vjudge.net/contest/418073#problem/B
// Memory Limit: 1572 MB
// Time Limit: 100 ms
//
// Powered by CP Editor (https://cpeditor.org)#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
#define lowbit(x) ((x)&(-x))
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=200010,M=N*2,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m,k;
int e[M],ne[M],h[N],w[M],idx;
bool st[N];
int dis[N],tr[N],a[N],se;
vector<int>v,used;void add(int a,int b,int c) {e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}int get_size(int u,int fa) {if(st[u]) return 0;int sum=1;for(int i=h[u];~i;i=ne[i]) {int j=e[i];if(j==fa) continue;sum+=get_size(j,u);}return sum;
} int get_wc(int u,int fa,int tot,int &wc) {if(st[u]) return 0;int sum=1,mx=0;for(int i=h[u];~i;i=ne[i]) {int j=e[i];if(j==fa) continue;int now=get_wc(j,u,tot,wc);sum+=now; mx=max(mx,now);}mx=max(mx,tot-sum);if(mx<=tot/2) wc=u;return sum;
}// void get_dis(int u,int fa,int sum,int ww) {// if(st[u]) return;// if(sum>k) return;// v.pb(sum); v.pb(k-sum);// for(int i=h[u];~i;i=ne[i]) {// int j=e[i];// if(j==fa) continue;// get_dis(j,u,sum+a[j],ww+w[i]);// }
// }void add(int u,int c) {for(int i=u;i<=n+2;i+=lowbit(i)) tr[i]=max(tr[i],c);
}void sett(int u,int c) {for(int i=u;i<=n+2;i+=lowbit(i)) tr[i]=c;
}int get(int u) {int ans=-INF;for(int i=u;i;i-=lowbit(i)) ans=max(ans,tr[i]);return ans;
}void get_dis(int u,int fa,int sum,int ww,int &ans) {if(st[u]) return;if(sum>k) return;ans=max(ans,get(k-sum+1)+ww);for(int i=h[u];~i;i=ne[i]) {int j=e[i];if(j==fa) continue;get_dis(j,u,sum+a[j],ww+w[i],ans);}
}void update(int u,int fa,int sum,int ww) {if(st[u]) return;if(sum>k) return;v.pb(sum); add(sum+1,ww);for(int i=h[u];~i;i=ne[i]) {int j=e[i];if(j==fa) continue;update(j,u,sum+a[j],ww+w[i]);}
}int calc(int u) {if(st[u]) return 0;int now=get_size(u,-1);int c=get_wc(u,-1,get_size(u,-1),u);st[u]=1;int ans=0;// for(int i=h[u];~i;i=ne[i]) {// int j=e[i];// get_dis(j,u,a[j],w[i]);// }add(1,0);for(int i=h[u];~i;i=ne[i]) {int j=e[i];get_dis(j,u,a[j]+a[u],w[i],ans);update(j,u,a[j],w[i]);}for(auto x:v) sett(x+1,-INF); v.clear();for(int i=h[u];~i;i=ne[i]) ans=max(ans,calc(e[i]));return ans;
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);memset(h,-1,sizeof(h));memset(tr,-0x3f3f3f3f,sizeof(tr));cin>>n>>k>>m;for(int i=1;i<=m;i++) {int x; scanf("%d",&x);a[x]=1;}for(int i=1;i<=n-1;i++) {int a,b,c; scanf("%d%d%d",&a,&b,&c);add(a,b,c); add(b,a,c);}printf("%d\n",calc(1));return 0;
}
/**/

Free tour II SPOJ - FTOUR2 点分治 + 树状数组相关推荐

  1. BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)

    BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化) 1 #include<algorithm> 2 #include<iostream> 3 #include ...

  2. P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P4093 题目大意 nnn个数字,每次有一个数字可能和原序列不同,但最多只有一个不同. 求所有情况下都满足的最长不降 ...

  3. P4062 [Code+#1]Yazid 的新生舞会(区间绝对众数+分治/树状数组维护高维前缀和)

    P4062 [Code+#1]Yazid 的新生舞会 杭电多校懂得都懂 Code1 分治 比较喜欢分治的做法,非常好写.skylee大佬题解 首先对于任何一个区间来说,由于两个端点不确定性非常难以一次 ...

  4. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

  5. CDQ分治 + 树状数组 ---- C. Goodbye Souvenir(三维偏序+思维)

    题目链接 题目大意: 给定长度为nnn的数组, 定义数字XXX在[l,r][l,r][l,r]内的值为数字XXX在[l,r][l,r][l,r]内最后一次出现位置的下标减去第一次出现位置的下标 给定m ...

  6. 点分治 + 树状数组 ---- E. Close Vertices(点分治 + 二维数点)

    题目链接 题目大意: 给出一棵树,问有多少条路径权值和不大于www,长度不大于lll 解题思路: 首先树上路径问题大概率就是点分治了 但是我们对于每个路径有两个性质就是(li,wi)(l_i,w_i) ...

  7. 点分治问题 ----------- 2019-2020 ICPC Asia Hong Kong Regional Contest C.Constructing Ranches[点分治+树状数组]

    题目链接 题目大意: 给你一个nnn个顶点的树,树上的顶点都有一个自己的权值,现在问你有多少对(u,v)(u,v)(u,v),它们路径上点的权值集合可以组成一个多边形? 解题思路: 1.对于树上路径问 ...

  8. Luogu P4178 Tree (点分治 + 树状数组)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P4178 Prob ...

  9. P3810-[模板]三维偏序(陌上花开)【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P3810 题目大意 nnn个三元组(a,b,c)(a,b,c)(a,b,c),f(i)=∑i=1n,j≠i[aj≤a ...

最新文章

  1. oracle之 手动创建 emp 表 与 dept 表
  2. 进度条三方库tdqm trange用法
  3. mybatis源码阅读(二):mybatis初始化上
  4. 【转】禁用Chrome和Firefox中自动播放的动画GIF
  5. 全自动采集新闻站源码-单站自动采集新闻源码(seo标题伪原创)
  6. jdbc的小结 mysql
  7. BZOJ 2527 Meteors | 整体二分
  8. Monitor HDU6514 二维差分入门学习
  9. linux打包除了某个文件夹,tar打包且排除某个文件
  10. java开发微信公众号(订阅号)
  11. 解决python3+selenium+chromedriver运行时chrome浏览器闪退问题
  12. 将图片转换为icon字体图表
  13. 生物信息学之抗癌药物反应论文阅读四:MD-WDNN
  14. 2020-01-15 Oracle JDK Migration Guide
  15. 产品架构能力之一 业务架构图
  16. cf1260 F. Colored Tree
  17. Java 老矣,尚能饭否? 1
  18. poi word文档在书签处插入图片
  19. Git报错: Failed to connect to github.com port 443 解决方案
  20. 使用python创建文件夹

热门文章

  1. 这6部超经典的物理电影,居然还有人没有看过?
  2. 霍金竟然亲口承认自己是个赌徒!明明失败了不止一次,“菜鸡”却成了神话!...
  3. 最全高考分数线出炉!!查了分后,这届学生为了过线真是太拼了.......
  4. 找对象不能只看TA的外表
  5. 数学特级教师:数学除了做习题,我还他让他们看这十部纪录片!
  6. Java JSON对象怎么遍历_Java遍历JsonObject对象
  7. charts漏斗图表_ECharts漏斗图属性与实例介绍
  8. 算法设计与分析——递归与分治策略——线性时间选择
  9. leetcode206. 反转链表
  10. 7-3 凸多边形最优三角剖分 (10 分)(思路+详解+分析题意+动态规划)Come Baby!!!!!!!!!