首页 > 其他分享 >【题解】洛谷:P4805 [CCC2016] 合并饭团

【题解】洛谷:P4805 [CCC2016] 合并饭团

时间:2024-11-19 16:18:36浏览次数:1  
标签:洛谷 int 题解 合并 P4805 CCC2016 ans

P4805 [CCC2016] 合并饭团

希望写完这篇题解能真正地会这种题。

合并两个的操作很像合并石子的操作,确实直接那么做就可以,但三个怎么办呢,暴力做法就是枚举中间两个端点然后转移,但是这样复杂度太大了有 \(O(n^4)\)。

于是搬出我们的双指针,在面对区间问题时双指针可以有效地解决问题,但是我们不能瞎用,双指针也要满足单调性才能用,我们一个区间的和是固定的,区间长度越大值就越大,所以我们我们不断调整中间区间的两个端点 \(k,t\),使得两边到 \(l,r\) 的距离相同,哪边小动哪边的端点,就可以合并了。

#include <bits/stdc++.h>
#define int long long
#define ls p<<1
#define rs p<<1|1 
#define re register 
const int N=5e5+10;
const int mod=998244353;
using namespace std;

int n;
int f[100][100];
int ans;

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr); 
	
	cin>>n;
	
	for(int i=1;i<=n;i++){
		cin>>f[i][i];
		ans=max(ans,f[i][i]);
	}
	
	for(int len=2;len<=n;len++){
		for(int l=1,r=len;r<=n;l++,r++){
			
			for(int k=l;k<r;k++){
				if(f[l][k]==f[k+1][r]){
					f[l][r]=f[l][k]+f[k+1][r];
				}
			}
			
			for(int k=l,t=r;k+1<=t-1;){
				if(f[l][r]){
					break;	 
				}
				if(!f[l][k]){
					k++;
				}
				else if(!f[t][r]){
					t--;
				}
				else if(f[l][k]==f[t][r]){
					if(f[k+1][t-1]){
						f[l][r]=f[l][k]+f[k+1][t-1]+f[t][r];
					}
					else{
						k++;
						t--;
					}
				}
				else if(f[l][k]<f[t][r]){
					k++;
				}
				else if(f[l][k]>f[t][r]){
					t--;
				}
			}
			ans=max(ans,f[l][r]);
		}
	}
	cout<<ans;
	return 0;
}

标签:洛谷,int,题解,合并,P4805,CCC2016,ans
From: https://www.cnblogs.com/sadlin/p/18555079

相关文章

  • UOJ918 【UR #28】偷吃蛋糕 题解
    题目描述\(n\)层蛋糕,第\(i\)层大小\(c_i\),保证\(c_i\)单调不增。初始你有第\(1\)层蛋糕,然后重复以下操作,直至没有蛋糕:吃掉最大的一层蛋糕,记其大小为\(x\)。如果还有至少\(x\)层蛋糕没有给你,主办方会按编号升序给你接下来的\(x\)层蛋糕。如果只有\(y\)层蛋......
  • C -- [vs2019] C2440 错误,无法从 const char[] 转换为 char*问题解决
    https://blog.csdn.net/weixin_45525272/article/details/118699716原因新标准中,不能把指针指向一串常量解决方案一:引入[]char*str=“helloworld”;改成:charstr_tmp[]=“helloworld”;char*str=str_tmp;方案二:加constchar*str=“helloworld”;改成:......
  • ABC380 DEFG 题解
    ABC380题解赛时秒了ABCDE(好吧其实还是略有卡顿,写完大概花了55min),看到F有博弈直接跑了,没注意到数据范围这么小,看到G一下就会了大致思路,但具体细节上搞复杂了,快写完了才发现不用维护这么多(恼),然后因为某些神秘错误现在都还没有调出来。至于F,赛后看见数据范围这么小,自己独立......
  • 洛谷P1816忠诚
    洛谷P1816忠诚思路查询区间最小值,\(ST\)表/线段树板子题代码#include<bits/stdc++.h>#defineendl'\n'#defineintlonglongconstintmaxn=2e5+5;constintinf=0x7f7f7f7f;structcustom_hash{ staticuint64_tsplitmix64(uint64_tx){ x^=......
  • 洛谷P2068统计和
    P2068统计和思路单点修改+区间查询线段树/树状数组板子题代码#include<bits/stdc++.h>#defineendl'\n'#defineintlonglong#definelowbit(x)x&-xconstintmaxn=5e5+5;constintinf=0x7f7f7f7f;structcustom_hash{ staticuint64_tsplitmix64......
  • 洛谷P5057简单题
    P5057[CQOI2006]简单题这是题面思路每次操作,直接区间加\(1\),最后求结果的时候对\(2\)取余就好了这个题就是区间修改+单点查询可以用树状数组或者线段数维护代码#include<bits/stdc++.h>#defineendl'\n'#defineintlonglong#definelowbit(x)x&-xconstint......
  • マス目と整数 题解
    前言题目链接:洛谷;AtCoder。题意简述给你一个\(n\timesm\)的矩形\(a\),其中已经有\(q\)个位置填上了数,你需要为剩下的位置分别填上一个非负整数,使得最终任意一个\(2\times2\)的子矩形内,左上角的数加右下角的数等于右上角的数加左下角的数,即\(\foralli\in[1,n),j\in......
  • CF715B Complete The Graph 题解
    Description给\(n\)点\(m\)边的无向图,\(L\),\(s\),\(t\)。修改\(m\)条边中边为\(0\)的边,使满足\(s,t\)的最短路长度是\(L\),且输出答案的时候边为\(0\)的边的权值必须在\([1,10^{18}]\)内。Solution考虑怎么判有无解。容易发现将所有未知边边权设为\(10^{18}\),......
  • ZZJC新生训练赛第17场题解
    难度分类(同一难度下按字典序上升)入门:J简单:G,E,D中等:I,B,k困难:F,AJ-解题思路按照题意模拟即可J-代码实现for_inrange(int(input())):print(int(int(input())**0.5))G-解题思路dp入门题跳台阶小改G-代码实现MOD=int(1e9+7)dp=[0]*in......
  • Codeforces Round 988 (Div. 3) E题解析
    E题题目链接CodeforcesRound988(Div.3)题目描述题目的思路根据题目的意思,我们可以推断出算法时间复杂度应该在O(N)对于这道题而言,我们可以分析下思路首先我们先从1~n的范围里面询问答案如果出现0就跳过,因为无序操作如果出现非0答案temp就记录下1~i的01序列的个数如果......