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+10;
int s1[N],s2[N];int n;
inline int read()
{int X=0,w=0; char c=0;while(c<'0'||c>'9') {w|=c=='-';c=getchar();}while(c>='0'&&c<='9') X=(X<<3)+(X<<1)+(c^48),c=getchar();return w?-X:X;
}
inline void write(int x)
{if (x<0) x=-x,putchar('-'); if (x>9) write(x/10);putchar(x%10+'0');
}
signed main()
{n=read();for (int i=1;i<=n;i++) {int t=read(); s1[i]=s1[i-1]+t;s2[i]=s2[i-1]+t*t;}double ans=-1e9; int ansl=0,ansr=0;for (int l=1;l<=n;l++)for (int r=l;r<=n;r++) {double t=-(double)(s1[r]-s1[l-1])*(s1[r]-s1[l-1])/(double)(r-l+1)/(double)(r-l+1);double w=(double)(s2[r]-s2[l-1])/(double)(r-l+1); if (t+w>ans) { ans=t+w; ansl=l; ansr=r;}}write(ansl);putchar(' ');write(ansr); putchar('\n');return 0;
}

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+10;
int from[N],f[N],s[N],n;
inline int read()
{int X=0,w=0; char c=0;while(c<'0'||c>'9') {w|=c=='-';c=getchar();}while(c>='0'&&c<='9') X=(X<<3)+(X<<1)+(c^48),c=getchar();return w?-X:X;
}
inline void write(int x)
{if (x<0) x=-x,putchar('-'); if (x>9) write(x/10);putchar(x%10+'0');
}
signed main()
{n=read();for (int i=1;i<=n;i++) {int t=read();if (t>i) continue;from[i]=t;}for (int i=1;i<=n;i++) {int t=read();s[i]=s[i-1]+t;}for (int i=1;i<=n;i++) {f[i]=f[i-1]+s[i]-s[i-1];if (from[i]!=0) f[i]=max(f[from[i]-1]+2*(s[i]-s[from[i]-1]),f[i]);}write(f[n]);putchar('\n'); return 0;
}

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+7;
const int base=131;
const int N=1e3+10;
int p[N],a[N],hash1[N],hash2[N],f[N];
int n;
vector<int>v[N];
inline int read()
{int X=0,w=0; char c=0;while(c<'0'||c>'9') {w|=c=='-';c=getchar();}while(c>='0'&&c<='9') X=(X<<3)+(X<<1)+(c^48),c=getchar();return w?-X:X;
}
inline void write(int x)
{if (x<0) x=-x,putchar('-'); if (x>9) write(x/10);putchar(x%10+'0');
}
int gethash(int num,int l,int r)
{if (num==1) return ((hash1[r]-hash1[l-1]*p[r-l+1]%mo)%mo+mo)%mo;else return ((hash2[r]-hash2[l-1]*p[r-l+1]%mo)%mo+mo)%mo;
}
bool check(int l,int r)
{if ((r-l+1)&1) {int pos=(l+r)/2,len=(r-l)/2;        if (gethash(1,pos,pos+len)==gethash(2,n+1-pos,n+1-pos+len)) return 1;else return 0;} else {int pos1=(l+r)/2,pos2=pos1+1,len=(r-l-1)/2;if (gethash(1,pos2,pos2+len)==gethash(2,n+1-pos1,n+1-pos1+len)) return 1;else return 0;}
}
void fun(int pos)
{for (int mid=(n+1-pos)/2;mid>=1;mid--) if (check(pos,pos+mid-1)&&check(pos+mid,pos+2*mid-1)&&gethash(1,pos,pos+mid-1)==gethash(1,pos+mid,pos+2*mid-1)) v[pos].push_back(pos+2*mid-1);
}
signed main()
{
//    freopen("dance.in","r",stdin);
//    freopen("dance.out","w",stdout);n=read(); p[0]=1;for (int i=1;i<=n;i++) a[i]=read(),p[i]=p[i-1]*base%mo;    for (int i=1;i<=n;i++) hash1[i]=(hash1[i-1]*base%mo+a[i])%mo;int u=0;    for (int i=n;i>=1;i--) u++,hash2[u]=(hash2[u-1]*base%mo+a[i])%mo;for (int i=1;i<=n;i++) fun(i); for (int i=n;i>=1;i--) {f[i]=f[i+1];for (int j=0;j<v[i].size();j++)f[i]=max(f[i],f[v[i][j]+1]+(v[i][j]-i+1));}write(f[1]); putchar('\n');return 0;
} 

dance.cpp

转载于:https://www.cnblogs.com/ljc20020730/p/11156950.html

HGOI 20190709 题解相关推荐

  1. HGOI 20181103 题解

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

  2. HGOI 20190711 题解

    Problem A 矩阵第K小数 给定一个$n \times m$的矩阵,位置$A_{i,j}  = i\times j$, 给出$Q$个询问,每一次查询矩阵中第$Q_i$小的数是多少. 对于100% ...

  3. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  4. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  5. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  6. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

  7. [JS] 题解:提取不重复的整数

    题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...

  8. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  9. [洛谷1383]高级打字机 题解

    题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...

最新文章

  1. 服务端的第五次课程:安全,认证,授权
  2. sql 查询每月的销售金额
  3. Yii 2.0高级版 下拉框预设值、默认值
  4. java如何处理tcp异常断开_(转)TCP连接异常断开检测
  5. Ansible Synopsis
  6. 【Vegas原创】ProC环境搭建
  7. 卡诺模型案例分析_质量管理神器,Kano模型您可知道?
  8. [转载] MLDN魔乐科技李兴华主讲Oracle——02 Oracle安装
  9. python中try怎么用_python中的try的用法,try 的用法?,英文try的用法
  10. STM32F407VG晶振与主频配置
  11. Android UI自动化工具-SoloPi
  12. 【机器学习】正样本和负样本
  13. 【光耦 Normalized...和 CTR 测试条件及测试曲线 解读 : PC817和LTV-1007-TP1-G】
  14. 用微信怎么定位别人手机位置
  15. 001 Figuring in C/C++
  16. 拥有它,XML文件少一半
  17. ats2851 / cm591 ugreen bluetooth 5.3 for Linux
  18. 【数据结构】测试3 栈和队列
  19. 融云 IM 在 Electron 平台上的设计实践
  20. wps共享文件怎么多人编辑?

热门文章

  1. 一个简单实用的,基于EF的三层架构
  2. List和ObservableCollection的相互转化
  3. 老齐学python的django 源代码_《跟老齐学Python:Django实战》真正的手把手“带”您学习...
  4. 计算机窗口还原,win8系统找回计算机窗口“回收站”的还原办法
  5. stc15w404as引脚图_STC15F2K6S2与stc15w404AS的spi通讯
  6. 计算机在档案管理中的应用,浅谈计算机在档案管理中的应用
  7. rpm方式安装mysql5.7.24_linux centOS 7安装mysql 5.7.24
  8. mysql err 1349_MySQL 视图 第1349号错误解决方法
  9. 分屏如何保持运行状态_摊铺机熨平板如何保持稳定的工作状态?
  10. Iar环境c语言调用汇编函数,如何在IAR EWARM中通过内联汇编程序在另一个模块中调用C函数?...