HGOI 20190709 题解
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 题解的更多相关文章
- HGOI 20181028 题解
HGOI 20181028(复赛备考) /* 真是暴力的一天,最后一题MLE?由于数组开得太大了!!! 270滚粗 考场上好像智商高了很多?!(假的) */ sol:暴力求解,然后没有数据范围吐槽一下 ...
- HGOI 20190310 题解
/* 又是又双叒叕WA的一天... 我太弱鸡了... 今天上午打了4道CF */ Problem 1 meaning 给出q组询问,求下列函数的值$ f(a) = \max\limits_{0 < ...
- HGOI 20190303 题解
/* 记一串数字真难. 5435 今天比赛又是hjcAK的一天. 今天开题顺序是312,在搞T1之前搞了T3 昨天某谷月赛真是毒瘤. 但是讲评的同学不错,起码T4看懂了... 构造最优状态然后DP的思 ...
- HGOI 20180224 题解
/* The Most Important Things: ljc chat with fyh on QQTa说期末考Ta数学74分感觉不好但是我觉得fyh是地表最强的鸭~~(of course en ...
- HGOI 20190218 题解
/* 又是AK局... hjc又双叒叕AK了... Hmmm...我侥幸 */ Problem A card 给出无序序列a[]可以选择一个数插入到合适的位置作为一次操作,至少多少次操作后可以把序列变 ...
- HGOI 20190217 题解
/* for me,开训第一天 /beacuse 文化课太差被抓去补文化课了... 看一眼题 : AK局? 但是,Wa on test #10 in problem C 290! (就差那么一咪咪) ...
- HGOI 20181103 题解
problem:把一个可重集分成两个互异的不为空集合,两个集合里面的数相乘的gcd为1(将集合中所有元素的质因数没有交集) solution:显然本题并不是那么容易啊!考场上想了好久.. 其实转化为上 ...
- HGOI 20181101题解
/* 又是爆0的一天(不知道今年高考难不难,反正今天(信息学)真的难!) */ solution:对于两个数相加,有一个显然的结论就是要么不进位(相对于位数大的),要么(进最多一位) 然后对于整个数组 ...
- HGOI 20191108 题解
Problem A 新婚快乐 一条路,被$n$个红绿灯划分成$n+1$段,从前到后一次给出每一段的长度$l_i$,每走$1$的长度需要$1$分钟. 一开始所有红绿灯都是绿色的,$g$分钟后所有红绿灯变 ...
随机推荐
- python-1:正则表达式(基础知识点)
1.简单匹配: \d →匹配一个数字 \w →匹配一个数字或字母 \s →匹配一个空格(包括tab等空白符) . →匹配任意字符 * →匹配任意个字符(包括0个) + →匹配至少一个字 ...
- JAVA重载和数组
Java 重载:相同的方法名,但参数个数或者类型不一样的情况下,自动执行不同的方法 数组: int[] array=new int[5]; System.out.println(array); ...
- TCP socket 编程
TCP socket 编程 讲一下 socket 编程 步骤 使用 socket 模块 建立 TCP socket 客户端和服务端 客户端和服务端之间的通信 图解 编程 举个例子 tcp_server ...
- Flask与微信小程序登录(后端)
开发微信小程序时,接入小程序的授权登录可以快速实现用户注册登录的步骤,是快速建立用户体系的重要一步.这篇文章将介绍 python + flask + 微信小程序实现用户快速注册登录方案(本文主要进行后 ...
- Django框架——基础之模型系统(ORM相关操作)
------------恢复内容开始------------ 1.必定会的十三条! 1.1记忆方法一:(按字母顺序记忆) <1> all(): 查询所有结果 <2> cou ...
- ZeroMQ 三种模式python3实现
ZeroMQ是一个消息队列网络库,实现网络常用技术封装.在C/S中实现了三种模式,这段时间用python简单实现了一下,感觉python虽然灵活.但是数据处理不如C++自由灵活. Request-Re ...
- Notepad++ 文件丢失了,找回历史文件方法
一开始我还以为文件丢失找不到了,心凉了半截,后来找到了它的备份路径 C:\Users\Administrator\AppData\Roaming\Notepad++\backup
- 渗透神器CobaltStrike 3.1.2 去后门破解版 & Windows版TeamServer【转】
转自我八师傅博客 CS简介 Cobalt Strike(简称CS)是全球黑客公认一款非常优秀的渗透测试神器,以metasploit为基础的GUI的框架式渗透工具,集成了传统远控功能(远程桌面VNC.键 ...
- jq无限极树结构
//群组树结构$(function () { var params= { "companyId":cmpId }; var loadUrl="/apiv2/classif ...
- 从FBV到CBV二(认证器)
span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }.CodeMirror ...