首页 > 其他分享 >CF514D R2D2 and Droid Army 题解

CF514D R2D2 and Droid Army 题解

时间:2024-03-07 13:13:14浏览次数:20  
标签:cnt Droid Army int 题解 re ANS now mx

分析

乱搞题。

考虑将区间 \([l,r]\) 中所有人干掉的代价。设 \(cnt_{i}=\max\limits_{j=l}^{r}a_{j,i}\),则代价为:\(\sum\limits_{i=1}^{m}cnt_i\)。很显然,只有在 \(\sum\limits_{i=1}^{m}cnt_i \le k\) 是,我们才能将这些人全部干掉。

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

标签:cnt,Droid,Army,int,题解,re,ANS,now,mx
From: https://www.cnblogs.com/harmisyz/p/18058656

相关文章

  • P4863 题解
    Solution为了方便,我们定义\(f_n=\sum_{i=1}^{n}\sum_{j=i}^{n}\lfloor\frac{i}{j}\rfloor\times(-1)^j\)。于是答案即为\(f_b-f_{a-1}\)。观察到如果我们直接计算这个式子而不做丝毫变形的话时间复杂度是\(O(n^2)\)的。考虑把先枚举\(j\),计算\(j\)的贡献。此时就有......
  • CF1066E Binary Numbers AND Sum 题解
    分析因为\(a\)是一直没有改变的,移动的只有\(b\),所以从\(a\)的每一位的贡献入手。对于\(a\)中的从低到高第\(i\)位,其对应的十进制值是\(a_{n-i+1}\times2^{i-1}\)。注意到\(b\)是每次右移一位的,所以在\(b\)中能与\(a_{n-i+1}\)匹配的都是在下标区间\([1,m-i+1]......
  • ABC263F 题解
    Solution考虑\(f_{i,j}\)表示第\(i\)个人赢下了第\(j\)场的最大价值,答案即为\(\max_{i=1}^{n}f_{i,m}\)。然后考虑状态转移,令\(l,r\)为第\(i\)个人在打第\(j\)场比赛时的区间,\(mid\)为区间中点,然后分为两种情况:第\(i\)个人在左半部分,转移即为\(f_{i,j}=f_{i......
  • P9757 [COCI2022-2023#3] Dirigent 题解
    分析对于一个从小到大(按编号排序)的长度为\(n\)的序列\(A\),有性质:相邻两个数之差的绝对值为\(1\)的数量为\(n-1\)。那么,对于这道题,能使环剪开一条边使其按编号排序,必有相邻两个\(i,j\),满足\((A_i-A_j=1)\)的数量为\(n-1\)。注意,因为这是个环,所以\(i,j\)大小关系不能......
  • 常见问题解决 ---
    问题描述Internalerror.Pleaserefertohttps://jb.gg/ide/critical-startup-errorsjava.lang.AssertionError:FailedtoreadC:\Users\**\updatedBrokenPlugins.dbatcom.intellij.openapi.diagnostic.DefaultLogger.error(DefaultLogger.java:54)atcom.intellij......
  • CSP认证2022.12 452分题解
    A、现值计算题解题目简单易懂,直接写就行了。importmathn,i=map(float,input().split())n=int(n)a=list(map(int,input().split()))ans=0.00forjinrange(n+1):ans=ans+math.pow(1+i,-j)*a[j]print(ans)B、训练计划题解显然是个......
  • .NET Core WebAPI项目部署iis后Swagger 404问题解决
    .NETCoreWebAPI项目部署iis后Swagger404问题解决前言之前做了一个WebAPI的项目,我在文章中写到的是Docker方式部署,然后考虑到很多初学者用的是iis,下面讲解下iis如何部署WebAPI项目。环境准备iisASPNETCoreModuleV2重点.NETCoreRuntimeiis的配置这里就不讲了,主要讲解......
  • 【转】[Java]引入Redisson可能会出现项目启动失败问题解决
    转自:https://blog.csdn.net/bengbuguang4321/article/details/121951650在启动项目时,Redisson自己会启动一个Redisson连接池,尝试连接redis,这时候如果遇到网络不通就会出现问题,因为redis连接不上,导致项目启动不了解决方法是:1、重新空实现了一个RedissonClient/***@ClassNa......
  • ABC323E Playlist 题解
    考虑第\(i\)时刻时,第\(j\)首歌刚好结束与第\(i-j\)时刻有关,因此设\(dp_{i,j}\)表示第\(i\)时刻第\(j\)首歌刚好结束的概率,那么\(dp\)转移方程为:\[dp_{i,j}=\sum\limits_{k=1}^ndp_{i-t_j,k}\]很容易想到记录\(\sum\limits_{j=1}^ndp_{i,j}\)的值为\(sum_i\),......
  • Android开发学习之路01
    今日跟着一个人进行了Androidstudio上创建数据库和数据表的联系,这应该是老师留的作业中,进行数据库的连接。原文链接:https://blog.csdn.net/fjh_xx/article/details/131404230一.前言二.SQLite数据库介绍1.什么是SQLite数据库2.特点3.SQLite操作API4.SQLite数据类型三.S......