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. Python内置函数(19)——oct

    英文文档: oct(x) Convert an integer number to an octal string. The result is a valid Python expression. ...

  2. emqtt 试用(八)ssl认证 - 代码验证

    参考链接:http://emqtt.com/clients#java http://docs.emqtt.cn/zh_CN/latest/config.html#mqtt-ssl-8883 一.单向认 ...

  3. YML(2)yml 语法

    YAML 语法 来源:yaml 这个页面提供一个正确的 YAML 语法的基本概述, 它被用来描述一个 playbooks(我们的配置管理语言). 我们使用 YAML 是因为它像 XML 或 JSON ...

  4. 200行Py代码带你实现"打飞机"

    前言 多年前,你我在一起"打飞机".为了实现真正的打飞机,在下一年前踏足帝都学习了无所不能的Python,辣么接下来带你在俩个小时用200行代码学会打飞机. python中提供了一 ...

  5. 项目管理器 ProjectManager Beta 10 发布

    本次更新内容: 可以设置主界面是否显示表格线 去除了开发日志界面的表格线,看起来好像好看一些 修复主界面时间显示的问题 自定义问候语 修复习惯统计记录时间显示错误的问题 修复创建项目时间错误问题 增加 ...

  6. hive:导出数据记录中null被替换为\n的解决方案

    在hive中,一般情况下通过 use my_hive_db; set hive.merge.mapfiles=true; set hive.merge.mapredfiles=true; ; ; in ...

  7. Oracle:如何使用PL/SQL 11.0连接远程Oracle12c服务器?

    背景: 如何实现远程连接服务器上的oracle12c? 1.安装一个oracle12c空库,使用oracle12c中集成的oracle pl/sql developer工具实现连接远程服务器上的ora ...

  8. html标记语言 --文本标记

    html标记语言 --文本标记 二.文本标记 1.h1-h6 标题标记,h1最大 2.font 字体设置标记 2.1 size字体大小.<font size="> 取值范围1-7 ...

  9. 定义一个方法get_page(url),url参数是需要获取网页内容的网址,返回网页的内容。提示(可以了解python的urllib模块)

    定义一个方法get_page(url),url参数是需要获取网页内容的网址,返回网页的内容.提示(可以了解python的urllib模块) import urllib.request def get_ ...

  10. [Linux]_ELVE_ssh登录远程阿里服务器

    0x00  背景 最近新开了一个服务器,每次都用网页操作太麻烦,索性就用软件登录(貌似界面还有vim支持的也比网页的好),在网上寻找半天,找到一个软件,感觉特别好, 名叫:mobaxterm,好像是免 ...