首页 > 其他分享 >CF750E - New Year and Old Subsequence

CF750E - New Year and Old Subsequence

时间:2023-05-07 09:22:22浏览次数:50  
标签:CF750E imfo int lst Subsequence 区间 New sg dp

题意:给一个字符串,每次询问它的一个区间,问最少删除多少个字符,使得区间没有子序列 2016,但是有子序列 2017

My solution

首先考虑贪心,通过预处理的方式找到区间最后一个 7,依次往前贪心的找到最靠后的一组 2017。接下来,我们需要 7 的后面没有 67 前面的部分不能组合出 2016

我们先考虑区间 \(dp\),设 \(dp_{l,r,L,R}\) 是对于原序列的区间 \([l,r]\),不能出现 2016 的子区间 \([L,R]\) 作为子序列的最小删除次数。

我们发现,这个可以通过 \(4^3\) 的合并在线段树上维护。因为合并两个相邻区间的时候,我们只需要枚举 \([L,R]\) 的间断点 \(t\),\([L,t]\) 和 \([t,R]\) 分别不在两边出现即可。我们可以互推来说明两者是等价的。

然后,我们通过四次查询查到我们找到的这组 2016 之间的位置。然后我们发现第四组可以直接删掉,因为这里一个 6 也不能有,我们只需要合并前三组。

而前三组合并的硬性条件是我们选定的 20 不能被删掉,也就意味着,想要 00 的后面不能出现 016,等价于不能出现 16,没有 01 等价于没有 1。我们把 \(dp\) 重新更新一下然后合并就可以得到正确答案了。

复杂度是 \(O(4^3 (n+q)\log n)\)。但是有四次查询,跑得很慢。


string s;
int n,q,a[200005],L,R;
int lst[200005][10];
struct imfo{
	int dp[4][4];
	imfo(){
		rd(l,4)rep(r,l,3)dp[l][r]=1e9;
	}
	imfo(int imherecnmdjbdxcnmnmzlnmsl){
		rd(l,4)rep(r,l,3){
			dp[l][r]=0*imherecnmdjbdxcnmnmzlnmsl;
		}
	}
	imfo operator +(const imfo b)const{
		imfo res;
		rd(l,4)rep(r,l,3)rep(t,l,r){
			res.dp[l][r]=min(res.dp[l][r],dp[l][t]+b.dp[t][r]);
		}return res;
	}
}I(114514);
 
struct node{
	int l,r;
	imfo s;
}sg[800005];
inline void init(int i,int l,int r){
	sg[i].l=l,sg[i].r=r;
	if(l==r){
		sg[i].s=I;
		if(a[l]==6)sg[i].s.dp[3][3]=1;
		if(a[l]==1)sg[i].s.dp[2][2]=1;
		if(a[l]==0)sg[i].s.dp[1][1]=1;
		if(a[l]==2)sg[i].s.dp[0][0]=1;
		return;
	}
	init(i<<1,l,(l+r)>>1);
	init(i<<1|1,((l+r)>>1)+1,r);
	sg[i].s=sg[i<<1].s+sg[i<<1|1].s;
}
inline imfo query(int i,int l,int r){
	if(sg[i].l>r||sg[i].r<l)return I;
	if(sg[i].l>=l&&sg[i].r<=r)return sg[i].s;
	return query(i<<1,l,r)+query(i<<1|1,l,r);
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>q>>s;
	s='$'+s;
	rp(i,n)a[i]=s[i]-'0';
	rp(i,n){
		rd(j,10)lst[i][j]=lst[i-1][j];
		lst[i][a[i]]=i;
	}init(1,1,n);
	rp(_,q){
		cin>>L>>R;
		int a7=lst[R][7],a1=lst[a7][1],a0=lst[a1][0],a2=lst[a0][2];
		if(a2<L){
			cout<<-1<<endl;
			continue;
		}
		imfo a=query(1,a1+1,R),b=query(1,a0+1,a1-1),c=query(1,a2+1,a0-1),d=query(1,L,a2-1);
		ll ans=a.dp[3][3];
		b.dp[1][3]=b.dp[2][3];
		b.dp[1][2]=b.dp[2][2];
		b.dp[1][1]=1e9;
		c.dp[0][3]=c.dp[1][3];
		c.dp[0][2]=c.dp[1][2];
		c.dp[0][1]=c.dp[1][1];
		c.dp[0][0]=1e9;
		imfo res=d+c+b;
		cout<<ans+res.dp[0][3]<<endl;
	}
	return 0;
}
//Crayan_r

rng_58's solution

对于上面的做法,我们重新设计状态,我们把 7 也加入进要判断的区间里面。但是 \(dp\) 状态就不是简单的“不能出现”,而是“满足要求”。也就是,凡是有 xx76 的状态,都是“保留 xx7 而消去 xx6”。

