luogu4766 Outer space invaders 题解

本文重写于 2023.8.27

把每个外星人的存活时间看成是区间,那么本题又可以转化成那种经典模型。

区间的贡献在交点上。

\(f(i,j)\) 为消灭被 \([i,j]\) 完全包含的所有区间的最小代价。

我们肯定是找到 \(d\) 最大的那个区间一发干掉。

枚举干掉它的时间,以这个为轴,划分子问题 。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define uint unsigned long long
#define PII pair<int,int>
#define MP make_pair
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define SET(a,b) memset(a,b,sizeof(a))
#define CPY(a,b) memcpy(a,b,sizeof(b))
#define rep(i,j,k) for(int i=(j);i<=(k);++i)
#define per(i,j,k) for(int i=(j);i>=(k);--i)
int read() {
	int a=0, f=1; char c=getchar();
	while(!isdigit(c)) {
		if(c=='-') f=-1;
		c=getchar();
	}
	while(isdigit(c)) a=a*10+c-'0', c=getchar();
	return a*f;
}
const int N=605;
int T, n, m, t[N], f[N][N];
struct node {
	int l, r, d;
} a[N];
void lsh() {
	sort(t+1,t+m+1);
	m=unique(t+1,t+m+1)-t-1;
	rep(i,1,n) {
		a[i].l=lower_bound(t+1,t+m+1,a[i].l)-t;
		a[i].r=lower_bound(t+1,t+m+1,a[i].r)-t;
	}
}
void solve() {
	m=0;
	n=read();
	rep(i,1,n) {
		a[i].l=read(), a[i].r=read(), a[i].d=read();
		t[++m]=a[i].l, t[++m]=a[i].r;
	}
	
	lsh();
	SET(f,0x3f);
	for(int l=1;l<=m;++l) for(int i=1;i+l-1<=m;++i) {
		int j=i+l-1;
		int x=0;
		for(int k=1;k<=n;++k) if(i<=a[k].l&&a[k].r<=j) {
			if(a[k].d>a[x].d) x=k;
		}
		if(!x) { f[i][j]=0; continue; }
		for(int k=a[x].l;k<=a[x].r;++k) f[i][j]=min(f[i][j],f[i][k-1]+a[x].d+f[k+1][j]);
	}
	printf("%lld\n",f[1][m]);
}
signed main() {
	T=read();
	while(T--) solve();
	return 0;
}

luogu4766 Outer space invaders 题解
https://yozora0908.github.io/2022/lg4766-solution/
作者
yozora0908
发布于
2022年2月4日
许可协议