Free tour II SPOJ - FTOUR2 点分治 + 树状数组

传送门

文章目录

  • 题意:
  • 思路:

题意:

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

思路:

真恶心啊,这个题还卡时间。
明显的点分治的题了,在求不超过kkk的拥堵点数且美丽值最大的时候,明显这是一个前缀最大值,我们用树状数组维护一下即可。
在遍历一颗子树的时候,需要先更新答案,再将这个子树的信息更新到trtrtr数组里,注意更新答案的时候需要算上根的拥堵值,更新信息的时候不能算上根的拥堵值。
让后重置树状数组的时候,需要记录一下更新了那些值,让后更新即可,不能暴力更新。
还有一个坑就是最后答案需要跟000maxmaxmax,因为可以美丽值为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;
}
/**/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Mutex进行线程处理

Mutex就像一个C&#xff03;锁(lock)&#xff0c;但它可以跨多个进程工作。换句话说&#xff0c;Mutex可以是计算机范围的&#xff0c;也可以是应用程序范围的。Mutex是一个同步原语&#xff0c;也可用于进程间同步。当两个或多个线程需要同时访问共享资源时&#xff0c;系统需…

【NOIP模拟】开車【回退贪心】【multiset】

题意&#xff1a;有 1∼n1 \sim n1∼n nnn 个城市排成一行&#xff0c;给定每个城市的单位距离油价和两个城市间的距离、油箱容量&#xff0c;求 111 到 nnn 最小代价。 用 multiset 来维护当前油箱中的油的价格。 在每个城市假装把油加满。如果发现这个城市的油比油箱里的一…

Educational Codeforces Round 75 (Rated for Div. 2) D. Salary Changing 二分 + check

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 直接算不好算&#xff0c;考虑二分这个中位数midmidmid。 考虑如何checkcheckcheck&#xff0c;这个分情况来就好了&#xff1a; (1)mid>a[i].r(1)mid>a[i].r(1)mid>a[i].r&#…

【Linux】Linux常见指令解析上

目录 1. 前言2. ls指令3. pwd指令4. cd指令3.1 cd常见快捷指令 4. touch指令5. mkdir指令6. rmdir指令 && rm指令 &#xff08;重要&#xff09;6.1 rmdir指令6.2 rm指令 7. man指令 1. 前言 这篇文章我们将详细介绍一下Linux下常见的基本指令。 2. ls指令 语法: ls [选…

CSP2020 赛前总结

比赛策略与思路 暴力不好写&#xff0c;没法对拍 ≠\neq​ 稳了签到题要求稳&#xff0c;可以当熟悉环境。但也要注意速度&#xff0c;为后面的题腾出时间。正解调不出来就写暴力&#xff0c;一是确认题意、换下脑筋&#xff0c;二是提供对拍&#xff0c;三是拿到保底分。正…

PYPL 7月榜单公布:Java份额出现下降趋势

