【JZOJ6287】扭动的树
description

analysis
区间\(DP\),首先按照键值排个序,这样保证树的中序遍历就为原序列
设\(f[0][i][j]\)表示\([i..j]\)区间作为\([unknown..i-1]\)的右儿子的最大和,\(f[1][i][j]\)就是\([i..j]\)区间作为\([j+1..unknown]\)的左儿子
预处理\(f\)的初值是很明显的,然后\(O(n^2log)\)预处理出两两数之间的\(\gcd\)
对于一段区间\([i..j]\),枚举中转点\(k\),表示\([i..k-1],[k+1,j]\)分别作为\(k\)的左右儿子
\(k=i\)或\(k=j\)特殊转移,\(i<k<j\)可知\([i..j]\)可由\(f[1][i][k-1],f[0][k+1][j]\)转移得到
具体转移到\(0\)或\(1\)取决于\(a[k]\)与\(a[i-1],a[j+1]\)是否符合条件(\(\gcd>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】扭动的树的更多相关文章
- test20180922 扭动的树
题意 分析 二叉查找树按照键值排序的本质是中序遍历,每次我们可以在当前区间中提取出一个根,然后划分为两个子区间做区间DP.记\(f(i,j,k)\)表示区间[i, j]建子树,子树根节点的父亲是第k个 ...
- NOIp2018集训test-9-22(am/pm) (联考三day1/day2)
szzq学长出的题,先orz一下. day1 倾斜的线 做过差不多的题,写在我自己的博客里,我却忘得一干二净,反而李巨记得清清楚楚我写了的. 题目就是要最小化这个东西 $|\frac{y_i-y_j} ...
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
- ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单
前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...
- 再讲IQueryable<T>,揭开表达式树的神秘面纱
接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...
- HDU1671——前缀树的一点感触
题目http://acm.hdu.edu.cn/showproblem.php?pid=1671 题目本身不难,一棵前缀树OK,但是前两次提交都没有成功. 第一次Memory Limit Exceed ...
- 算法与数据结构(十一) 平衡二叉树(AVL树)
今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...
- [C#] C# 知识回顾 - 表达式树 Expression Trees
C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...
- bzoj3207--Hash+主席树
题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...
随机推荐
- python面试题之多线程好吗?列举一些让Python代码以并行方式运行的方法
答案 Python并不支持真正意义上的多线程.Python中提供了多线程包,但是如果你想通过多线程提高代码的速度,使用多线程包并不是个好主意.Python中有一个被称为Global Interpret ...
- mongo之find结果对象map实例处理
find 找到结果对象列表 res = await SS_StudentsLeaveTask.find(filter=_filter) self.resData = map(lambda x: str ...
- B 树 B+树
拜读了 http://blog.csdn.net/v_july_v/article/details/6530142, 自己总结下: B树的出发点是为了解决磁盘IO慢的问题,尽量再一个磁盘块中提供更 ...
- 链表list
Don't lost link! list与vector不同之处在于元素的物理地址可以任意. 为保证对列表元素访问的可行性,逻辑上互为前驱和后继的元素之间,应维护某种索引关系.这种索引关系,可抽象地 ...
- 【JZOJ6285】飘雪圣域
description analysis 从求联通块出发根本没做法,于是考虑连通块里面的边 对于一个询问\([l,r]\),一条边的左端点\(≥l\)且右端点\(≤r\)才在这个区间的点之间 于是对于 ...
- bzoj1042题解
[题意分析] 有q个询问,每次询问求一个只有四个物品的背包方案数. [解题思路] 先计算出所有面值硬币的无限背包方案数. 考虑容斥,每个限制表示选取大于di个面值ci的硬币,总方案数=0限制方案数-1 ...
- NX二次开发-NXOPEN自动切换到工程图模块
UFUN的API里是没有切换到工程图的函数的,NXOPEN里是有方法可以用的.不过应该是不支持NX9以下的版本. NX9的不能录制出来,在UI类里有方法 NX9+VS2012 #include < ...
- NXOpenC#_Training_blockstyler(cn)【转载】
- xcode5 添加Build Phases脚本
http://www.runscriptbuildphase.com/ 版权声明:本文为博主原创文章,未经博主允许不得转载.
- 执行SQL语句---SELECT
1.通常从MySQL数据库中检索数据有4个步骤: (1)发出查询: 用mysql_query发出查询. (2)检索数据: 用mysql_store_result/mysql_use_result (3 ...