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. java中final 关键字的作用

    final 关键字的作用 java中的final关键字可以用来声明成员变量.本地变量.类.方法,并且经常和static一起使用声明常量. final关键字的含义: final在Java中是一个保留的关 ...

  2. PHP trait

    ps:由于PHP是单继承的,无法继承多个类所以可以用triat(关键字,特性)来命名达到子类继承多个父类的效果:暂且理解为类吧.class = trait <?php trait A { pub ...

  3. node请求下载接口时乱码

    先说下问题 之前做的一个项目,三端同时开发(PC.WEB.APP),由于架构方面的原因,服务均不对外开放,接口地址自然也就不对外暴露了,所有请求都要经过node转发,此为背景.... 网站有个扫描二维 ...

  4. Python内置函数(63)——property

    英文文档: class property(fget=None, fset=None, fdel=None, doc=None) Return a property attribute. fget is ...

  5. 基于python的统计公报关键数据爬取 update

    由于之前存在的难以辨别市本级,全市相关数据的原因,经过考虑采用 把含有关键词的字段全部提取进行人工辨别的方法 在其余部分不改变的情况下,更改test部分 def test(real_Title,rea ...

  6. 译《Time, Clocks, and the Ordering of Events in a Distributed System》

    Motivation <Time, Clocks, and the Ordering of Events in a Distributed System>大概是在分布式领域被引用的最多的一 ...

  7. C++中explicit关键字

    explicit: 防止隐式转换使用. 隐式转换:不同类型的变量可以互相转换,如将一个整形数值赋值给一个类,ClassXX  lei = 4: C++中, 一个参数的构造函数(或者除了第一个参数外其余 ...

  8. Python 生成随机验证码

    Python生成随机验证码  Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 1 2 3 4 5 6 7 8 9 fro ...

  9. python继承——封装

    python继承--封装 1 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度 2 封装分为两个层面 第一个层面的封装(什么都不用做):创建类和对象会分别创建二者的名称空 ...

  10. Struts(二十六):文件上传

    表单的准备 想要使用html表单上传一个或多个文件 1.须把html表单的enctype属性设置为multipart/form-data 2.须把html表单的method属性设置为post 3.须添 ...