首页 > 其他分享 >abc176F题解

abc176F题解

时间:2024-03-19 21:44:24浏览次数:28  
标签:le int 题解 abc176F 左侧 Theta 转移 sim

abs176F
题意:
给定长度为\(3\times n\),值域是\([1,n]\)的序列,不断下列操作直至序列剩余\(3\)个数:
1.对序列最左侧\(5\)个数进行任意排列。
2.取出序列最左侧\(3\)个数,如果\(3\)个数一样,则得分加一,然后删除这三个数。
问最大得分为多少。
思路
神仙dp题。
首先有一个显然的\(\Theta(n^3)\)dp。状态\(f_{i,j,k}\)表示进行完\(i\)次操作后,最左侧两个数是\(j\)和\(k\)。转移是\(\Theta (1)\)的。
这里有单调性,\(f_{i-1,j,k}\le f_{i,j,k}\)。所以并不用将所有的{j,k}全部转移,下面让我们看看有哪些转移:
能有\(3\)个一样的:
1.当\(a_3=a_4=a_5\),对于所有的\(1\le j,k\le n\),\(f_{i-1,j,k}+1\to f_{i,j,k}\),无其他转移,因为是全局加一,可以打一个全局tag。转移\(\Theta(1)\)。
2.当\(a_{3\sim 5}\)中有两个相等,且等于\(k\),设\(a_{3\sim 5}\)中与其他两个不等的是\(x\),对于所有的\(1\le j,k\le n\),\(f_{i-1,j,k}+1\to f_{i,j,x}\),这里设\(g_{i,j}=\max_{1\le k\le n} f_{i,j,k}\)。转移\(\Theta(1)\),转移数量\(\Theta(n)\)。
3.当\(j=k\),且\(a_{3\sim 5}\)中有一个与\(j\)相等,\(f_{i-1,a_3,a_3}+1\to f_{i,a_4,a_5}\),其余同理,转移\(\Theta(1)\),转移数量\(\Theta(1)\)。
没有\(3\)个一样的:
1.把\(a_{3\sim 5}\)都放到最左侧的\(3\)个,对于所有的\(1\le j,k\le n\),\(f_{i-1,j,k}\to f_{i,j,k}\),对于这里,我们可以把第一维滚掉,就不需要转移了。
2.恰好把\(a_{3\sim 5}\)中的两个放在最左侧的\(3\)个,如把\(a_3\),\(a_4\)放在最左侧,则对于任意的\(1\le j,k\le n\),\(f_{i-1,j,k}\to f_{i,j,a_5}\),通过前面定义的\(g_{i,j}\),这里的转移是\(\Theta(1)\),转移数量是\(Theta(n)\)的。
3.恰好把\(a_{3\sim 5}\)中的一个放在最左侧的\(3\)个,如把\(a_3\)放在最左侧,则对于任意的\(1\le j,k\le n\),\(f_{i-1,j,k}\to f_{i,a_3,a_4}\),这里设\(h_i=\max_{1\le j,k\le n} f_{i,j,k}\)。转移\(\Theta(1)\),转移数量\(\Theta(1)\)。
总复杂度\(\Theta(n^2)\)。
代码:

#include<iostream>
using namespace std;
int n;
int a[6010];
int f[2010][2010];
int g[2010];
struct node{
	int x,y,zhi;
}dui[2000010];
int cnt;
int add;
int sy;
int main(){
	cin>>n;
	for(int i=1;i<=3*n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			f[i][j]=-n;
		}
		g[i]=-n;
	}
	f[a[1]][a[2]]=0;
	f[a[2]][a[1]]=0;
	g[a[1]]=0;
	g[a[2]]=0;
	sy=0;
	for(int i=1;i<n;i++){
		cnt=0;
		if(a[i*3]==a[i*3+1]&&a[i*3]==a[i*3+2]){
			add++;
			continue;
		}
		if(a[i*3]>a[i*3+1]){
			swap(a[i*3],a[i*3+1]);
		}
		if(a[i*3+1]>a[i*3+2]){
			swap(a[i*3+1],a[i*3+2]);
		}
		if(a[i*3]>a[i*3+1]){
			swap(a[i*3],a[i*3+1]);
		}
		if(a[i*3]==a[i*3+1]){
			for(int j=1;j<=n;j++){
				if(j!=a[i*3]){
					dui[++cnt].x=a[i*3+2];
					dui[cnt].y=j;
					dui[cnt].zhi=f[a[i*3]][j]+1;
					dui[++cnt].x=j;
					dui[cnt].y=a[i*3+2];
					dui[cnt].zhi=f[a[i*3]][j]+1;
				}
			}
		}
		if(a[i*3+1]==a[i*3+2]){
			for(int j=1;j<=n;j++){
				if(j!=a[i*3+1]){
					dui[++cnt].x=a[i*3];
					dui[cnt].y=j;
					dui[cnt].zhi=f[a[i*3+1]][j]+1;
					dui[++cnt].x=j;
					dui[cnt].y=a[i*3];
					dui[cnt].zhi=f[a[i*3+1]][j]+1;
				}
			}
		}
		for(int j=1;j<=3;j++){
			dui[++cnt].x=a[i*3+1];
			dui[cnt].y=a[i*3+2];
			dui[cnt].zhi=f[a[i*3]][a[i*3]]+1; 
			dui[++cnt].x=a[i*3+2];
			dui[cnt].y=a[i*3+1];
			dui[cnt].zhi=f[a[i*3]][a[i*3]]+1;
			int tmp=a[i*3];
			a[i*3]=a[i*3+1];
			a[i*3+1]=a[i*3+2];
			a[i*3+2]=tmp;
		}
		for(int j=1;j<=n;j++){
			for(int k=0;k<=2;k++){
				dui[++cnt].x=a[i*3+k];
				dui[cnt].y=j;
				dui[cnt].zhi=g[j];
				dui[++cnt].x=j;
				dui[cnt].y=a[i*3+k];
				dui[cnt].zhi=g[j];
			}
		}
		for(int j=0;j<=2;j++){
			for(int k=0;k<=2;k++){
				if(j!=k){
					dui[++cnt].x=a[i*3+j];
					dui[cnt].y=a[i*3+k];
					dui[cnt].zhi=sy;
				}
			}
		}
		for(int j=1;j<=cnt;j++){
			f[dui[j].x][dui[j].y]=max(f[dui[j].x][dui[j].y],dui[j].zhi);
			g[dui[j].x]=max(g[dui[j].x],dui[j].zhi);
			g[dui[j].y]=max(g[dui[j].y],dui[j].zhi);
			sy=max(sy,dui[j].zhi);
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			ans=max(ans,f[i][j]+(i==a[3*n]&&j==a[3*n]));
		}
	}
	cout<<ans+add;
	return 0;
}

