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. python函数 -- 作用域,异常处理

    1.def语句和参数 python定义函数的关键词为def,格式如下: def 函数名([变元],[变元],....)          #保存在变元中的值,在函数返回后该变元就会被销毁了. 2.返回 ...

  2. .Net Core 3.0使用Grpc进行远程过程调用

    因为.Net Core3.0已经把Grpc作为一等臣民了,作为爱好新技术的我,当然要尝鲜体验一下了,当然感觉是Grpc作为跨语言的产品做的相当好喽,比起Dubbo这种的,优势和劣势还是比较明显的. 我 ...

  3. [BZOJ4180] 字符串计数

    膜一发KsCla巨佬 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5 ...

  4. java各种jar的下载地址和源码下载地址

    1.jboss http://jbossmarshalling.jboss.org/downloads2.netty https://netty.io/downloads.html3.spring h ...

  5. EBS描述性弹性域及键弹性域总结

    一.描述性弹性域 前言介绍: 描述性弹性域的实质就是系统预留自定字段,系统可以使用说明性弹性域来获取业务所特有的重要附加信息.系统可能自定义说明性弹性域,以显示存储更多信息的字段,提供一套完整的“自定 ...

  6. C数据结构排序算法——希尔排序法用法总结(转http://www.cnblogs.com/skywang12345/p/3597597.html)

    希尔排序介绍 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它 ...

  7. js制作留言板

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 103、Swarm如何管理存储数据?(Swarm10)

    参考https://www.cnblogs.com/CloudMan6/p/8000906.html   Service 的容器副本会 scale up/down ,会 failover,会在不同的主 ...

  9. b/s和c/s

    一.B/S结构 B是英文单词“Browser”的首字母,即浏览器的意思:S是英文单词“Server”的首字母,即服务器的意思.B/S就是“Browser/Server”的缩写,即“浏览器/服务器”模式 ...

  10. 设置Linux之CentOS7的网络的两种方式动态IP+静态IP

    1 动态IP 参考之前的文章 点击进入 2 静态IP vi /etc/sysconfig/network-scripts/ifcfg-ens33 详情配置如下,上面半部分是我之前的动态IP的设置 静态 ...