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

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. 如何用命令行删除EasyBCD开机选择项?

    用硬盘安装Ubuntu方法的windows双系统电脑上面,很多人都是用EasyBCD设置的开机启动选择.所以当我们不需要双系统的时候,或者已经删除双系统后,或者安装双系统失败的情况下,发现电脑的开机启 ...

  2. Queue Explorer过期处理

    Queue Explorer是收费软件,用一段时间后会显示过期界面无法使用, 我们可以删除注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Cogin\Queue ...

  3. (转)MongoDB和Redis区别

    简介 MongoDB更类似Mysql,支持字段索引.游标操作,其优势在于查询功能比较强大,擅长查询JSON数据,能存储海量数据,但是不支持事务. Mysql在大数据量时效率显著下降,MongoDB更多 ...

  4. dmidecode 命令

    dmidecode                                                 #  查看全面硬件信息dmidecode | grep "Product ...

  5. 点分治Day2 动态树分治

    蒟蒻Ez3real冬令营爆炸之后滚回来更新blog... 我们看一道题 bzoj3924 ZJOI2015D1T1 幻想乡战略游戏 给一棵$n$个点的树$(n \leqslant 150000)$ 点 ...

  6. ACM学习历程——UVA540 Team Queue(队列,map:Hash)

    Description   Team Queue   Team Queue  Queues and Priority Queues are data structures which are know ...

  7. 【Lintcode】076.Longest Increasing Subsequence

    题目: Given a sequence of integers, find the longest increasing subsequence (LIS). You code should ret ...

  8. ReportEvent的正确使用方式

    向操作系统的事件管理器报告重大信息是一种非常有用的方式,特别是对于没有界面的后台服务而言.如果你对Windows编程有一定了解,应该很快就能想到使用ReportEvent这个API,然后快速写出下面的 ...

  9. python 带参数运行

    近段时间学考,又爱上了游戏.LOL  nba2k 使命召唤 哎! 因为使命召唤的原因  有时候会卡住  然后点关闭没用. 然后任务管理器打不开 所以我想写个杀掉这个程序的东西.  当然写一下是简单.但 ...

  10. Druid 在spring中的配置

    Spring配置中dataSource配置 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDat ...