首页 > 其他分享 >2018多校集训 H. Hills And Valleys

2018多校集训 H. Hills And Valleys

时间:2024-08-02 10:49:45浏览次数:10  
标签:Valleys Hills int num 2018 ans 区间 翻转 getchar

传送门

题意

给你一个\(n \leq 10^5\)的序列,数字都是0-9,你可以任意翻转一个子区间,问翻转后最长不降子序列的最大长度。

题解

简略题解:我开始考虑的是\(f_i,j,k\)表示的是翻转\(i\)结尾的区间,翻转区间贡献了最长不降序列中\(j\)到\(k\)的部分, 那么只要新加入的数小于\(j\)就可以翻过去,大于\(k\)就可以补到后面,但其实有问题,因为你不知道翻转区间之前的区间贡献的范围,所以要记录\(f_i,j,k,l\)多一个状态表示翻转区间之前贡献了\(1-l\),但这样会爆炸空间,我不知道能不能滚动数组,我最后考虑使用性质优化:对于一个翻转区间, 如果区间端点不是贡献最小值,或者贡献最大值,也就是端点不参与贡献,那么翻转一个更小不包括端点的区间必然更优。所以我们考虑直接使得右端点是最大值,那么就可以少存一位,然后枚举上一个最大值就好了,对于每一个最大值,只枚举最近的一个数就好了。

实现

#include <iostream>
#include <cstdio>
#define ll long long 
using namespace std;

int read(){
	int num=0, flag=1; char c=getchar();
	while(!isdigit(c) && c!='-') c=getchar();
	if(c == '-') flag=-1, c=getchar();
	while(isdigit(c)) num=num*10+c-'0', c=getchar();
	return num*flag;
}

int readc(){
	char c=getchar();
	while(!isdigit(c)) c=getchar();
	return c-'0';
}

const int N = 1e5+1000;
const int M = 10;
int n, T;
int a[N];
int f[N][M][M], L[N][M][M];
int g[N][M];
int h[N][M];
int las[N][M];
int main(){
	T = read();
	while(T--){
		n = read();
		for(int i=1; i<=n; i++) a[i]=readc();
		
		for(int i=1; i<=n; i++){
			for(int j=0; j<M; j++) las[i][j] = las[i-1][j];
			if(i != 1) las[i][a[i-1]] = i-1;
		}
		
		for(int i=0; i<=n+1; i++){
			for(int j=0; j<M; j++){
				g[i][j] = 0;
				h[i][j] = 0;
				for(int k=0; k<M; k++){
					f[i][j][k] = 0;
				} 
			}
		} 
		
		for(int i=1; i<=n; i++){
			for(int j=0; j<M; j++){
				g[i][j] = g[i-1][j];
				if(a[i] <= j) g[i][j] = max(g[i][j], g[i-1][a[i]] + 1);
			}
		} 
		
		for(int i=1; i<=n; i++){
			for(int j=0; j<M; j++){
				for(int k=j; k<M; k++){
					f[i][j][k]=0,L[i][j][k]=i;
					if(a[i]<=k && a[i]>=j) {
						f[i][j][k]=g[i-1][j]+1;
						
						for(int l=k; l>=a[i]; l--){
							int nex = las[i][l];	
							int res=f[nex][j][k]+1;
							if(res>f[i][j][k]) f[i][j][k]=res, L[i][j][k]=L[nex][j][k];
						}
					}
					
					
				} 
			}
			
			
		} 
		
		for(int i=n; i>=1; i--){
			for(int j=0; j<M; j++){
				h[i][j] = h[i+1][j];
				if(a[i] >= j){
					h[i][j] = max(h[i][j], h[i+1][a[i]]+1);
				}
			}
		}
		
		int ans=0, ansl=1, ansr=1;
		for(int i=1; i<=n; i++){
			for(int j=0; j<M; j++){
				for(int k=j; k<M; k++){
					if(f[i][j][k] + h[i+1][k] > ans){
						ans=f[i][j][k] + h[i+1][k], ansl=L[i][j][k], ansr=i;
					}
				}
			}
		}
		

		printf("%d %d %d\n", ans, max(1, ansl), ansr);
//		printf("%d\n", ans);
		
		
	}
	return 0;
} 





/*
1
9
203258468
*/

 

