Problem A 紫色激情

一个序列$\{a_n\}$,求出方差最大的子序列。

其中方差 [l,r] 的定义是$S^2 = \frac{1}{n} \sum\limits_{i=l}^{r} (x_i-\bar{x})^2$

对于100%的数据满足$n \leq 10^3$

Sol : 直接推一波公式就可以前缀和优化了。

  ${ S_{l,r} }^2 = -\bar{x}^2 +\frac{\sum_{i=l}^r {x_i}^2}{n}$

时间复杂度$O(n^2)$

# include<bits/stdc++.h>
# define int long long
using namespace std;
const int N=2e3+;
int s1[N],s2[N];int n;
inline int read()
{
int X=,w=; char c=;
while(c<''||c>'') {w|=c=='-';c=getchar();}
while(c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
return w?-X:X;
}
inline void write(int x)
{
if (x<) x=-x,putchar('-');
if (x>) write(x/);
putchar(x%+'');
}
signed main()
{
n=read();
for (int i=;i<=n;i++) {
int t=read();
s1[i]=s1[i-]+t;
s2[i]=s2[i-]+t*t;
}
double ans=-1e9; int ansl=,ansr=;
for (int l=;l<=n;l++)
for (int r=l;r<=n;r++) {
double t=-(double)(s1[r]-s1[l-])*(s1[r]-s1[l-])/(double)(r-l+)/(double)(r-l+);
double w=(double)(s2[r]-s2[l-])/(double)(r-l+);
if (t+w>ans) { ans=t+w; ansl=l; ansr=r;}
}
write(ansl);putchar(' ');write(ansr); putchar('\n');
return ;
}

passion.cpp

Problem B 克罗地亚狂想曲

共有$n$个节点,从每个节点可以向前面一个节点连一条边,而如果和后面一个节点的连边将被忽略。

两个相连节点之间有一条连边,可以直接经过,找出一条访问的路径,使得每个节点被经过最多2次,

经过路径上点值之和最大。

对于100%的数据 , $n \leq 3\times 10^5 $

Sol: 显然,向前连边的这个过程是没有后效性的,所以可以进行动态规划。

  而每个节点最多只能被经过2次保证了一次转移的合法性。

  设$f_i$表示走到节点$i$时候最大值。

  如果当前元素没有向前连边,那么答案就从上一节点走来,$f_i = f_{i-1} + a_i$

  如果当前元素有向前连边到$j$那么可以考虑从$j$过来在经过$j$,在走到$i$,再接下去走。

  这等价于$j->i$的路径被累加了$2$次,那么转移方程就是$f_i = f_{j-1}  + 2 \sum\limits_{k=j}^{i} a_k$

  然后那个$\sum$累加可以用前缀和优化掉,这样这个DP就是线性的了。

  复杂度$O(n)$

# include <bits/stdc++.h>
# define int long long
using namespace std;
const int N=3e5+;
int from[N],f[N],s[N],n;
inline int read()
{
int X=,w=; char c=;
while(c<''||c>'') {w|=c=='-';c=getchar();}
while(c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
return w?-X:X;
}
inline void write(int x)
{
if (x<) x=-x,putchar('-');
if (x>) write(x/);
putchar(x%+'');
}
signed main()
{
n=read();
for (int i=;i<=n;i++) {
int t=read();
if (t>i) continue;
from[i]=t;
}
for (int i=;i<=n;i++) {
int t=read();
s[i]=s[i-]+t;
}
for (int i=;i<=n;i++) {
f[i]=f[i-]+s[i]-s[i-];
if (from[i]!=) f[i]=max(f[from[i]-]+*(s[i]-s[from[i]-]),f[i]);
}
write(f[n]);putchar('\n');
return ;
}

rhapsody.cpp

Problem C 花之舞

给出一个字符串中,求该字符串中最大不重复双倍回文串覆盖。

对于100%的数据,$ len(s) \leq 10^3 $

Sol :  首先我们可以通过字符串Hash的做法判定一个串是不是回文串,这样只需要一遍$O(n)$的预处理,再$O(1)$判定即可。

然后我们可以$O(n^2)$枚举从$i$开始的所有双倍回文串,然后可以使用类似线段覆盖的DP做出最大不重复双倍回文串覆盖。

最终的复杂度是$O(n^2)$的。

# include<bits/stdc++.h>
# define int long long
using namespace std;
const int mo=1e9+;
const int base=;
const int N=1e3+;
int p[N],a[N],hash1[N],hash2[N],f[N];
int n;
vector<int>v[N];
inline int read()
{
int X=,w=; char c=;
while(c<''||c>'') {w|=c=='-';c=getchar();}
while(c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
return w?-X:X;
}
inline void write(int x)
{
if (x<) x=-x,putchar('-');
if (x>) write(x/);
putchar(x%+'');
}
int gethash(int num,int l,int r)
{
if (num==) return ((hash1[r]-hash1[l-]*p[r-l+]%mo)%mo+mo)%mo;
else return ((hash2[r]-hash2[l-]*p[r-l+]%mo)%mo+mo)%mo;
}
bool check(int l,int r)
{
if ((r-l+)&) {
int pos=(l+r)/,len=(r-l)/;
if (gethash(,pos,pos+len)==gethash(,n+-pos,n+-pos+len)) return ;
else return ;
} else {
int pos1=(l+r)/,pos2=pos1+,len=(r-l-)/;
if (gethash(,pos2,pos2+len)==gethash(,n+-pos1,n+-pos1+len)) return ;
else return ;
}
}
void fun(int pos)
{
for (int mid=(n+-pos)/;mid>=;mid--)
if (check(pos,pos+mid-)&&check(pos+mid,pos+*mid-)&&gethash(,pos,pos+mid-)==gethash(,pos+mid,pos+*mid-))
v[pos].push_back(pos+*mid-);
}
signed main()
{
// freopen("dance.in","r",stdin);
// freopen("dance.out","w",stdout);
n=read(); p[]=;
for (int i=;i<=n;i++)
a[i]=read(),p[i]=p[i-]*base%mo;
for (int i=;i<=n;i++)
hash1[i]=(hash1[i-]*base%mo+a[i])%mo;
int u=;
for (int i=n;i>=;i--) u++,hash2[u]=(hash2[u-]*base%mo+a[i])%mo;
for (int i=;i<=n;i++) fun(i);
for (int i=n;i>=;i--) {
f[i]=f[i+];
for (int j=;j<v[i].size();j++)
f[i]=max(f[i],f[v[i][j]+]+(v[i][j]-i+));
}
write(f[]); putchar('\n');
return ;
}

dance.cpp

HGOI 20190709 题解的更多相关文章

  1. HGOI 20181028 题解

    HGOI 20181028(复赛备考) /* 真是暴力的一天,最后一题MLE?由于数组开得太大了!!! 270滚粗 考场上好像智商高了很多?!(假的) */ sol:暴力求解,然后没有数据范围吐槽一下 ...

  2. HGOI 20190310 题解

    /* 又是又双叒叕WA的一天... 我太弱鸡了... 今天上午打了4道CF */ Problem 1 meaning 给出q组询问,求下列函数的值$ f(a) = \max\limits_{0 < ...

  3. HGOI 20190303 题解

    /* 记一串数字真难. 5435 今天比赛又是hjcAK的一天. 今天开题顺序是312,在搞T1之前搞了T3 昨天某谷月赛真是毒瘤. 但是讲评的同学不错,起码T4看懂了... 构造最优状态然后DP的思 ...

  4. HGOI 20180224 题解

    /* The Most Important Things: ljc chat with fyh on QQTa说期末考Ta数学74分感觉不好但是我觉得fyh是地表最强的鸭~~(of course en ...

  5. HGOI 20190218 题解

    /* 又是AK局... hjc又双叒叕AK了... Hmmm...我侥幸 */ Problem A card 给出无序序列a[]可以选择一个数插入到合适的位置作为一次操作,至少多少次操作后可以把序列变 ...

  6. HGOI 20190217 题解

    /* for me,开训第一天 /beacuse 文化课太差被抓去补文化课了... 看一眼题 : AK局? 但是,Wa on test #10 in problem C 290! (就差那么一咪咪) ...

  7. HGOI 20181103 题解

    problem:把一个可重集分成两个互异的不为空集合,两个集合里面的数相乘的gcd为1(将集合中所有元素的质因数没有交集) solution:显然本题并不是那么容易啊!考场上想了好久.. 其实转化为上 ...

  8. HGOI 20181101题解

    /* 又是爆0的一天(不知道今年高考难不难,反正今天(信息学)真的难!) */ solution:对于两个数相加,有一个显然的结论就是要么不进位(相对于位数大的),要么(进最多一位) 然后对于整个数组 ...

  9. HGOI 20191108 题解

    Problem A 新婚快乐 一条路,被$n$个红绿灯划分成$n+1$段,从前到后一次给出每一段的长度$l_i$,每走$1$的长度需要$1$分钟. 一开始所有红绿灯都是绿色的,$g$分钟后所有红绿灯变 ...

随机推荐

  1. JAVAEE 7 api.chm

    JAVAEE 7 api.chm 链接:https://pan.baidu.com/s/1LUD3oam5B-Hp8tdpfQYk2w 提取码:x1kc

  2. JavaScript刷新事件

    1, Location reload() 方法 2,

  3. [转载] Java注解

    目录 元注解 @Retention @Documented @Target @Inherited @Repeatable 注解语法 ---------------------------------- ...

  4. 富文本编辑器--使用textarea即时更新文本域同步编辑器内容

    使用 textarea wangEditor 从v3版本开始不支持 textarea ,但是可以通过onchange来实现 textarea 中提交富文本内容. <div id="di ...

  5. Nginx如何配置https证书?

    #把80端口请求跳转到443端口 server { listen 80; server_name 域名; return 301 https://$http_host$request_uri; } se ...

  6. LVS Director端服务启动脚本

    #!/bin/bash # 手动安装lpvs前端管理工具 # chkconfig: - # # lvs启动脚本:director # lvs模式类型:nat.dr.ipip # lvs代理协议:tcp ...

  7. 17、RAID和LVM

    一.RAID 1.什么是raid 磁盘阵列(Redundant Arrays of Independent Drives,RAID),有"独立磁盘构成的具有冗余能力的阵列"之意. ...

  8. tornado实现高并发爬虫

    from pyquery import PyQuery as pq from tornado import ioloop, gen, httpclient, queues from urllib.pa ...

  9. Python测开面试题之装饰器

    Python的装饰器是面试常被问到的问题之一,在面试Python测试开发时被问到的概率不低于70%,那么装饰器的原理是什么,怎么快速写出一个装饰器呢,接下来我们详细讲解装饰器的实现方法. Python ...

  10. nginx启动、停止、重启

    转自https://www.cnblogs.com/wangcp-2014/p/9922845.html 启动 启动代码格式:nginx安装目录地址 -c nginx配置文件地址 例如: [root@ ...