【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]中是否出现. ...
随机推荐
- java MySQl数据库连接
<%@ page import="java.sql.Connection" %> <%@ page import="java.sql.DriverMan ...
- 天道神诀--IPSAN实现多链路以及多路径安装
# linux6 环境需求 ISCSI服务端: 2张网卡,足够的磁盘空间 iscsi客户端: 2张网卡(与服务端网段相同) ISCSI服务端配置: 与1张网卡配置主要差别在于配置文件中的允许访问网段, ...
- 使用PHP如何去除字符串结尾的字符
前言 在工作中遇到一个需求:一串字符串,如"迅雷官方下载"."快播5.0下载",需要去掉他们结尾的"官方下载"和"下载" ...
- JavaScript中this对象原理简洁说明
今天看了阮一峰大神的博客文章:JavaScript 的this原理,把纠结很久的this的指向终于理解清楚了 原文:http://www.ruanyifeng.com/blog/2018/06/jav ...
- 文件IO 例子
例子1: 测试最多打开多少个文件 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> # ...
- Mysql优化-分区
分区简介 分区是根据一定的规则,数据库把一个表分解成多个更小的.更容易管理的部分.就访问数据库应用而言,逻辑上就只有一个表或者一个索引,但实际上这个表可能有N个物理分区对象组成,每个分区都是一个独立的 ...
- Jenkins 搭建 .NET Core 持续集成环境
关于c#的.Net FrameWork 的集成环境以及MsBuild的配置可以看 jenkins搭建.NET FrameWork持续集成环境 这篇文章 关于.NET Core 这个项目 ...
- The chance for love doesn't come around every day.
The chance for love doesn't come around every day.爱的机会不是每天都有的.
- thinkphp 日志驱动
日志驱动默认的命名空间位于Think\Log\Driver,驱动类需要实现的接口方法包括: 方法 说明 架构方法 __construct($config=array()) 写入方法 write($lo ...
- thinkphp 动态配置
之前的方式都是通过预先定义配置文件的方式,而在具体的操作方法里面,我们仍然可以对某些参数进行动态配置(或者增加新的配置),主要是指那些还没有被使用的参数. 设置新的值: C('参数名称','新的参数值 ...