首页 > 其他分享 >【题解】CF889E

【题解】CF889E

时间:2023-03-20 16:24:14浏览次数:45  
标签:return CF889E int 题解 second getchar mod

题目描述

\[f(x,n) = x \mod a_n \]

\[f(x,i) = ( x \mod a_i ) + f(x \mod a_i,i+1) \]

给出a序列,当x取遍所有非负整数时\(f(x,1)\)的最大值。

题解

首先注意到\(a_i\)只有比前面所有的\(a\)都小时才有用废话
其次是\(x\)的规模每次都会缩到\(a_i\)的同余系内。
然后似乎就没有思路了(悲
实际上,注意到在最优方案种一定存在某时刻\(x=a_i-1\),否则我们可以将\(x\)加一使得答案变大。
那么我们对于一个\(x\)就有两种操作:

  • 保持x不加减,模\(a_i\)
  • 使得x模之后变为 \(a_i-1\)

由此设计DP,\(f[i][j]\)为到第i个a时当前答案是\(i\times j+f[i][j]\)的最大值。
转移如下:

\[f(i+1,j\bmod a_{i+1}) = f(i,j) + (j-j\bmod a_{i+1})*i\\ f(i+1,a_{i+1}-1) = f(i,j) + ((j+1)/a_{i+1}*a_{i+1}-a_{i+1})*i \]

第二种转移是减是因为加我们并清楚对于之前的\(a\)的影响是什么,而减一定不会影响之前的。

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int rd(){
	int f=1,j=0;
	char w=getchar();
	while(!isdigit(w)){
		if(w=='-')f=-1;
		w=getchar();
	}
	while(isdigit(w)){
		j=j*10+w-'0';
		w=getchar();
	}
	return f*j;
}
const int N=200010;
int n,a[N],ans;
map<int,int>f;
signed main(){
	n=rd();
	for(int i=1;i<=n;i++)a[i]=rd();
	f[a[1]-1]=0;
	for(int i=2;i<=n;i++){
		for(auto it=f.lower_bound(a[i]);it!=f.end();it++){
//			cout<<"kkk\n";
			int x=it->first,y=it->second;
//			cout<<x<<":"<<y<<"\n";
			f[x%a[i]]=max(f[x%a[i]],y+(i-1)*(x-x%a[i]));
			f[a[i]-1]=max(f[a[i]-1],y+(i-1)*((x+1)/a[i]*a[i]-a[i])); 
		}
		while(true){
			auto it=f.lower_bound(a[i]);
			if(it==f.end())break;
			f.erase(it);
		}
	}
	for(auto it=f.begin();it!=f.end();it++){
//		cout<<it->first<<":"<<it->second<<"\n";
		ans=max(ans,n*(it->first)+(it->second));
	}
	printf("%lld\n",ans);
	return 0;
}

标签:return,CF889E,int,题解,second,getchar,mod
From: https://www.cnblogs.com/T-water/p/17236732.html

相关文章

  • 【题解】CF1368E
    题目描述有一个由\(n\)个点\(m\)条边组成的有向无环图,每个点出度至多为2。您需要标记一些点(不超过\(\frac{4}{7}n\)个)。标记一个点\(u\)将会删除所有与\(u\)连......
  • 【题解】CF1225F
    题目描述给出一棵n个节点的有根树T,点编号为0∼n−1。记f(u)为u的父节点。初始时你有一条n个点的链L(标号任意),每次操作你可以令f(u)←f(f(u))。需要将链改造......
  • 【题解】CF1439A2
    题目描述给定一个\(n\timesm\)的\(01\)矩阵,每次操作可以将某个\(2\times2\)的矩阵内的\(3\)个数取反,请在\(n\timesm\)步内将矩阵变为全\(0\)。题解这种题......
  • C# 上传接口返回错误: (413) Request Entity Too Large问题解决
    问题报错:Failedtoloadresource:theserverrespondedwithastatusof413(RequestEntityTooLarge)找了很多方法,说什么反向代理配置啥的其实很多项目并没有开反......
  • CF1804C 题解
    题目链接今天好不容易有空更那就再更一篇(一道很有意思的诈骗题,我会写出我的思考过程。题意:(我的翻译)一个转盘有$n$个格子分别为$0$$1$$2$$\cdots$$n-1$,初始时在......
  • 【题解】ABC294
    AtCoderBeginnerContest294AFilter无意义题,找出所有偶数。BASCIIArt无意义题,按题意模拟。CMergeSequences无意义题,离散化即可。DBank无意义题,set维护即......
  • ucyhf 题解
    题目传送门愚人节题目,具体题面看翻译。先写一个判断素数的函数,这题并不需要什么特殊的筛法,新手可以参考以下代码。boolisprime(intx){if(x<=1)return0;......
  • Party 题解
    题目传送门一道简单的并查集练手题。与普通的并查集不同,除此之外还需记录下来某两人的讨厌关系,使得他们不能在同一集合中。if(find_root(x)==find_root(y))vis[find......
  • CF1060E 题解
    前言题目传送门!更好的阅读体验?提供一种更加麻烦的换根DP写法。思路代码#include<iostream>#include<cstdio>usingnamespacestd;typedeflonglongll;cons......
  • 3 月 15 日测试题解
    3月15日测试题解这学校的评测机我是真的吐了,\(\text{380pts}\rightarrow\text{300pts}\),电脑速度跟BZOJ有的一拼。一句话总结:简单,过于简单,但是在练习读题能力上十......