对于这个状态,我们同样可以通过原先的转移式转移。因为我们可以把转移拆成 6 的转移和 7 的转移,分开论证的话就可以很容易发现是等价的。

然后我们只需要对 \([l,r]\) 进行一次查询就可以得到满足要求的答案。复杂度 \(O(5^3(n+q)\log n)\),但是信息合并部分的常数非常小,因为本质上是一个区间 \(dp\)。跑的很快。

Code by rng_58

标签:CF750E,imfo,int,lst,Subsequence,区间,New,sg,dp
From: https://www.cnblogs.com/jucason-xu/p/17378890.html

相关文章

  • ChatGPT有门槛?微软NewBing全面开放
    最近微软毫无征兆的宣布BingChat全面开放,人人可用!大家都知道ChatGPT得使用门槛很高,而BingChat底层调用的是GPT4.0的模型,这无疑是体验GPT4.0最简单的姿势了,无需任何等待。只需注册一个账户,首页即可体验。让我们一起体验看看吧,打开微软必应首页,点击上面的聊天按钮,就进入了必应的智......
  • PAT Advanced 1007. Maximum Subsequence Sum
    PATAdvanced1007.MaximumSubsequenceSum1.ProblemDescription:Givenasequenceof\(K\)integers{\(N_1,N_2,...,N_K\)}.Acontinuoussubsequenceisdefinedtobe{\(N_i,N_{i+1},...,N_j\)}where\(1≤i≤j≤K\).TheMaximumSubsequencei......
  • Hugging News #0506: StarCoder, DeepFloyd/IF 好多新的重量级模型
    每一周,我们的同事都会向社区的成员们发布一些关于HuggingFace相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「HuggingNews」,本期HuggingNews有哪些有趣的消息,快来看看吧!StarCoder:最新的代码生成LLMBlog:ht......
  • 关于Class.forName(className).newInstance()介绍
    Class.forName(xxx.xx.xx) 返回的是一个类首先你要明白在java里面任何class都要装载在虚拟机上才能运行。这句话就是装载类用的(和new 不一样,要分清楚)。 至于什么时候用,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?只有你提到的这个方......
  • mv: cannot move '/usr/local/lib/R/site-library/00LOCK-Biobase/00new/Biobase' to
     01、安装Biobase 包的时候遇到如下问题mv:cannotmove'/usr/local/lib/R/site-library/00LOCK-Biobase/00new/Biobase'to'/usr/local/lib/R/site-library/Biobase':Permissiondenied 02、解决方法在R终端执行如下命令:Sys.setenv(R_INSTALL_STAGED=FALSE)......
  • Codeforces 908H - New Year and Boolean Bridges(FWT)
    一道挺有意思的题,并且感觉有点诈骗的成分在内(首先考虑分析三种字符的性质:显然任意两点\(i,j\)之间要么\(i\)可以到达\(j\),要么\(j\)可以到达\(i\),否则AOX三个一个都不能满足。如果两点间的状态是A,那么这两点必须在同一强连通分量内。如果两点间的状态是X,那么这......
  • AtCoder Regular Contest 134 D Concatenate Subsequences
    洛谷传送门AtCoder传送门我一年前甚至不会做/qd发现\(a_{x_1}\)为\(k=\min\limits_{i=1}^na_i\)时最优。然后开始分类讨论:如果\(\min\limits_{a_i=k}a_{i+n}\lek\),答案为\((k,\min\limits_{a_i=k}a_{i+n})\)。这是因为如果再选一个\(k\)肯定不优。否则......
  • django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.3 or newer is requi
     1、在项目中__init__.py中这个报错原因,python3.5以上版本不支持这种方式frompymysqlimportinstall_as_MySQLdbinstall_as_MySQLdb()解决:importpymysqlpymysql.version_info=(1,4,3,"final",0)#指定了pymysql的版本:1.4.3,按照你版本修改pymysql.install_as_MySQLdb()......
  • 实例化对象 A a = new A();
    "new"在Java中代表实例化的意思,Aa=newA()代表实例化了一个对象a,这个对象a属于A类.可以认为A是一个抽象概念,对象a是一个实体(存储于内存),等式左边实际上就是用类A定义对象a,等式右边就是创造对象a的过程.Aa;   是定义一个类型为A的对象。new实例化a=n......
  • Elasticsearch专题精讲——What's new in 8.7?
    What'snewin8.7?https://www.elastic.co/guide/en/elasticsearch/reference/8.7/release-highlights.html,ortherversions:8.6 | 8.5 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0Timeseries(TSDS)GA(时间序列)TimeSeriesDataStream(TSDS)isafeatureforoptimi......