T1.回文树裸题。

#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';}
return x*f;
} int cnt=;
int f[],l[],p[];
int c[][];
char s[]; int main()
{
freopen("palindrome.in","r",stdin);
freopen("palindrome.out","w",stdout);
scanf("%s",s+);
f[]=;l[++cnt]=-;
for(int i=,j=;s[i];++i)
{
while(s[i]!=s[i-l[j]-]) j=f[j];
if(!c[j][s[i]-'a'])
{
l[++cnt]=l[j]+;
int k=f[j];
while(s[i]!=s[i-l[k]-])
k=f[k];
f[cnt]=c[k][s[i]-'a'];
c[j][s[i]-'a']=cnt;
}
j=c[j][s[i]-'a'];
++p[j];
}
ll ans=;
for(int i=cnt;i>;i--)
{
ans=max(ans,1ll*p[i]*l[i]);
p[f[i]]+=p[i];
}
cout<<ans;
return ;
}

T2.斜率优化

f[i]=max(f[j]+s[j]*(s[i]-s[j]))

令g[i]=f[i]-s[i]^2

j比k优 那么g[j]+s[i]s[j]>g[k]+s[i][k]

g[j]-g[k]>s[i](s[k]-s[j])

g[j]-g[k]/(s[j]-s[k])<-s[i]

所以维护队列上凸即可

#include<iostream>
#include<cstdio>
#include<queue>
#define MAXN 100000
#include<cstring>
#define ll long long
using namespace std;
int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-''; ch=getchar();}
return x*f;
} int n,k;
int from[][MAXN+];
ll f[MAXN+];
ll s[MAXN+];
ll g[][MAXN+];
int q[MAXN+];
int top=,tail=; ll get(int pre,int x,int t)
{
while(top-tail>=&&(g[pre][q[tail]]-g[pre][q[tail+]])<s[x]*(s[q[tail+]]-s[q[tail]]))
++tail;
from[t][x]=q[tail];
return g[pre][q[tail]]+s[q[tail]]*s[x];
}; void ins(int t,int k)
{
while(top-tail>=)
{
int i=q[top-],j=q[top];
if((g[t][k]-g[t][j])*(s[i]-s[j])<(g[t][j]-g[t][i])*(s[j]-s[k])) top--;
else break;
}
q[++top]=k;
} int main()
{
//freopen("sequence.in","r",stdin);
//freopen("sequence.out","w",stdout);
n=read();k=read();
for(int i=;i<=n;i++)
{
s[i]=read();s[i]+=s[i-];
}
int pre=,nown=;
for(int i=;i<=n;i++) g[pre][i]=-(s[i]*s[i]);
for(int l=;l<=k+;l++)
{
memset(f,,sizeof(f));top=;tail=;
memset(g[nown],,sizeof(g[nown]));
ins(pre,l-);
for(int i=l;i<=n;i++)
{
f[i]=get(pre,i,l);
g[nown][i]=f[i]-(s[i]*s[i]);
if(s[i]!=s[i-])ins(pre,i);
//printf("%d %d %d %I64d\n",l,i,from[l][i],f[i]);
}
nown=-nown;
pre=-pre;
}
printf("%lld\n",f[n]);
return ;
}

T3.

树形dp,把根节点作为第一个存在的点,那么每一段蓝线总是 爷爷-爸爸-点  的形式。

所以用f1表示一个点作为中间的点的最大值,f2表示一个点不是中间点的最大答案。

树形dp之后O(1)换根

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define MAXN 200000
#define INF 2000000000
using namespace std;
int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-''; ch=getchar();}
return x*f;
} ll ans=;
int n,cnt=;
ll f[MAXN+],f2[MAXN+];
int mx[MAXN+],mx2[MAXN+],from[MAXN+],from2[MAXN+];
int fa[MAXN+],head[MAXN+],p[MAXN+]; struct edge{
int to,next,w;
}e[MAXN*+]; void ins(int f,int t,int w)
{
e[++cnt].next=head[f];
head[f]=cnt;
e[cnt].to=t;
e[cnt].w=w;
} void renew(int x,int t,int f)
{
//cout<<"ins"<<x<<" "<<t<<" "<<f<<endl;
if(t>mx[x])
{
from2[x]=from[x];
mx2[x]=mx[x];
mx[x]=t;
from[x]=f;
}
else if(t>mx2[x])
{
mx2[x]=t;
from2[x]=f;
}
} void dfs(int x,int pre,int father)
{
fa[x]=father;
for(int i=head[x];i;i=e[i].next)
{
int v=e[i].to;
if(v!=fa[x])
{
dfs(v,e[i].w,x);f2[x]+=max(f[v],f2[v]);
renew(x,e[i].w+f2[v]-max(f[v],f2[v]),v);
}
}
f[x]=f2[x]+mx[x]+pre;
if(f[x]<) f[x]=;
//cout<<x<<" "<<f[x]<<" "<<f2[x]<<endl;
} void solve(int x)
{
if(fa[x])
{
int v=fa[x];f2[x]+=max(f[v],f2[v]);
renew(x,p[x]+f2[v]-max(f[v],f2[v]),v);
}
ans=max(ans,f2[x]);f[x]=f2[x]+mx[x];
//cout<<"solve"<<x<<" "<<f2[x]<<" "<<f[x]<<endl;
for(int i=head[x];i;i=e[i].next)
{
int v=e[i].to;
if(v!=fa[x])
{
ll t2=max(f[v],f2[v]);
f[x]+=e[i].w-t2;
if(from[x]==v) f[x]=f[x]-mx[x]+mx2[x];
f2[x]-=t2;p[v]=e[i].w;
solve(v);
f2[x]+=t2;
f[x]=f2[x]+mx[x];
}
}
} int main()
{
freopen("beads.in","r",stdin);
freopen("beads.out","w",stdout);
n=read();
for(int i=;i<n;i++)
{
int u=read(),v=read(),w=read();
ins(u,v,w);ins(v,u,w);
}
for(int i=;i<=n;i++) mx[i]=mx2[i]=-INF;
dfs(,,);
solve();
cout<<ans;
return ;
}

