[APIO2014]
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]相关推荐
- 【APIO2014】Palindromes
#103. [APIO2014]Palindromes 统计 描述 提交 自定义测试 给你一个由小写拉丁字母组成的字符串 ss.我们定义 ss 的一个子串的存在值为这个子串在 ss 中出现的次数乘以这 ...
- BZOJ3675: [Apio2014]序列分割
BZOJ3675: [Apio2014]序列分割 Description 小H最近迷上了一个分隔序列的游戏. 在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列. 为了得到k ...
- 【BZOJ3677】[Apio2014]连珠线 换根DP
[BZOJ3677][Apio2014]连珠线 Description 在列奥纳多·达·芬奇时期,有一个流行的童年游戏,叫做"连珠线".不出所料,玩这个游戏只需要珠子和线,珠子从1 ...
- [BZOJ3676][Apio2014]回文串
[BZOJ3676][Apio2014]回文串 试题描述 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的"出现值"为t在s中的出现次数乘以t的长度.请你求出s的所有 ...
- 洛谷P3647 [APIO2014] 连珠线 题解
洛谷P3647 [APIO2014] 连珠线 题解 题目链接:P3647 [APIO2014] 连珠线 题意: 在达芬奇时代,有一个流行的儿童游戏称为连珠线.当然,这个游戏是关于珠子和线的.线是红色或 ...
- APIO2014 Beads ans wires[树形DP]
[APIO2014] Beads and wires Question: 有一个点,可以通过两种方式添加节点 Append(w,v)Append(w,v)Append(w, v):一个新的珠子 www ...
- 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)
点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...
- 【回文自动机】bzoj3676 [Apio2014]回文串
回文自动机讲解!http://blog.csdn.net/u013368721/article/details/42100363 pam上每个点代表本质不同的回文子串.len(i)代表长度,cnt(i ...
- [bzoj3676] [APIO2014]回文串
Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的"出 现值"为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. In ...
- 2018.12.15 bzoj3676: [Apio2014]回文串(后缀自动机)
传送门 对原串建立一个后缀自动机,然后用反串在上面匹配. 如果当前匹配的区间[l,r][l,r][l,r]包裹了当前状态的endposendposendpos中的最大值,那么[l,maxpos][l, ...
最新文章
- 内部错误:无法加载 ABAP 报表 LVBRKF0I
- 基于容器原理(docker、lxc、cells)的Android 双系统设计概要
- 39 | 案例篇:怎么缓解 DDoS 攻击带来的性能下降问题?
- HDU 3966-Aragorn's Story 树链剖分+树状数组
- Quartz 的SB问题 GetNextValidTimeAfter 输出和输出 时区 不同步,好傻的方法?
- LeetCode 783二叉搜索树节点最小距离-简单
- Servlet之Tomcat配置与启动(一)
- 【转载】Linux free 查询可用内存和判断是否有内存泄漏
- 鞍山楷邦计算机学院,计算机专业和平面设计专业是一个专业不?
- 正则判断手机号地区_国内外手机号码正则表达式汇总
- 2017界面UI设计风格流行什么?(一)
- opencv图像处理进阶——灰度直方图
- 网友眼中的杭州IT公司排名
- java安卓模拟器和电脑通信_android模拟器与PC的端口映射
- mysql 5.6 插入表情符
- postgresql获取基于当前时间计算的当月第一天,最后一天,下个月的第n天等功能
- 网易区块链打造可信数字身份认证应用新场景,赋能科技峰会
- win7计算机怎么优化驱动器,win7如何优化加速的12条技巧
- 求华摄氏度100‘F对应下的摄氏温度
- csdn 请选择文章类型 解决办法
热门文章
- 微信小程序事件绑定无效
- MaxCompute/DataWorks权限问题排查建议
- ubuntu wine 使用
- 【AtCoder010】A - Addition(奇偶)
- 桌面支持--dcc打印机设置注意
- 电脑对眼睛的伤害,护眼的七大误区
- WinForm 分屏 [ WinForm | Panel | 视频监控分屏 ]
- 【笔记】mac os命令行编译objective-c
- [Code] 收集各种语言对图片的处理算法实现 图片模糊
- Python ‘,=‘ 语句的使用