(本来准备划水,结果被垃圾题艹翻了……)

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)的更多相关文章

  1. Educational Codeforces Round 59 (Rated for Div. 2) DE题解

    Educational Codeforces Round 59 (Rated for Div. 2) D. Compression 题目链接:https://codeforces.com/contes ...

  2. 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 ...

  3. 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 ...

  4. Educational Codeforces Round 59 (Rated for Div. 2)

    熬夜爆肝,智商急剧下降 坐标UTC+8晚上23:35开始 晚上脑袋转的慢,非常慢 T1上来先做还花了好几分钟 T2本来是有式子的我TM写数位DP写炸了然后才发现是有公式 T3英语不好,一开始题意没读懂 ...

  5. Educational Codeforces Round 59 (Rated for Div. 2) (前四题)

    A. Digits Sequence Dividing(英文速读) 练习英语速读的题,我还上来昏迷一次....只要长度大于2那么一定可以等于2那么前面大于后面就行其他no 大于2的时候分成前面1个剩下 ...

  6. Educational Codeforces Round 69 (Rated for Div. 2) E. Culture Code

    Educational Codeforces Round 69 (Rated for Div. 2) E. Culture Code 题目链接 题意: 给出\(n\)个俄罗斯套娃,每个套娃都有一个\( ...

  7. Educational Codeforces Round 64 (Rated for Div. 2)题解

    Educational Codeforces Round 64 (Rated for Div. 2)题解 题目链接 A. Inscribed Figures 水题,但是坑了很多人.需要注意以下就是正方 ...

  8. Educational Codeforces Round 53 (Rated for Div. 2) (前五题题解)

    这场比赛没有打,后来补了一下,第五题数位dp好不容易才搞出来(我太菜啊). 比赛传送门:http://codeforces.com/contest/1073 A. Diverse Substring ...

  9. Educational Codeforces Round 76 (Rated for Div. 2) E. The Contest

    Educational Codeforces Round 76 (Rated for Div. 2) E. The Contest(dp+线段树) 题目链接 题意: 给定3个人互不相同的多个数字,可以 ...

随机推荐

  1. less的安装使用和入门实践

    1.简介 LESSCSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法,为CSS的赋予了动态语言的特性,如变量.继承.运算.函数等,更方便CSS的编写和维护. LESSCSS可 ...

  2. html5基本格式

    html5基本格式 学习要点: HTML5 文档的基本格式 2. 开发工具的基本操作 一.  文档基本格式 <!DOCTYPE  html>  文档声明,告诉计算机这是一个HTML5文档. ...

  3. 如何设置android studio让程序运行在真机中

    1.Run——>Edit Configurations... 2.运行

  4. 揭秘FaceBook Puma演变及发展——FaceBook公司的实时数据分析平台是建立在Hadoop 和Hive的基础之上,这个根能立稳吗?hive又是sql的Map reduce任务拆分,底层还是依赖hbase和hdfs存储

    在12月2日下午的“大数据技术与应用”分论坛的第一场演讲中,来自全球知名互联网公司——FaceBook公司的软件工程师.研发经理邵铮就带来了一颗重磅炸弹,他将为我们讲解FaceBook公司的实时数据处 ...

  5. 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 ...

  6. [转]BFC 神奇背后的原理

    BFC 已经是一个耳听熟闻的词语了,网上有许多关于 BFC 的文章,介绍了如何触发 BFC 以及 BFC 的一些用处(如清浮动,防止 margin 重叠等).虽然我知道如何利用 BFC 解决这些问题, ...

  7. VijosP1626:爱在心中

    描述 “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home.” 在爱的国度里有N个人,在他们的心中都有 ...

  8. 13 vue学习 package.json

    一:package.json文件详解 管理你本地安装的npm包 .定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元数据).npm install命令根据这个配置文件,自动 ...

  9. Thinkpad 拆光驱更换光驱硬盘支架、拆光驱面板 T400 T440

    拆光驱.硬盘装支架的环节就不多说了.主要说下拆光驱面板. 先拿细物(区别针.回形针),捅这个洞,就能把光驱仓打开弹出来后,反过来,这里有个卡扣放大看,按住这卡扣,然后往外掰,把面板掰出来 掰出来的面板 ...

  10. 廖雪峰的java教程

    F:\教程\0-免费下载-廖雪峰 公司电脑地址: G:\学习中\廖雪峰的java教程 廖雪峰java课程地址: https://www.feiyangedu.com/category/JavaSE 0 ...