标签:Valleys,Hills,int,num,2018,ans,区间,翻转,getchar
From: https://www.cnblogs.com/ltdjcoder/p/18323850

相关文章

  • [网鼎杯 2018]Fakebook
    [网鼎杯2018]FakebookStep注册用户进入发现查看用户详情:/view.php?no=1尝试修改为2发现报错,可能是文件包含或者SQL注入于是尝试改成:/view.php?no=2'回显:[*]queryerror!(YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMariaDB......
  • phpstudy_2016-2018_rce_backdoor漏洞复现
    phpstudy_2016-2018_rce_backdoor说明内容漏洞编号phpstudy_2016-2018_rce漏洞名称RCE(RemoteCommand|CodeExecute)漏洞评级高危影响范围phpStudy2016、phpStudy2018漏洞描述攻击者可以利用该漏洞执行PHP命令,也可以称作phpStudy后门。漏洞描述攻击者可以利用该漏......
  • 类型提示在 pycharm 2018.1 中并不总是有效?
    我今天开始使用类型提示。在阅读了有关类型提示的文档后,我尝试编写一些愚蠢的示例来检查它是如何工作的,但被困在像这样简单的事情上。a:int=7.33我没有收到任何警告或错误。一切都正常,就像我没有使用类型提示一样。我期待一个警告,说浮点数不能分配给intvar。我尝......
  • 题解:P4563 [JXOI2018] 守卫
    思路解法:区间DP。本题虽标上紫题,但黄队说了:“不要被颜色所吓倒。”易得,区间\([l,r]\)中最右端的亭子\(r\)一定会有保镖。先说一下可见性判断吧,只要\(l,r\)的连线的斜率大于\(p,r\)连成的线的斜率大,\(l\)即是可见的。如图,红线是\(r\)无法看到的,而蓝线是\(r\)可......
  • [护网杯 2018]easy_tornado
    [护网杯2018]easy_tornadoStep靶机页面/flag.txt/welcome.txt/hints.txt其中:/flag.txtflagin/fllllllllllllag/hints.txtmd5(cookie_secret+md5(filename))链接url/file?filename=/welcome.txt&filehash=0d57a014b2bc88b9c6f12277495dwww其中filehash则是......
  • CVE-2018-5767 tenda固件栈溢出漏洞
    路由器固件型号:TendaAC1515.03.1.16_multi固件下载地址:https://drivers.softpedia.com/dyn-postdownload.php/d27e8410d32cd9de63a3506c47ded1bc/61ff85c5/75eb7/4/1binwalk分离binwalk-MeUS-bin漏洞点:在squashfs-root/bin/httpd可以通过readelf-hhttpd来查......
  • ccfcsp 201803.2 碰撞的小球 100分代码
    本题是一道小模拟规模小难度在碰撞检测在写模拟题时的思路应该是先找到应该储存的信息是哪些,抽象出来,应该模拟的方法是哪些。类似oop。includeusingnamespacestd;constintL=1000;structball{intp;chard=1;//只可能为1或-1,表示方向}b[L+1];intmain(){int......
  • 28449-2018 测评过程指南小结
    28449测评过程指南适用于测评机构、定级对象的主管部门及运营使用单位对定级对象安全等级保护状况开展安全测试评价等级测评工作要求:(附录C)1依据标准,遵循原则2恰当选取,保证强度3规范行为,规避风险存在的风险:(标准P1和课本108)1.影响系统正常运行2.泄露敏感信息3.......
  • [CEOI2018] Lottery 题解
    前言题目链接:洛谷。题意简述给出序列\(a_1\ldotsa_n\)和常数\(l\leqn\),定义:\[\operatorname{dis}(i,j)=\sum_{k=0}^{l-1}[a_{i+k}\neqa_{j+k}]\qquad(i,j\in[1,n-l+1])\]每次询问一个\(k\),求对于所有\(i\in[1,n-l+1]\),求\(\sum......
  • 交叉编译ethtool(ubuntu 2018)
    参考文章:https://www.cnblogs.com/nazhen/p/16800427.htmlhttps://blog.csdn.net/weixin_43128044/article/details/1379539131、下载相关安装包//ethtool依赖libmulgitclonehttp://git.netfilter.org/libmnl//ethtool源码gitclonehttp://git.kernel.org/pub/sc......