2023.9.23 总结
T1
题面:从左往右有n个格子,编号
因为最多换
那我们可以枚举有
最后特判一下全是1即可。
T2
题意:给出一个
分析美丽的图的性质,可发现:对于每一列,只有最上面那一个需要染色,对于一个斜行,也只有最左边的需要染色。
当然,已有的需要考虑。
我们可以以此来考虑
就是每一列每一列的做,考虑每一个斜行就可以了。
T3
题面:给出包含
这道题可以用线段树暴做,这里提供一种贪心的想法。
选出一个满足题目要求的子序列很简单,但是重点是让字典序最小。
很明显,我们希望让越大的数越后选,但是又必须选到这个数,在他最后一次出现切前面没选到的时候就必须选他了。
所以,我们可以这样贪心,开一个数组
从前往候选,开一个记录选数的序列,若最后选的一个数以后还有且选现在这个数比最后选的一个数优,替换之,否则将其加进去。
时间复杂度
还可以这样:
我们可以从后往前选,随便构造出一个序列,不一定字典序最小,用链表存储。
每次往前找,看一下当前选的这个数放进去之后会不会比原来更优,是则替换之,然后看前一个。
T4
题意:给出一棵树,求不在同一条路径上的三元点对数量。
这道题是正着思考。
从一个节点出发,若有三个节点不在同一路径上,则要不然在他不同的三棵子树,或两个在两棵不同的子树,一个不在自己子树,或者两个或三个节点都在其祖先但不在自己的子树上。
对于最后一种情况,其实考虑到别的节点,还会变成前两种情况。
所以,只考虑前两种情况。
我们令
对于以
对于第二种情况,就是任意三个子树
累加输出答案。
T5
题意:给出一个字符串
一个基本的思路,枚举在第
但要统计的是字符串,有可能会有重复,我们要想方法去重。
先预处理出每个位置往后字符
动规数组
转移我们只需枚举每个字母,他们对于
这里可以保证一个东西,就是字符串一定在最前面出现。
例如:
abc|abcabc
我们在如图转移时,就会在
如何统计答案呢?
若在
因为,如果不是在
举例:
abcabc|abc
我们在做
但
最后输出即可。
代码:
#include<bits/stdc++.h>
using namespace std;
const long long mod=998244353;
string a;
long long t[105][55],s,f[105][105];
void dijah(long long x)
{
long long q=t[1][a[x]-'a'],w;
if(q==0||q>=x)return;
memset(f,0,sizeof(f));
f[q][x]=1;
for(int i=1;i<x;i++)
{
for(int j=x;j<a.size();j++)
{
for(int u=0;u<26;u++)
{
q=t[i+1][u],w=t[j+1][u];
if(q&&w&&q<x)f[q][w]+=f[i][j],f[q][w]%=mod;
}
q=t[i+1][a[x]-'a'];
if(q==x)s+=f[i][j],s%=mod;
}
}
return;
}
int main()
{
cin>>a;
a=' '+a;
for(int i=1;i<a.size();i++)
{
for(int j=0;j<26;j++)
{
for(int u=i;u<a.size();u++)
{
if(j+'a'==a[u])
{
t[i][j]=u;
break;
}
}
}
}
for(int i=2;i<a.size();i++)dijah(i),s%=mod;
cout<<s;
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)