【JZOJ6287】扭动的树
description
analysis
区间DPDPDP,首先按照键值排个序,这样保证树的中序遍历就为原序列
设f[0][i][j]f[0][i][j]f[0][i][j]表示[i..j][i..j][i..j]区间作为[unknown..i−1][unknown..i-1][unknown..i−1]的右儿子的最大和,f[1][i][j]f[1][i][j]f[1][i][j]就是[i..j][i..j][i..j]区间作为[j+1..unknown][j+1..unknown][j+1..unknown]的左儿子
预处理fff的初值是很明显的,然后O(n2log)O(n^2log)O(n2log)预处理出两两数之间的gcd\gcdgcd
对于一段区间[i..j][i..j][i..j],枚举中转点kkk,表示[i..k−1],[k+1,j][i..k-1],[k+1,j][i..k−1],[k+1,j]分别作为kkk的左右儿子
k=ik=ik=i或k=jk=jk=j特殊转移,i<k<ji<k<ji<k<j可知[i..j][i..j][i..j]可由f[1][i][k−1],f[0][k+1][j]f[1][i][k-1],f[0][k+1][j]f[1][i][k−1],f[0][k+1][j]转移得到
具体转移到000或111取决于a[k]a[k]a[k]与a[i−1],a[j+1]a[i-1],a[j+1]a[i−1],a[j+1]是否符合条件(gcd>1\gcd>1gcd>1)
code
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#define MAXN 305
#define INF 1000000007
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)using namespace std;ll f[2][MAXN][MAXN];
ll g[MAXN][MAXN];
ll sum[MAXN];
ll n,ans=-INF;struct node
{ll x,y;
}a[MAXN];inline ll read()
{ll x=0,f=1;char ch=getchar();while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;
}
inline ll max(ll x,ll y){return x>y?x:y;}
inline bool cmp(node a,node b){return a.x<b.x;}
inline ll get(ll x,ll y){return sum[y]-sum[x-1];}
inline ll gcd(ll x,ll y){return x%y==0?y:gcd(y,x%y);}
int main()
{freopen("T2.in","r",stdin);//freopen("tree.in","r",stdin);//freopen("tree.out","w",stdout);n=read();fo(i,0,n)fo(j,0,n)f[0][i][j]=f[1][i][j]=-INF;fo(i,1,n)a[i].x=read(),a[i].y=read();sort(a+1,a+n+1,cmp);fo(i,1,n)fo(j,1,n)g[i][j]=gcd(a[i].x,a[j].x);fo(i,1,n){sum[i]=sum[i-1]+a[i].y;if (i!=1 && g[i][i-1]>1)f[0][i][i]=a[i].y;if (i!=n && g[i][i+1]>1)f[1][i][i]=a[i].y;}fo(len,2,n){fo(i,1,n-len+1){ll j=i+len-1,tmp;fo(k,i,j){if (k==i)tmp=f[0][i+1][j]+get(i,j);else if (k==j)tmp=f[1][i][j-1]+get(i,j);else tmp=f[1][i][k-1]+f[0][k+1][j]+get(i,j);if (i!=1 && g[k][i-1]>1)f[0][i][j]=max(f[0][i][j],tmp);if (j!=n && g[k][j+1]>1)f[1][i][j]=max(f[1][i][j],tmp);if (n==len)ans=max(ans,tmp);}}}printf("%lld\n",ans<0?-1ll:ans);return 0;
}
【JZOJ6287】扭动的树相关推荐
- JZOJ 6287. 2019.08.09【NOIP提高组A】扭动的树
DescriptionDescriptionDescription 给定权值和键值,求相邻键值不互质且满足二叉查找树性质的最大sumsumsum和 数据范围:n≤300n\leq 300n≤300 S ...
- 欢乐纪中A组赛【2019.8.9】
前言 在短暂的比赛时间中,我发现本菜鸡越是功于心计想ACACAC,越是拿不到分,所以... 我不写比赛了JOJO!JOJO!JOJO! 成绩 JJJ表示初中,HHH表示高中后面加的是几年级 RankR ...
- 2022.7.11~8.1纪中游记
Day 0 上午开始最后的拼搏! 结果下午一点就要走. 来到纪中发现宿舍换了,换的贼远,走路都要几分钟.饭堂小卖部也不如以前,什么都没了,估计是什么牛马投诉. 不知道校门外的小卖部还在不在. 晚上选组 ...
- 波士顿动力Spot mini,MIT猎豹、宇树科技、蔚蓝等几家公司产品的介绍
1.波士顿动力Spotmini Spot 是 2015 年 2 月发布的四足机器人,重量约为 75 公斤,可背负 45 公斤的有效负载进行自由行动或奔跑.Spot 采用激光雷达传感器和立体视觉传感器感 ...
- 判断两个树是否相等和判断tree1是否包含tree2 python实现
判断两个树是否相等 def equal(node_a, node_b):"""判断两个树是否相等:param node_a: :param node_b: :return ...
- 论文溯源树AMiner
来自 DBLP.ArXiv.STM 等多家学术出版机构和平台的数据表明,在过去 20 年间,计算机科学.物理学.统计学等研究领域的出版物总量都有大幅增加.像 CVPR.AAAI 等有关人工智能等新兴领 ...
- Python---哈夫曼树---Huffman Tree
今天要讲的是天才哈夫曼的哈夫曼编码,这是树形数据结构的一个典型应用. !!!敲黑板!!!哈夫曼树的构建以及编码方式将是我们的学习重点. 老方式,代码+解释,手把手教你Python完成哈夫曼编码的全过程 ...
- 深度树匹配模型(TDM)
深度树匹配模型(TDM) 算法介绍 Tree-based Deep Match(TDM)是由阿里妈妈精准定向广告算法团队自主研发,基于深度学习上的大规模(千万级+)推荐系统算法框架.在大规模推荐系统的 ...
- 洛谷 P5057 [CQOI2006]简单题(树状数组)
嗯... 题目链接:https://www.luogu.org/problem/P5057 首先发现这道题中只有0和1,所以肯定与二进制有关.然后发现这道题需要支持区间更改和单点查询操作,所以首先想到 ...
- 二逼平衡树——树套树(线段树套Splay平衡树)
题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...
最新文章
- Vue教程5【vuex】getters,mapState,mapGetters,mapActions,mapMutations,模块化namespace
- VC++ CopyFile函数使用方法
- 华为手机下拉菜单变大_不能不知的华为手机菜单栏,知道3个的算你手机没白买!...
- 试题 G: 外卖店优先级 第十届蓝桥杯
- 不要一辈子靠技术生存!!
- Python:file (read,readline,readline )使用方法
- 中高级数论 [欧拉函数线性筛,二次剩余]
- Spring [CVE-2022-22965]漏洞处理
- 机器学习的重新思考:人工智能如何学习“失忆”?
- Swift中文教程(三) 字符串和字符
- 三方支付 微信支付 支付宝支付 银联支付 分享
- 大学生性价比计算机推荐,2018大学生笔记本推荐_良心笔记本推荐【性价比之王】-太平洋电脑网...
- 四十八种微信公众号加人方法
- Java中的成员变量和局部变量
- switch语句表达式和执行流程
- 【调色台】达芬奇调色台系列
- MySql 如何查询某一天内的数据
- hashCode()和哈希值
- 使用css3和tween.js二种方式实现照片翻转
- 使用路由器后,上网速度比较慢(下载慢、延迟大)?