bzoj千题计划164:bzoj5123: 线段树的匹配
http://www.lydsy.com/JudgeOnline/upload/201712/prob12.pdf
dp[len][0/1] 表示节点表示区间长度为len,节点选/不选的 最大匹配
sum[len][0/1] 表示对应dp[len][0/1]的方案数
这里选节点即选节点与其父节点的边
设区间长度为len,左子区间长度为L,右子区间长度为R
这个节点选,那么左右子节点都不能选
dp[len][1]=1+dp[L][0]+dp[R][0]
sum[len][1]=sum[L][0]*sum[R][0]
这个节点不选,有3种情况:
左右子节点都不选:
dp[len][0]=dp[L][0]+dp[R][0]
sum[len][0]=sum[L][0]+sum[R][0]
选左子节点:
dp[len][0]=dp[L][1]+dp[R][0]
sum[len][0]=sum[L][1]+sum[R][0]
选右子节点:
dp[len][0]=dp[L][0]+dp[R][1]
sum[len][0]=sum[L][0]+sum[R][1]
如果dp[len][0] 在三种情况中有相同的,sum[len][0]要累加
len虽然是1e18,但只会用log种,所以用map
#include<map>
#include<cstdio>
#include<cstring> using namespace std; typedef long long LL; const int mod=; //int dp[100001][2];
//int sum[10001][2]; map<LL,LL>dp[];
map<LL,LL>sum[]; void dfs(LL len)
{
if(len==)
{
dp[][]=;
sum[][]=;
dp[][]=;
sum[][]=;
return;
}
LL R=len>>;
LL L=len-R;
if(dp[].find(L)==dp[].end()) dfs(L);
if(dp[].find(R)==dp[].end()) dfs(R);
dp[][len]=+dp[][L]+dp[][R];
sum[][len]=sum[][L]*sum[][R]%mod;
dp[][len]=dp[][len]-;
sum[][len]=sum[][len];
if(dp[][L]+dp[][R]>dp[][len])
{
dp[][len]=dp[][L]+dp[][R];
sum[][len]=sum[][L]*sum[][R]%mod;
}
else if(dp[][L]+dp[][R]==dp[][len])
{
sum[][len]=(sum[][len]+sum[][L]*sum[][R])%mod;
}
if(dp[][L]+dp[][R]>dp[][len])
{
dp[][len]=dp[][L]+dp[][R];
sum[][len]=sum[][L]*sum[][R]%mod;
}
else if(dp[][L]+dp[][R]==dp[][len])
{
sum[][len]=(sum[][len]+sum[][L]*sum[][R])%mod;
}
} int main()
{
LL n;
scanf("%I64d",&n);
dfs(n);
printf("%I64d %I64d",dp[][n],sum[][n]);
}
bzoj千题计划164:bzoj5123: 线段树的匹配的更多相关文章
- bzoj千题计划318:bzoj1396: 识别子串(后缀自动机 + 线段树)
https://www.lydsy.com/JudgeOnline/problem.php?id=1396 后缀自动机的parent树上,如果不是叶子节点,那么至少有两个子节点 而一个状态所代表子串的 ...
- bzoj千题计划311:bzoj5017: [Snoi2017]炸弹(线段树优化tarjan构图)
https://www.lydsy.com/JudgeOnline/problem.php?id=5017 暴力: 对于每一个炸弹,枚举所有的炸弹,看它爆炸能不能引爆那个炸弹 如果能,由这个炸弹向引爆 ...
- bzoj千题计划275:bzoj4817: [Sdoi2017]树点涂色
http://www.lydsy.com/JudgeOnline/problem.php?id=4817 lct+线段树+dfs序 操作1:access 操作2:u到根的-v到根的-lca到根的*2+ ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划274:bzoj3779: 重组病毒
http://www.lydsy.com/JudgeOnline/problem.php?id=3779 有一棵树,初始每个节点有不同的颜色 操作1:根节点到x的路径上的点 染上一种没有出现过的颜色 ...
- bzoj千题计划271:bzoj4869: [六省联考2017]相逢是问候
http://www.lydsy.com/JudgeOnline/problem.php?id=4869 欧拉降幂+线段树,每个数最多降log次,模数就会降为1 #include<cmath&g ...
- bzoj千题计划252:bzoj1095: [ZJOI2007]Hide 捉迷藏
http://www.lydsy.com/JudgeOnline/problem.php?id=1095 点分树+堆 请去看 http://www.cnblogs.com/TheRoadToTheGo ...
- bzoj千题计划251:bzoj3672: [Noi2014]购票
http://www.lydsy.com/JudgeOnline/problem.php?id=3672 法一:线段树维护可持久化单调队列维护凸包 斜率优化DP 设dp[i] 表示i号点到根节点的最少 ...
- bzoj千题计划244:bzoj3730: 震波
http://www.lydsy.com/JudgeOnline/problem.php?id=3730 点分树内对每个节点动态维护2颗线段树 线段树以距离为下标,城市的价值为权值 对于节点x的两棵线 ...
随机推荐
- java List.get
并不能 用如果List在i位置值不存在 并不能 List.get(i) !=null 判断 会抛异常 版权声明:本文为博主原创文章,未经博主允许不得转载.
- week3a:个人博客作业
1.博客上的问题 阅读下面程序,请回答如下问题: using System; using System.Collections.Generic; using System.Text; namespac ...
- 基于CORBA/WEB技术构建三层体系结构的应用
1 问题提出 在应用系统开发过程中,CLIENT/SERVER体系结构得到了广泛的应用 .其特点是,应用程序逻辑通常分布在客户和服务器两端,客户端发出数据资源访问请求,服务器端将结果返回客户端.但CL ...
- Mac下不能安装第三方下载软件
1.安装成功后,启动时如提示“某某文件已损坏,打不开”,请将电脑的“系统偏好设置--安全性与隐私--通用”的允许从以下位置下载的应用程序设置为“任何来源”. 2.如果您的电脑上没有“任何来源”的选项, ...
- FastReport 变量列表使用
使用报表变量时,引用“frxVariables”单元. 变量定义在“TfrxVariable” 类: TfrxVariable = class(TCollectionItem) published p ...
- 正则化项L1和L2
本文从以下六个方面,详细阐述正则化L1和L2: 一. 正则化概述 二. 稀疏模型与特征选择 三. 正则化直观理解 四. 正则化参数选择 五. L1和L2正则化区别 六. 正则化问题讨论 一. 正则化概 ...
- double 和 im2double 的区别
double 就是简单地把一个变量类型转换成double型,数值大小不变. 函数im2double将输入换成double类型.如果输入是unit8,unit16或者是二值的logical类型,则函数i ...
- Netty基础系列(3) --彻底理解NIO
前言 上一节中我们提到了同步异步与阻塞非阻塞的区别,知道了同步并不等于阻塞.而本节的主角NIO是一种同步非阻塞的I/O模型,并且是I/O多路复用模型.NIO在java中被称为 New I/O.它并不能 ...
- Paint Chain HDU - 3980(sg)
因为题中是个环, 所以我们可以首先拿出一组m 如果n<m 先手必输 否则的话跑sg函数 n = n-m #include <iostream> #include <cstdio ...
- Linux中的防火墙----iptables
防火墙,它是一种位于内部网络与外部网络之间的网络安全系统.一项信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过. 防火墙根据主要的功能可分为网络层防火墙.应用层防火墙.数据库防火墙. 网 ...