首页 > 其他分享 >[MX-X3-T5 & RiOI-4] Countless J-Light Decomposition Solution

[MX-X3-T5 & RiOI-4] Countless J-Light Decomposition Solution

时间:2024-09-09 19:36:37浏览次数:13  
标签:int Light ll T5 tr Solution ++ include deg

看题以为自己会了,写代码的时候发现有细节没考虑清楚,复杂度写挂了以为被卡常了,调用并查集函数还手残打错了,浪费大半个下午。NOI 之后属于越训越菜了 QwQ。

回到这个题,首先这个题当 \(i\) 固定时做法是显然的,我们自底向上考虑,每次一定是 ban 掉连向当前最长链最大子树的 \(i\) 条边。

发现只有当 \(deg_i>x\) 时一个点才有考虑价值,而 \(\sum_{x=0}^{n-1} \sum_u [deg_u>x]=\sum_u deg_u\) 是 \(O(n)\) 级别的。建出虚树,然后每个点相当于删除若干个边权,加入若干个新边权,求第 \(k\) 大。可以使用平衡树维护。做完了,复杂度 \(O(n\log n)\)。

如果我直接写虚树+平衡树,我就不用浪费这个下午了,但是我脑子一抽突然不想写十级算法。所以我们可以考虑用并查集维护当前还存在的 \(deg_u>x\) 的点,再开一颗并查集,按照 dfs 序倒序遍历,每次删去在当前所有点子树的关键点,就可以实现跟虚树同样的功能且免去了常数大的递归,但是复杂度其实是带一个小 \(\log n\) 或 \(\alpha(n)\) 的。

平衡树也好难写,每次加入删除之后还要删除加入回去常数大飞,我们考虑用常数更小的算法。注意到题目对于一个已经准备好的数组形如删除若干个,加入若干个,然后还要回退回去。我们考虑经典的用堆维护第 \(k\) 大,所以我们只需要开一个小根堆存储最大的 \(k\) 个。

使用可删堆不够优美,因为还是要回退回去。我们考虑用两个堆结构拼成一个堆,把一个点下面的所有边排序一下,取后面若干个直接作为其中一个堆,由于原本存在的边只会被删,所以这里就是直接用一个指针就可以实现弹堆了。然后你就可以做到洛谷最快了。

我是在这里干些什么啊 \yun。

#include <queue>
#include <cstdio>
#include <vector>
#include <cassert>
#include <algorithm>
#include <functional>
#define fi first
#define se second
using namespace std;
int read(){ /* reading... */ }
const int N=200003;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,int> pli;
inline void chmx(ll &x,ll v){if(x<v) x=v;}
inline void chmn(ll &x,ll v){if(x>v) x=v;}
int n;
vector<pii> adj[N],tr[N],vec[N];
int dfn[N],o[N],sz[N],ps[N],num;
void dfs(int u,int fa){
	o[dfn[u]=++num]=u;
	sz[u]=1;
	for(auto [v,w]:adj[u]) if(v^fa){
		dfs(v,u);
		tr[u].emplace_back(w,v);
		vec[u].emplace_back(v,w);
		sz[u]+=sz[v];
	}
	sort(tr[u].begin(),tr[u].end());
	int tt=0;
	for(auto [w,v]:tr[u]) ps[v]=tt++;
}
int f[N],g[N];
bool del[N];
int rt(int x){
	if(f[x]==x) return x;
	return f[x]=rt(f[x]);
}
int go(int x){
	if(g[x]==x) return x;
	return g[x]=go(g[x]);
}
int stk[N],tp;
int que[N],tl;
ll dp[N],ed[N];
int main(){
	n=read();
	for(int i=1;i<n;++i){
		int u=read(),v=read(),w=read();
		adj[u].emplace_back(v,w);
		adj[v].emplace_back(u,w);
	}
	dfs(1,0);
	for(int i=n;i;--i) stk[++tp]=o[i];
	for(int i=1;i<=n+1;++i) f[i]=i;
	g[n+1]=n+1;
	int cnt=0;
	for(int x=0;x<n;++x){
		ll res=0;
		for(int i=1;i<=tp;++i) g[dfn[stk[i]]]=dfn[stk[i]];
		for(int i=1;i<=tp;++i){
			int u=stk[i];
			int ss=tr[u].size();
			if(ss<=x){f[dfn[u]]=dfn[u]+1;continue;}
			g[dfn[u]]=dfn[u];
			vector<pii> tmp;
			que[++tl]=u;
			int p=ss-x-1;
			ll tdp=0;
			priority_queue<ll,vector<ll>,greater<ll>> pq;
			for(auto [v,w]:vec[u]){
				ed[v]=0;bool fl=0;
				for(int t=go(rt(dfn[v]));t<dfn[v]+sz[v];t=go(t)) chmx(ed[v],dp[o[t]]+w),fl=1,g[t]=rt(t+1),chmx(tdp,dp[o[t]]);
				if(fl){
					tmp.emplace_back(v,w);
					del[v]=1;pq.emplace(ed[v]);
					if(ps[v]<p){
						if(!pq.empty()&&(p==ss||tr[u][p].fi>pq.top())) pq.pop();
						else ++p;
					}
					while(p<ss&&del[tr[u][p].se]) ++p;
				}
			}
			dp[u]=1e18;
			if(p<ss) chmn(dp[u],tr[u][p].fi);
			if(!pq.empty()) chmn(dp[u],pq.top());
			vec[u].swap(tmp);
			for(auto [v,w]:vec[u]) del[v]=0;
			chmx(dp[u],tdp);
			chmx(res,dp[u]);
		}
		tp=tl;tl=0;
		for(int i=1;i<=tp;++i) stk[i]=que[i];
		printf("%lld ",res);
	}
	putchar('\n');
	return 0;
}

