博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
12.25模拟赛T1
阅读量:4984 次
发布时间:2019-06-12

本文共 1281 字,大约阅读时间需要 4 分钟。

 

可以区间dp,但是复杂度太高。

所以应该是贪心,怎么贪心呢?

这种题目,最好还是手玩找一些规律。

可以发现,由于保证可以m次填完,所以颜色之间没有相互包含关系。

比较像分治的模型。

所以考虑拿到一个区间怎么处理。

假设a[l]==a[r],那么为了合法,一定先刷这种颜色。然后分部分递归下去。

否则,对于区间:AEEGEABBBCDDC

里面的夹心肯定不能先处理了,可以大概看做:A..AB..BC..C

先刷哪一个?

刷两边长度较小的一个

证明:

如果刷中间,那么中间的位置之后就不能再动了。如果刷比较长的一个,那么之后不能再动。

如果刷比较短的一个,长的可以再多刷几次,贡献更大。

比较即可。(如果两边长度相同,比较下一个。)

O(m^2+n)

理论上可以后缀数组优化到:O(mlogn+n)

#include
#define reg register int#define il inline#define numb (ch^'0')using namespace std;typedef long long ll;il void rd(int &x){ char ch;x=0;bool fl=false; while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true); for(x=numb;isdigit(ch=getchar());x=x*10+numb); (fl==true)&&(x=-x);}namespace Miracle{const int N=1e5;const int M=5005;int st[M],nd[M];ll ans;int a[N];int n,m;vector
mem[M];void sol(int l,int r){ //cout<<" sol "<
<<" "<
<<" "<
<
r) return; if(l==r){ ++ans;return; } if(a[l]==a[r]){ ans+=r-l+1; int las=l; for(reg i=1;i
nd[a[R]]-st[a[R]]+1){ go=r;break; } L=nd[a[L]]+1;R=st[a[R]]-1; if(L>R) go=l; } if(go==l){ int las=l; for(reg i=1;i

总结:

没有想到的原因是,还是没有从手玩找规律这个方向入手。

对于一些没有什么思路的题,可以尝试“不完全归纳”

其实规律还是比较简单的。

 

转载于:https://www.cnblogs.com/Miracevin/p/10175755.html

你可能感兴趣的文章
流程审批设计
查看>>
别装了,你根本就不想变成更好的人
查看>>
数据库 join
查看>>
AES加密工具类[亲测可用]
查看>>
方法区
查看>>
Django-----ORM
查看>>
ARCGIS部分刷新
查看>>
发 零 食
查看>>
poj3613:Cow Relays(倍增优化+矩阵乘法floyd+快速幂)
查看>>
洛谷P1886 滑动窗口
查看>>
Shell编程(二)Bash中调用Python
查看>>
主动与被动监控 拓扑图组合图 自定义监控
查看>>
SQL总结(一)基本查询
查看>>
PDF分割--可脱离python环境执行,可传参数,可弹窗的PC端小工具
查看>>
cas-client-core单点登录排除不需要拦截的URL
查看>>
OCR技术浅探 : 文字定位和文本切割(2)
查看>>
jmeter集合点
查看>>
Java类代码块执行顺序
查看>>
克鲁斯卡尔(模板题)
查看>>
汉字转拼音
查看>>