CF514D R2D2 and Droid Army 题解

分析

乱搞题。

考虑将区间 [l,r] 中所有人干掉的代价。设 cnti=maxj=lraj,i,则代价为:i=1mcnti。很显然,只有在 i=1mcntik 是,我们才能将这些人全部干掉。

考虑枚举右端点 r,与每个 r 对应的最小能干掉的区间左端点 l。不难发现随着区间的缩进,cnti 的值是不增的,所以完全可以使用指针求出 l,复杂度是 O(n) 的。而在指针移动的时候,cnti 的值不方便直接计算,但注意到范围:m5,这可以用线段树乱搞维护。总的复杂度是 O(nlogn)m 忽略不计)。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re register
#define il inline

const int N=1e5+10,M=10;
struct node{
	int s[M];
}a[N];
int n,m,k;
struct tree{
	int l,r,mx[M];
}tr[N<<2];
int ANS[M];

il void up(int now){
	tr[now].mx[1]=max(tr[now<<1].mx[1],tr[now<<1|1].mx[1]);
	tr[now].mx[2]=max(tr[now<<1].mx[2],tr[now<<1|1].mx[2]);
	tr[now].mx[3]=max(tr[now<<1].mx[3],tr[now<<1|1].mx[3]);
	tr[now].mx[4]=max(tr[now<<1].mx[4],tr[now<<1|1].mx[4]);
	tr[now].mx[5]=max(tr[now<<1].mx[5],tr[now<<1|1].mx[5]);
	return ;
}
il tree get(tree a,tree b){
	tree ans={0,0,0,0,0,0,0};
	ans.mx[1]=max(a.mx[1],b.mx[1]);
	ans.mx[2]=max(a.mx[2],b.mx[2]);
	ans.mx[3]=max(a.mx[3],b.mx[3]);
	ans.mx[4]=max(a.mx[4],b.mx[4]);
	ans.mx[5]=max(a.mx[5],b.mx[5]);
	return ans;
}
il void build(int now,int l,int r){
	tr[now].l=l,tr[now].r=r;
	if(l==r){
		tr[now].mx[1]=a[l].s[1];
		tr[now].mx[2]=a[l].s[2];
		tr[now].mx[3]=a[l].s[3];
		tr[now].mx[4]=a[l].s[4];
		tr[now].mx[5]=a[l].s[5];
		return ;
	}
	int mid=l+r>>1;
	build(now<<1,l,mid),build(now<<1|1,mid+1,r);
	up(now);
	return ;
}
il tree query(int now,int l,int r){
	if(tr[now].l>=l&&tr[now].r<=r) return tr[now];
	tree ans={0,0,0,0,0,0,0};int mid=tr[now].l+tr[now].r>>1;
	if(l<=mid) ans=get(ans,query(now<<1,l,r));
	if(mid<r) ans=get(ans,query(now<<1|1,l,r));
	return ans;
}

il void solve(){
	cin>>n>>m>>k;
	for(re int i=1;i<=n;++i){
		for(re int j=1;j<=m;++j){
			cin>>a[i].s[j];
		}
	}
	build(1,1,n);
	int maxx=0;
	for(re int i=1,l=1;i<=n;++i)
		while(l<=i){ 
			tree now=query(1,l,i); 
			int sum=now.mx[1]+now.mx[2]+now.mx[3]+now.mx[4]+now.mx[5];
			if(sum<=k){ 
				if(i-l+1>maxx)
					ANS[1]=now.mx[1],ANS[2]=now.mx[2],ANS[3]=now.mx[3],ANS[4]=now.mx[4],ANS[5]=now.mx[5],
					maxx=i-l+1;
				break; 
			} 
			else l++;
		}
	for(re int i=1;i<=m;++i){
		cout<<ANS[i]<<" ";
	}
	return ;
}

signed main(){
	solve();
	return 0;
}
posted @   harmis_yz  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示