[APIO2014]的更多相关文章

  1. BZOJ 3676: [Apio2014]回文串

    3676: [Apio2014]回文串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2013  Solved: 863[Submit][Status ...

  2. 【BZOJ】【3676】【APIO2014】回文串

    回文自动机/Manacher+SA 这道题可以用Manacher找出本质不同的回文串(令max增大的所有回文串),然后再用SA跑出来有多少相同. 还有一种做法就是回文自动机(Orz Hzwer)的裸题 ...

  3. 【斜率DP】BZOJ 3675:[Apio2014]序列分割

    3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1066  Solved: 427[Submit][Statu ...

  4. bzoj 3676: [Apio2014]回文串 回文自动机

    3676: [Apio2014]回文串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 844  Solved: 331[Submit][Status] ...

  5. 字符串(马拉车算法,后缀数组,稀疏表):BZOJ 3676 [Apio2014]回文串

    Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. Input 输入只有一行 ...

  6. BZOJ 3675: [Apio2014]序列分割( dp + 斜率优化 )

    WA了一版... 切点确定的话, 顺序是不会影响结果的..所以可以dp dp(i, k) = max(dp(j, k-1) + (sumn - sumi) * (sumi - sumj)) 然后斜率优 ...

  7. bzoj3675[Apio2014]序列分割 斜率优化dp

    3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 3508  Solved: 1402[Submit][Stat ...

  8. BZOJ_3675_[Apio2014]序列分割_斜率优化

    BZOJ_3675_[Apio2014]序列分割_斜率优化 Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了 ...

  9. 斜率优化入门学习+总结 Apio2011特别行动队&Apio2014序列分割&HZOI2008玩具装箱&ZJOI2007仓库建设&小P的牧场&防御准备&Sdoi2016征途

    斜率优化: 额...这是篇7个题的题解... 首先说说斜率优化是个啥,额... f[i]=min(f[j]+xxxx(i,j)) ;   1<=j<i (O(n^2)暴力)这样一个式子,首 ...

  10. [模板] 回文树/回文自动机 && BZOJ3676:[Apio2014]回文串

    回文树/回文自动机 放链接: 回文树或者回文自动机,及相关例题 - F.W.Nietzsche - 博客园 状态数的线性证明 并没有看懂上面的证明,所以自己脑补了一个... 引理: 每一个回文串都是字 ...

随机推荐

  1. HNOI 2012 永无乡

    codevs 1477 永无乡 http://codevs.cn/problem/1477/ 2012年湖南湖北省队选拔赛  时间限制: 1 s  空间限制: 128000 KB   题目描述 Des ...

  2. L2 约束的最小二乘学习法

    \[ \begin{align*} &J_{LS}{(\theta)} = \frac { 1 }{ 2 } { \left\| \Phi \theta - y \right\| }^{ 2 ...

  3. JavaScript简写技巧总结

    在日常工作中,JavaScript一些常用的简写技巧,将直接影响到我们的开发效率,现将常用技巧整理如下: 1. 空(null, undefined)验证     当我们创建了一个新的变量,我们通常会去 ...

  4. javascript抛物投栏(抛物线实践)

    平面内,到定点与定直线的距离相等的点的轨迹叫做抛物线.水平抛物线就是水平匀速,垂直加速的运动. 抛物线的性质:面内与一个定点F和一条定直线l 的距离相等的点的轨迹叫做抛物线. 定点F叫做抛物线的焦点. ...

  5. 使用IDEA快速插入数据库数据的方法

    如上图所示:数据库创建表主键使用了自增列自增因此忽略,只有后两列非主键得数据,在数据较多得时候使用IDEA快捷键Ctrl+R键,快速查找替换.

  6. C语言头文件引用

    1,引用分为两种 firs:include<fileName.h> 引用系统头文件一般用<>. second:include"fileName.h" 引用自 ...

  7. Linq 巧用 Max,Sum

    IList<, , , , , }; var sum1 = intList.Sum(s => { == ) { return s; } ; }); Console.WriteLine(&q ...

  8. linux下的Shell编程(5)循环

    Shell Script中的循环有下面几种格式: while [ cond1 ] && { || } [ cond2 ] -; do - done for var in -; do - ...

  9. docker注意事项

      当你最后投入容器的怀抱,发现它能解决很多问题,而且还具有众多的优点: 第一:它是不可变的 – 操作系统,库版本,配置,文件夹和应用都是一样的.您可以使用通过相同QA测试的镜像,使产品具有相同的表现 ...

  10. Android开发——发布第三方库到JitPack上

    前言: 看到大神们的写的第三方控件,比较好用,我们使用的时候直接是在gradle上加上代码就可以使用了,现在到我们写了一个第三方控件,想要别人使用的时候也是直接在gradle加上相关的代码就可以用了, ...