首页 > 其他分享 >ABC263F 题解

ABC263F 题解

时间:2024-03-07 13:11:26浏览次数:15  
标签:res get int 题解 long Pow ABC263F define

Solution

考虑 \(f_{i,j}\) 表示第 \(i\) 个人赢下了第 \(j\) 场的最大价值,答案即为 \(\max_{i=1}^{n}f_{i,m}\)。

然后考虑状态转移,令 \(l,r\) 为第 \(i\) 个人在打第 \(j\) 场比赛时的区间,\(mid\) 为区间中点,然后分为两种情况:

  1. 第 \(i\) 个人在左半部分,转移即为 \(f_{i,j}=f_{i,j-1}+\max_{k=mid+1}^{r}f_{k,j-1}+a_{i,j}-a_{i,j-1}\)。

  2. 第 \(i\) 个人在右半部分,转移即为 \(f_{i,j}=f_{i,j-1}+\max_{k=l}^{mid}f_{k,j-1}+a_{i,j}-a_{i,j-1}\)。

注意此时应该先枚举 \(j\),否则会有后效性。

发现式子里带有区间 \(\max\),预处理一下即可。时间复杂度为 \(O(n \times 2^n)\)。

考场代码奇丑无比。

#include<bits/stdc++.h> 
#define ll long long 
#define int long long  
#define x first 
#define y second 
#define debug() puts("-----") 
using namespace std; 
typedef pair<int,int> pii; 
const int N=1e5+10,M=20;  
int n,m; 
ll a[N][M],f[N][M]; 
ll g1[N][M],g2[N][M]; 
int Pow(int x,int k){ 
	int res=1; 
	while(k){
		if(k&1) res=res*x; 
		x=x*x; k>>=1;  
	} return res; 
} 
pii get(int i,int j){ 
	int l=(i-1)/j+1,r=l*j; 
	l=(l-1)*j+1; return pii(l,r); 
} 
signed main(){ 
//	freopen("game.in","r",stdin); 
//	freopen("game.out","w",stdout); 
	scanf("%lld",&m); n=pow(2,m); ll ans=0; 
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%lld",&a[i][j]); 
	for(int j=1;j<=m;j++){ 
		for(int i=1;i<=n;i++){ 
			int l=get(i,Pow(2,j)).x,r=get(i,Pow(2,j)).y,mid=l+r>>1; 
			if(i<=mid){ 
				ll res=g1[mid+1][j-1]+a[i][j]; 
//				if(j>=2){ 
//					int L=get(i,Pow(2,j-1)).x,R=get(i,Pow(2,j-1)).y,Mid=L+R>>1;
//					if(i<=Mid) res+=g2[Mid+1][j-2]; else res+=g2[L][j-2]; 
//				} 
				f[i][j]=max(f[i][j],res+f[i][j-1]-a[i][j-1]); 
//				 for(int k=mid+1;k<=r;k++){ ll res=0; 
//				 	if(j>=2) for(int p=l;p<=mid;p++) if(get(p,pow(2,j-2))!=get(i,pow(2,j-2))) res=max(res,f[p][j-2]); 
//				 	f[i][j]=max(f[i][j],f[i][j-1]+f[k][j-1]+a[i][j]-a[i][j-1]); 
//				 } 
			} else{ 
				ll res=g1[l][j-1]+a[i][j]; 
//				if(j>=2){
//					int L=get(i,Pow(2,j-1)).x,R=get(i,Pow(2,j-1)).y,Mid=L+R>>1;
//					if(i<=Mid) res+=g2[Mid+1][j-2]; else res+=g2[L][j-2]; 
//				} 
				f[i][j]=max(f[i][j],res+f[i][j-1]-a[i][j-1]); 
//				 for(int k=l;k<=mid;k++){
//				 	ll res=0;
//				 	if(j>=2) for(int p=mid+1;p<=r;p++) if(get(p,pow(2,j-2))!=get(i,pow(2,j-2))) res=max(res,f[p][j-2]);
//				 	f[i][j]=max(f[i][j],f[i][j-1]+f[k][j-1]+a[i][j]-a[i][j-1]); 
//				 }
			} ans=max(ans,f[i][j]); 
		} int p=Pow(2,j); 
		for(int i=1;i<=n;i+=p){ 
			for(int k=i;k<=i+p-1;k++) 
				g1[i][j]=max(g1[i][j],f[k][j]);  
		} p=Pow(2,j-1); 
		for(int i=1;i<=n;i+=p){ 
			for(int k=i;k<=i+p-1;k++) 
				g2[i][j-1]=max(g2[i][j-1],f[k][j-1]); 
		} 
	} printf("%lld\n",ans); return 0; 
} /*
2
2 5
6 5
2 1
7 9

3
1 1 1
1 1 1
1 1 1
1 1 1
1 1 1
1 1 1
1 1 1
1 1 1

3
7 8 6
9 5 3
9 6 5
4 3 3 
2 1 3
5 6 7 
9 1 2
10 8 9

2
4 9
3 6 
5 3 
2 7
*/

标签:res,get,int,题解,long,Pow,ABC263F,define
From: https://www.cnblogs.com/Celestial-cyan/p/18058658

相关文章

  • 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\),......
  • 初三组合恒等式和二项式定理练习 题解
    A.多项式推柿子:\[\begin{aligned}&\sum\limits_{k=0}^{n}b_{k}(x-t)^{k}\\=&\sum\limits_{k=0}^{n}b_{k}\sum\limits_{i=0}^{k}\binom{k}{i}x^{i}(-t)^{k-i}\\=&\sum\limits_{0\leqslanti\leqslantk\leqslantn}\binom{k}{i}b_{......
  • 2024 联合省选 题解
    D1T1季风考虑要求\(\begin{cases}\sum\limits_{i=0}^{m-1}(x'_i+x_{i\bmodn})=x\\\sum\limits_{i=0}^{m-1}(y'_i+y_{i\bmodn})=y\\|x'_i|+|y'_i|\lek\end{cases}\)发现其等价于\(|x-\sum\limits_{i=0}^{m-1}x_{i\bmodn}|+|y-\sum\l......
  • Chests and Keys 题解
    题意:给定\(n,m\)表示存在\(n\)个宝箱和\(m\)把钥匙,第\(i\)把钥匙需要\(b_i\)元,第\(i\)个宝箱内部有\(a_i\)元。现在进行一场游戏,Bob是本场游戏的玩家,而Alice则是场景布置者,Alice可以给每个宝箱上一些锁(第\(j\)种锁需要第\(j\)种钥匙打开)如果Bob可以购......
  • Linux使用问题之长时间连接ssh不操作自动断开问题解决方案
    1.概要一般情况下,在使用SSHSecureShellClient的过程中,经常会遇到当用SSHSecureShell连接登录Linux后,如果几分钟没有任何操作,连接就会自动断开,提示Serverresponded"Connectionclosed.",必须重新登录才可以。2.原理主要由以下两个参数控制:ClientAliveInterval:指定了服......