标签:le,int,题解,abc176F,左侧,Theta,转移,sim
From: https://www.cnblogs.com/z-2-we/p/18078422

相关文章

  • codeforce Round 935 div3 个人题解(A-E)
    A.SettingupCamp时间限制:每个测试1秒内存限制:每个测试256兆字节输入:标准输入输出:标准输出组委会计划在游览结束后带领奥林匹克运动会的参赛选手进行徒步旅行。目前,正在计算需要搭帐篷的数量。已知每顶帐篷最多可容纳3人。在参赛选手中,有a个内向型,b个外向型和c个综合型:......
  • 20240319每日一题题解
    20240319每日一题题解Problem判断一个数的结构是否为某个数重复两遍得到。例如,\(123123\)是重复两遍的数,而\(333\),\(809680\)​则不是保证输入的数字不超过longlong型范围。若是,则输出yes;否则输出no。Solution从数字的角度要想解决这个问题也不是不可以,但是不如将给定的数......
  • 【蓝桥杯选拔赛真题70】python最短路径和 第十五届青少年组蓝桥杯python选拔赛真题 算
    目录python最短路径和一、题目要求1、编程实现2、输入输出二、算法分析三、程序编写四、程序说明五、运行结果六、考点分析七、 推荐资料1、蓝桥杯比赛2、考级资料3、其它资料python最短路径和第十五届蓝桥杯青少年组python比赛选拔赛真题一、题目要求(注:i......
  • [ABC345F] Many Lamps 题解
    题意:给定一个\(n\)个点\(m\)条边的无向图,每个点的初始颜色为\(0\)。一次操作是将一条边的两个端点的颜色翻转。求是否能通过若干次操作使得最终有\(k\)个颜色为\(1\)的点。首先考虑什么情况下无解。会发现每一次操作,颜色为\(1\)的点的数量变化一定是\([0,+2,-2]\)......
  • CF1935 A-C题解
    A设\(s\)翻转后的字符串为\(t\),考虑进行\(n\)次操作可能生成出哪些字符串:只进行翻转操作——\(s\);先复制再\(n-1\)次翻转——\(s+t\);先翻转,再复制,再翻转\(n-2\)次,\(t+s\);多次复制的情况。情况2显然劣于情况1;情况4得到的字符串的开头一定是\(s\)或者\(t\)......
  • 初三多项式的运算练习 题解
    初三多项式的运算练习题解美好的下午时光要拿来写题解呜呜呜,一篇一篇地鸽得了。有些题要用到GF的知识,或许我可以找时间讲一下?贴一份我的FFT和NTT的板子。FFT:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;intn,m,limit,f[1<<22],g[1......
  • 洛谷 P2934 [USACO09JAN] Safe Travel G 题解
    前话貌似别人都是使用并查集维护的方法,然而由于排序、最短路等算法瓶颈,以下令\(n\)和\(m\)同阶,总的时间复杂度依然是\(\Theta(n\logn)\)的,那么并查集是否有点大材小用了。事实上,在建完最短路径树后,我给出了两种带\(\log\)的数据结构完成此题。题目分析翻译里已经把问......
  • 腾讯春招内参:2024最全Spring Boot面试题解析,技术精英必备!
    随着2024年春季招聘季的来临,腾讯再次开启了对富有才华和创新精神的技术人才的寻找之旅。作为一家全球领先的互联网科技公司,腾讯在寻找那些不仅拥有扎实的技术基础,而且能够适应快速发展和变化的行业环境的候选人。在众多技术栈中,SpringBoot作为简化Spring应用开发的工具,因其......
  • AtCoder Beginner Contest 345 A-F 题解
    A-LeftrightarrowQuestion给你一个由<、=和>组成的字符串\(S\)。请判断\(S\)是否是双向箭头字符串。字符串\(S\)是双向箭头字符串,当且仅当存在一个正整数\(k\),使得\(S\)是一个<、\(k\)个=和一个>的连接,且顺序如此,长度为\((k+2)\)。Solution按照题意......
  • 分月饼【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-分月饼中秋节,公司分月饼,m个员工,买了n个月饼,m<=n,每个员工至少分1个月饼,但可以分多个,单人分到最多月饼的个数是Max1,单人分到第二多月饼个数是Max2,Max1-Max2<=3,单人分到第n-1多月饼个数是Max(n-1),单人分到第n多月饼个数是Max(n),Max(n-1)–Max(n)<=3,问有多少......