T1.回文树裸题。

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

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=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}return x*f;
} int n,k;
int from[202][MAXN+5];
ll f[MAXN+5];
ll s[MAXN+5];
ll g[2][MAXN+5];
int q[MAXN+5];
int top=0,tail=1;ll get(int pre,int x,int t)
{while(top-tail>=1&&(g[pre][q[tail]]-g[pre][q[tail+1]])<s[x]*(s[q[tail+1]]-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>=1){int i=q[top-1],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=1;i<=n;i++){s[i]=read();s[i]+=s[i-1];    }int pre=0,nown=1;for(int i=1;i<=n;i++) g[pre][i]=-(s[i]*s[i]);for(int l=2;l<=k+1;l++){memset(f,0,sizeof(f));top=0;tail=1;memset(g[nown],0,sizeof(g[nown]));ins(pre,l-1);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-1])ins(pre,i);//printf("%d %d %d %I64d\n",l,i,from[l][i],f[i]);
        }    nown=1-nown;pre=1-pre;}printf("%lld\n",f[n]);return 0;
}

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=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}return x*f;
} ll ans=0;
int n,cnt=0;
ll f[MAXN+5],f2[MAXN+5];
int mx[MAXN+5],mx2[MAXN+5],from[MAXN+5],from2[MAXN+5];
int fa[MAXN+5],head[MAXN+5],p[MAXN+5];struct edge{int to,next,w;
}e[MAXN*2+5];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]<0) f[x]=0;//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=1;i<n;i++){int u=read(),v=read(),w=read();ins(u,v,w);ins(v,u,w);    }for(int i=1;i<=n;i++) mx[i]=mx2[i]=-INF;dfs(1,0,0);solve(1);cout<<ans;return 0;
}

转载于:https://www.cnblogs.com/FallDream/p/apio2014.html

[APIO2014]相关推荐

  1. 【APIO2014】Palindromes

    #103. [APIO2014]Palindromes 统计 描述 提交 自定义测试 给你一个由小写拉丁字母组成的字符串 ss.我们定义 ss 的一个子串的存在值为这个子串在 ss 中出现的次数乘以这 ...

  2. BZOJ3675: [Apio2014]序列分割

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

  3. 【BZOJ3677】[Apio2014]连珠线 换根DP

    [BZOJ3677][Apio2014]连珠线 Description 在列奥纳多·达·芬奇时期,有一个流行的童年游戏,叫做"连珠线".不出所料,玩这个游戏只需要珠子和线,珠子从1 ...

  4. [BZOJ3676][Apio2014]回文串

    [BZOJ3676][Apio2014]回文串 试题描述 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的"出现值"为t在s中的出现次数乘以t的长度.请你求出s的所有 ...

  5. 洛谷P3647 [APIO2014] 连珠线 题解

    洛谷P3647 [APIO2014] 连珠线 题解 题目链接:P3647 [APIO2014] 连珠线 题意: 在达芬奇时代,有一个流行的儿童游戏称为连珠线.当然,这个游戏是关于珠子和线的.线是红色或 ...

  6. APIO2014 Beads ans wires[树形DP]

    [APIO2014] Beads and wires Question: 有一个点,可以通过两种方式添加节点 Append(w,v)Append(w,v)Append(w, v):一个新的珠子 www ...

  7. 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)

    点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...

  8. 【回文自动机】bzoj3676 [Apio2014]回文串

    回文自动机讲解!http://blog.csdn.net/u013368721/article/details/42100363 pam上每个点代表本质不同的回文子串.len(i)代表长度,cnt(i ...

  9. [bzoj3676] [APIO2014]回文串

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

  10. 2018.12.15 bzoj3676: [Apio2014]回文串(后缀自动机)

    传送门 对原串建立一个后缀自动机,然后用反串在上面匹配. 如果当前匹配的区间[l,r][l,r][l,r]包裹了当前状态的endposendposendpos中的最大值,那么[l,maxpos][l, ...

最新文章

  1. 内部错误:无法加载 ABAP 报表 LVBRKF0I
  2. 基于容器原理(docker、lxc、cells)的Android 双系统设计概要
  3. 39 | 案例篇:怎么缓解 DDoS 攻击带来的性能下降问题?
  4. HDU 3966-Aragorn's Story 树链剖分+树状数组
  5. Quartz 的SB问题 GetNextValidTimeAfter 输出和输出 时区 不同步,好傻的方法?
  6. LeetCode 783二叉搜索树节点最小距离-简单
  7. Servlet之Tomcat配置与启动(一)
  8. 【转载】Linux free 查询可用内存和判断是否有内存泄漏
  9. 鞍山楷邦计算机学院,计算机专业和平面设计专业是一个专业不?
  10. 正则判断手机号地区_国内外手机号码正则表达式汇总
  11. 2017界面UI设计风格流行什么?(一)
  12. opencv图像处理进阶——灰度直方图
  13. 网友眼中的杭州IT公司排名
  14. java安卓模拟器和电脑通信_android模拟器与PC的端口映射
  15. mysql 5.6 插入表情符
  16. postgresql获取基于当前时间计算的当月第一天,最后一天,下个月的第n天等功能
  17. 网易区块链打造可信数字身份认证应用新场景,赋能科技峰会
  18. win7计算机怎么优化驱动器,win7如何优化加速的12条技巧
  19. 求华摄氏度100‘F对应下的摄氏温度
  20. csdn 请选择文章类型 解决办法

热门文章

  1. 微信小程序事件绑定无效
  2. MaxCompute/DataWorks权限问题排查建议
  3. ubuntu wine 使用
  4. 【AtCoder010】A - Addition(奇偶)
  5. 桌面支持--dcc打印机设置注意
  6. 电脑对眼睛的伤害,护眼的七大误区
  7. WinForm 分屏 [ WinForm | Panel | 视频监控分屏 ]
  8. 【笔记】mac os命令行编译objective-c
  9. [Code] 收集各种语言对图片的处理算法实现 图片模糊
  10. Python ‘,=‘ 语句的使用