标签:int,Light,ll,T5,tr,Solution,++,include,deg
From: https://www.cnblogs.com/yyyyxh/p/18405159/decomposition

相关文章

  • 【题解】Solution Set - NOIP2024集训Day25 概率期望 dp
    【题解】SolutionSet-NOIP2024集训Day25概率期望dphttps://www.becoder.com.cn/contest/5515「QOJ2606」Gachapon\(f_{i,j}\):用一次合法的level-irolling能够抽到的\(j\)的期望个数。\(h_{i,j,k}\):在\(i\)次操作之内,抽到恰好\(k\)个\(j\)的概率。\[h_{i,j,k......
  • Adobe lightroom-LR-高速下载绿色安装最佳免费办公软件下载指南
    Adobe lightroom-LR-高速下载绿色安装最佳免费办公软件下载指南AdobeLightroom(LR)高速下载绿色安装最佳免费办公软件下载指南引言AdobeLightroom(简称LR)是一款广受欢迎的图像管理和编辑软件,广泛应用于摄影、设计和其他视觉艺术领域。然而,正版软件的高昂价格和复杂的安装过程常......
  • 在 Qt5 中创建一个 HTTP 接口以返回屏幕截图
    在Qt5中创建一个HTTP接口以返回MainWindow的屏幕截图在Qt5中,可以通过使用QTcpServer和QTcpSocket来创建一个简单的HTTP服务器。通过这种方式,我们可以实现一个HTTP接口,当访问该接口时,会返回当前MainWindow窗口的屏幕截图。以下是实现这一功能的详细步骤与相关知......
  • Qt5 中常用的模块列表:
    以下是Qt5中常用的模块列表:核心模块(Core):提供了Qt核心功能,包括对象模型、信号与槽机制、事件处理等。图形模块(Gui):提供了绘图和窗口系统集成功能,包括绘图API、事件处理、窗口管理等。窗口部件模块(Widgets):包含了各种常用的用户界面控件,如按钮、文本框、列表框等。网络模块(Netwo......
  • Solution Set 2
    \(\text{「CF1037H」Security}\)有关字典序可以依次考虑\(T\)的每一位转化为询问\(\mathcalO(|\Sigma||T|)\)个字符串在区间\([l,r]\)的存在性判断。因为可以用线段树合并维护\(\text{SAM}\)上每个等价类的\(\text{endpos}\)集合,所以将存在性判断离线放在\(\text{SAM......
  • QT5 掌握debug调试的方法(简要内容:Memory查看内存地址的数值 和 查看变量值)(图文并茂)
    A1——选择构建模式(选项:debug调试、release发行、profile不知道…)A2——开始运行A3——开始调试(仅在debug调试模式下,断点调试助手才有效)A4——执行构建(生成输出目录及相应的文件,路径要求与工程的路径同级)A1——鼠标悬停变量名弹出,可固定窗口,Qt查看变量值的......
  • Springboot高校竟赛活动报名管理系统ut5tx程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统功能:学生,评委,比赛信息,报名信息,竞赛信息,比赛结果,投诉建议开题报告内容一、项目背景与意义随着高等教育的不断发展,各类学科竞赛已成为培养学生实践能......
  • 【Python篇】PyQt5 超详细教程——由入门到精通(中篇一)
    文章目录PyQt5入门级超详细教程前言第4部分:事件处理与信号槽机制4.1什么是信号与槽?4.2信号与槽的基本用法4.3信号与槽的基础示例代码详解:4.4处理不同的信号代码详解:4.5自定义信号与槽代码详解:4.6信号槽的高级用法4.7总结第5部分:文件对话框与文件处理5.1什么......
  • FIT5057 Project Management
    FIT5057 Project ManagementSemester2, 2024AssignmentTwo–TeamAssignmentDue Dates:● Group submission (5%): Team Charter. There is a single Team Charter for each team, and one team membersubmits thefileviaMoodle asa tea......
  • [开题报告]flask框架沧州交通学院二手交易系统2ht5t(python+程序+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在沧州交通学院这一充满活力的学术社区中,随着学生人数的增加和校园生活的日益丰富,二手物品的流通与交易成为了广大师生普遍关注的话题。传......