PYPL(PopularitY of Programming Language&#xff0c;编程语言流行指数) 7 月份的榜单已发布&#xff0c;目前包含四个排行榜&#xff0c;囊括编程语言、IDE、ODE(Online IDE) 以及数据库四大领域。PYPL 是非常流行的参考指标&#xff0c;其榜单数据的排名均是根据榜单对象在 …

CSP-S 2020 游记

本博客建立于 2020 年 11 月 6 日晚&#xff0c;于次日正式认证后更新涉及题目的内容并公开。本人未提前知晓认证试题&#xff0c;请读者不必恐慌。 Day -4 久违地 AK 了一场模拟赛。 Day -2 因为模拟赛不给大样例&#xff0c;T3 T4都A了&#xff0c;反而挂了 SB 模拟和欧拉…

Codeforces Round #593 (Div. 2) D. Alice and the Doll 暴力 + 二分

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 还以为这个题有什么高深的算法&#xff0c;结果就是个暴力。 由于n∗mn*mn∗m达到了1e101e101e10的级别&#xff0c;所以直接暴力肯定是不行的&#xff0c;考虑有很多空格&#xff0c;我们…

远古魔力 | 在Windows 10和Azure App Service里跑上世纪的ASP

ASP&#xff08;没有.NET&#xff09; 即 Active Server Pages &#xff08;动态服务器页面&#xff09;是一项由微软公司在1996年推出的技术&#xff0c;能够在IIS中运行动态网站。也许许多90后及千禧一代程序员并没有听说过它&#xff0c;但很多老程序员曾经用ASP编写了诸如D…

【LOJ6072】苹果树【折半搜索】【矩阵树定理】【二项式反演】

题意&#xff1a;有好坏两种点共 nnn 个&#xff0c;每个好点有权值&#xff0c;把这 nnn 个点连成一棵树&#xff0c;一个好点为有用的当且仅当它至少与一个好点相邻&#xff0c;求所有有用的点的权值和不超过 limlimlim 的方案数。 n≤40n\leq 40n≤40 这题网上的容斥方法基…

P2375 [NOI2014] 动物园 kmp fail指针/倍增

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 由kmpkmpkmp中失配数组nenene的含义我们知道&#xff0c;ne[i],ne[ne[i]],...ne[i],ne[ne[i]],...ne[i],ne[ne[i]],...都是iii的相等的前后缀&#xff0c;但是可能有重叠的部分&#xff0c…

DDD“上吊绳驱动开发”,开发要想不被“吊死”,该如何自救?

话题缘起01今天在DevOps案例深度研究讨论群里&#xff0c;群友们围绕一种开发模式展开了讨论&#xff1a;DDD&#xff08;Deadline Driven Development&#xff09;&#xff0c;期限驱动开发&#xff0c;大家似乎更愿意将其翻译成“上吊绳驱动开发”。这种开发模式是说在接到新…

【启智树NOIP模拟】奇偶【卢卡斯定理】【背包】【bitset】

题意&#xff1a;给定 nnn 个数 aia_iai​ &#xff0c;求选出&#xff08;可以重复&#xff0c;考虑顺序&#xff09;MMM 个数和为 SSS 的方案数模 222。 n≤200,ai≤105,M,S≤1018n\leq 200,a_i\leq 10^5,M,S\leq 10^{18}n≤200,ai​≤105,M,S≤1018 首先给每个数分配一个出…

「Sqlserver」数据分析师有理由爱Sqlserver-好用的插件工具推荐

在此系列中&#xff0c;笔者为大家带来一些以数据分析师视角去使用Sqlserver的系列文章&#xff0c;希望笔者走过的路能够给后来者带来一些便利。背景介绍在数据分析师的角色下&#xff0c;使用数据库更多的是为了从数据库中获取数据&#xff0c;和数据库交互的语言是SQL&#…

P4824 [USACO15FEB]Censoring S kmp + 栈

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 如果删除之后两个串不拼起来就是个裸kmpkmpkmp了&#xff0c;但是这个题能拼起来&#xff0c;拼起来之后还有可能生成一个新的串&#xff0c;而且起点在当前位置之前。 考虑是否能找到删掉…

使用kubectl管理k8s集群(三十)

前言Foreword在搭建k8s集群之前&#xff0c;我们需要先了解下kubectl的使用&#xff0c;以便在集群部署出现问题时进行检查和处理。命令和语法记不住没有关系&#xff0c;但是请记住主要的语法和命令以及帮助命令的使用。在下一篇&#xff0c;我们将讲述使用Kubeadm来创建k8s集…

【启智树NOIP模拟】生存【父子分治】

题意&#xff1a;有 nnn 个城市连成一棵树&#xff0c;每个城市有 aia_iai​ 个人。接下来 mmm 天每天会发生 kik_iki​ 次灾难&#xff0c;每个灾难会让一个给定城市的人全部死掉。每个人一天可以走一条边&#xff0c;也可以不动。求最多多少人能活过这 mmm 天。 n≤106,∑ki≤…

P3435 [POI2006]OKR-Periods of Words kmp + fail指针

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 转换一下题意&#xff0c;就是求一个最小公共前后缀&#xff0c;显然可以暴跳nenene数组&#xff0c;复杂度O(n2)O(n^2)O(n2)&#xff0c;注意到我们每次都跳的话会跳到很多重复的位置&…

架构杂谈《四》

分布式一致性协议一、引言在分布式系统中&#xff0c;为了保证数据的高可用&#xff0c;通常会将数据保留多个副本(replica)&#xff0c;这些个副本会放在不同的物理机上&#xff0c;为了对用户提供正确的数据&#xff0c;我们需要保证这些放在不同物理机上的副本是一致的。为了…

【十二省联考2019】希望【点边容斥】【换根dp】【长链剖分】【线性数据结构】【回退数据结构】【离线逆元】

题意&#xff1a;给一棵树&#xff0c;两个参数 k,Lk,Lk,L,需要选择 kkk 个连通块&#xff0c;使得这 kkk 个连通块存在一个公共点&#xff0c;且该公共点到 kkk 个连通块内的任意一点的距离不超过 LLL&#xff0c;求方案数 模 998244353998244353998244353。两种方案不同当且仅…