【考试记录】Educational Codeforces Round 59 (Rated for Div. 2)
(本来准备划水,结果被垃圾题艹翻了……)
T2题意:
定义一个数$x$的数字根$S(x)$为:将其各位数字相加得到一个新数,再将新数的数字和相加直到得到一个个位数,就是该数的数字根。
例如:$S(38)=S(3+8=11)=S(1+1=2)=2$
现在需要求数字根为$x$的从小到大第$k$个数。
$1\leq x\leq 9,k\leq 10^{12}$。
题解:
注意到数字和相加不会改变x对9取余的值。
那么可以得到:数字根为$x$的数就是满足模$9$的值为$x$的数。
特别地,数字根为$9$的数满足模$9$的值为$0$。
然后一行就可以了。
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio> using namespace std;
#define MAXN 100005
#define MAXM 500005
#define INF 0x7fffffff
#define ll long long inline ll read(){
ll x=,f=;
char c=getchar();
for(;!isdigit(c);c=getchar())
if(c=='-')
f=-;
for(;isdigit(c);c=getchar())
x=x*+c-'';
return x*f;
} int main(){
ll N=read();
for(ll i=;i<=N;i++){
ll k=read(),x=read();
cout<<x+(k-)*<<endl;
}
return ;
}
T4题意:
定义一个$n$次矩阵$A$的$x$次压缩矩阵$B$为:对于任意$i,j$满足$A(i,j)=B(\lceil i/x \rceil,\lceil j/x \rceil)$。
显然对于某些$x$是不存在$x$次压缩矩阵的。
现在给定一个$01$矩阵$A$,求最大的满足$x|n$的能压缩的$x$。
$n\leq 5200$。
题解:
发现压缩的过程就相当于把原矩阵$A$分成若干个$x\times x$的小矩阵,若每个小矩阵内数均相同则$x$次压缩是可行的。
那么暴力算法就是枚举每个$x$再进行$O(n^2)$枚举判断可行性。
考虑优化,枚举$k$的过程不太好优化,我们需要一个快速的办法判断一个小矩阵中的数是否相同。
由于数只有$01$,可以维护二维前缀和,若这个小矩阵内数的和不等于$0$或者$x\times x$则肯定不相同。
时间复杂度为$O(\sum \frac{n^2}{x^2})=O(n^2\times \sum \frac{1}{x^2})=O(n^2)$。
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio> using namespace std;
#define MAXN 5205
#define MAXM 500005
#define INF 0x7fffffff
#define ll long long inline int read(){
int x=,f=;
char c=getchar();
for(;!isdigit(c);c=getchar())
if(c=='-')
f=-;
for(;isdigit(c);c=getchar())
x=x*+c-'';
return x*f;
} int N,mp[MAXN][MAXN],sum[MAXN][MAXN];
char str[MAXN]; inline int gets(int x,int y,int xx,int yy){
return sum[xx][yy]-sum[xx][y]-sum[x][yy]+sum[x][y];
} bool check(int x){
for(int i=;i<=N;i+=x){
for(int j=;j<=N;j+=x){
if(gets(i-,j-,i+x-,j+x-)!= && gets(i-,j-,i+x-,j+x-)!=x*x)
return ;
}
}
return ;
} int chg(char ch){
if(isdigit(ch)) return ch-'';
else return ch-'A'+;
} int main(){
N=read();
for(int i=;i<=N;i++){
scanf("%s",str);
for(int j=;j<=N;j+=){
int tp=chg(str[j/]);
for(int k=;k<;k++)
mp[i][j+k]=(bool)(tp&(<<(-k-)));
}
}
for(int i=;i<=N;i++)
for(int j=;j<=N;j++)
sum[i][j]=sum[i][j-]+sum[i-][j]-sum[i-][j-]+mp[i][j];
for(int x=N;x>=;x--){
if(N%x) continue;
if(check(x)){
printf("%d\n",x);
return ;
}
}
return ;
}
T5题意:
给定一个长度为$n$的$01$串$s$,你可以进行任意次操作:
每次操作选取一段连续且相等的串$str$,记其长度为$k(1\leq k \leq n)$。
将这段串删除并将它右边的串接到左边,同时获得$A_k$的价值。
求将整个串删除为空串所能获得的最大价值。
$n\leq 100$。
题解:
这题当时触及到我的知识盲区了……(菜是原罪)考完才学了一下。
“区间消消乐”问题可以算作一种单独的$dp$模型,状态一般是
设$dp(i,j,k)$表示处理子串$[i,j]$,后面带上连续$k$个与$s_j$相同的字符所能获得的最大价值。
那么每种状态都有如下两种转移过来的方式:
- 消后面那段颜色相同的。$dp(i,j,k)=dp(i,j-1,0)+A_k+1$
- 枚举中间的某个断点$mid$,保证$s_{mid}=s_{j}$,此时可以把$[mid+1,j-1]$一段消去,后面接出更长的一段。$dp(i,j,k)=dp(i,mid,k+1)+dp(mid+1,j-1,0)$
时间复杂度$O(n^4)$。
这里我个人想再说细一点(因为思维太弱跳不了那么远QAQ):如何想到这个非常规的转移方程?
注意:以下讨论均是对于子区间[i,j]的处理。
如果这道题没有“删除后将右边接到左边”这句话,那么转移方程并不复杂:
$dp(i,j)=max\{dp(i,j),dp(i,k-1)+A_{j-k+1}\}$,其中$s_k=s_k+1=\cdots=s_j$。
但现在多了这句话,就要考虑怎么在转移时做出“拼接”这种骚操作来。
看上去有一个显而易见的暴力:枚举删除的区间(两端而不是一端)暴力转移。
此时状态大概是$dp(i,j,str)$表示区间$[i,j]$后面连着一段$str$。
由于思维量不大,所以这个方法的复杂度不用算也知道……
那么观察一下这个方法:记录后面连着一段的思想貌似可行,但真的有必要记录$str$吗?
现在我们状态中的str还是需要暴力处理,多这一维没有起到实质性的作用。
回到题目,消除任意一段str时,每一步操作都是消除一段连续字符。
反过来说,也就是用若干段连续字符必然能拼出任意的str。
那么我们为什么不能把状态里的str改成数字k,表示后面连着一段长度为k的连续字符呢?
Nice!我们发现用改完后的状态能够表示出原来的所有状态,这说明这个思路是可做的。
此时的状态为$dp(i,j,k,0/1)$表示$[i,j]$后面连着$k$个$0/1$。
我们还可以把$j$右移一位以略去第四维而将定义改成连着$k$个与$s_j$相同的字符。
无论哪种状态都能够通过本题了。
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio> using namespace std;
#define MAXN 105
#define MAXM 500005
#define INF 0x7fffffff
#define ll long long inline ll read(){
ll x=,f=;
char c=getchar();
for(;!isdigit(c);c=getchar())
if(c=='-')
f=-;
for(;isdigit(c);c=getchar())
x=x*+c-'';
return x*f;
} ll dp[MAXN][MAXN][MAXN];
ll N,A[MAXN];
char str[MAXN]; int main(){
N=read();
scanf("%s",str+);
for(ll i=;i<=N;i++)
A[i]=read();
for(ll i=;i<=N;i++)
for(ll k=;k<=N;k++)
dp[i][i][k]=A[k+];
for(ll l=;l<=N;l++)
for(ll i=;i<=N-l+;i++){
ll j=i+l-;
for(ll k=;k<=N;k++){
dp[i][j][k]=dp[i][j-][]+A[k+];
for(ll l=i;l<j;l++)
if(str[l]==str[j])
dp[i][j][k]=max(dp[i][j][k],dp[i][l][k+]+dp[l+][j-][]);
}
}
printf("%I64d\n",dp[][N][]);
return ;
}
【考试记录】Educational Codeforces Round 59 (Rated for Div. 2)的更多相关文章
- Educational Codeforces Round 59 (Rated for Div. 2) DE题解
Educational Codeforces Round 59 (Rated for Div. 2) D. Compression 题目链接:https://codeforces.com/contes ...
- Educational Codeforces Round 59 (Rated for Div. 2) E 区间dp + 状态定义 + dp预处理(分步dp)
https://codeforces.com/contest/1107/problem/E 题意 给出01字符串s(n<=100),相邻且相同的字符可以同时消去,一次性消去i个字符的分数是\(a ...
- C. Brutality Educational Codeforces Round 59 (Rated for Div. 2) 贪心+思维
C. Brutality time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- Educational Codeforces Round 59 (Rated for Div. 2)
熬夜爆肝,智商急剧下降 坐标UTC+8晚上23:35开始 晚上脑袋转的慢,非常慢 T1上来先做还花了好几分钟 T2本来是有式子的我TM写数位DP写炸了然后才发现是有公式 T3英语不好,一开始题意没读懂 ...
- Educational Codeforces Round 59 (Rated for Div. 2) (前四题)
A. Digits Sequence Dividing(英文速读) 练习英语速读的题,我还上来昏迷一次....只要长度大于2那么一定可以等于2那么前面大于后面就行其他no 大于2的时候分成前面1个剩下 ...
- Educational Codeforces Round 69 (Rated for Div. 2) E. Culture Code
Educational Codeforces Round 69 (Rated for Div. 2) E. Culture Code 题目链接 题意: 给出\(n\)个俄罗斯套娃,每个套娃都有一个\( ...
- Educational Codeforces Round 64 (Rated for Div. 2)题解
Educational Codeforces Round 64 (Rated for Div. 2)题解 题目链接 A. Inscribed Figures 水题,但是坑了很多人.需要注意以下就是正方 ...
- Educational Codeforces Round 53 (Rated for Div. 2) (前五题题解)
这场比赛没有打,后来补了一下,第五题数位dp好不容易才搞出来(我太菜啊). 比赛传送门:http://codeforces.com/contest/1073 A. Diverse Substring ...
- Educational Codeforces Round 76 (Rated for Div. 2) E. The Contest
Educational Codeforces Round 76 (Rated for Div. 2) E. The Contest(dp+线段树) 题目链接 题意: 给定3个人互不相同的多个数字,可以 ...
随机推荐
- less的安装使用和入门实践
1.简介 LESSCSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法,为CSS的赋予了动态语言的特性,如变量.继承.运算.函数等,更方便CSS的编写和维护. LESSCSS可 ...
- html5基本格式
html5基本格式 学习要点: HTML5 文档的基本格式 2. 开发工具的基本操作 一. 文档基本格式 <!DOCTYPE html> 文档声明,告诉计算机这是一个HTML5文档. ...
- 如何设置android studio让程序运行在真机中
1.Run——>Edit Configurations... 2.运行
- 揭秘FaceBook Puma演变及发展——FaceBook公司的实时数据分析平台是建立在Hadoop 和Hive的基础之上,这个根能立稳吗?hive又是sql的Map reduce任务拆分,底层还是依赖hbase和hdfs存储
在12月2日下午的“大数据技术与应用”分论坛的第一场演讲中,来自全球知名互联网公司——FaceBook公司的软件工程师.研发经理邵铮就带来了一颗重磅炸弹,他将为我们讲解FaceBook公司的实时数据处 ...
- Go丨语言package github.com/Go-SQL-Driver/MySQL: exec: "git": executable file not found in %PATH%解决方法
Go语言在添加第三方MySQL驱动的时候报错: go: missing Git command. See https://golang.org/s/gogetcmd package github.co ...
- [转]BFC 神奇背后的原理
BFC 已经是一个耳听熟闻的词语了,网上有许多关于 BFC 的文章,介绍了如何触发 BFC 以及 BFC 的一些用处(如清浮动,防止 margin 重叠等).虽然我知道如何利用 BFC 解决这些问题, ...
- VijosP1626:爱在心中
描述 “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home.” 在爱的国度里有N个人,在他们的心中都有 ...
- 13 vue学习 package.json
一:package.json文件详解 管理你本地安装的npm包 .定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元数据).npm install命令根据这个配置文件,自动 ...
- Thinkpad 拆光驱更换光驱硬盘支架、拆光驱面板 T400 T440
拆光驱.硬盘装支架的环节就不多说了.主要说下拆光驱面板. 先拿细物(区别针.回形针),捅这个洞,就能把光驱仓打开弹出来后,反过来,这里有个卡扣放大看,按住这卡扣,然后往外掰,把面板掰出来 掰出来的面板 ...
- 廖雪峰的java教程
F:\教程\0-免费下载-廖雪峰 公司电脑地址: G:\学习中\廖雪峰的java教程 廖雪峰java课程地址: https://www.feiyangedu.com/category/JavaSE 0 ...