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: 线段树的匹配的更多相关文章

  1. bzoj千题计划318:bzoj1396: 识别子串(后缀自动机 + 线段树)

    https://www.lydsy.com/JudgeOnline/problem.php?id=1396 后缀自动机的parent树上,如果不是叶子节点,那么至少有两个子节点 而一个状态所代表子串的 ...

  2. bzoj千题计划311:bzoj5017: [Snoi2017]炸弹(线段树优化tarjan构图)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5017 暴力: 对于每一个炸弹,枚举所有的炸弹,看它爆炸能不能引爆那个炸弹 如果能,由这个炸弹向引爆 ...

  3. bzoj千题计划275:bzoj4817: [Sdoi2017]树点涂色

    http://www.lydsy.com/JudgeOnline/problem.php?id=4817 lct+线段树+dfs序 操作1:access 操作2:u到根的-v到根的-lca到根的*2+ ...

  4. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  5. bzoj千题计划274:bzoj3779: 重组病毒

    http://www.lydsy.com/JudgeOnline/problem.php?id=3779 有一棵树,初始每个节点有不同的颜色 操作1:根节点到x的路径上的点 染上一种没有出现过的颜色 ...

  6. bzoj千题计划271:bzoj4869: [六省联考2017]相逢是问候

    http://www.lydsy.com/JudgeOnline/problem.php?id=4869 欧拉降幂+线段树,每个数最多降log次,模数就会降为1 #include<cmath&g ...

  7. bzoj千题计划252:bzoj1095: [ZJOI2007]Hide 捉迷藏

    http://www.lydsy.com/JudgeOnline/problem.php?id=1095 点分树+堆 请去看 http://www.cnblogs.com/TheRoadToTheGo ...

  8. bzoj千题计划251:bzoj3672: [Noi2014]购票

    http://www.lydsy.com/JudgeOnline/problem.php?id=3672 法一:线段树维护可持久化单调队列维护凸包 斜率优化DP 设dp[i] 表示i号点到根节点的最少 ...

  9. bzoj千题计划244:bzoj3730: 震波

    http://www.lydsy.com/JudgeOnline/problem.php?id=3730 点分树内对每个节点动态维护2颗线段树 线段树以距离为下标,城市的价值为权值 对于节点x的两棵线 ...

随机推荐

  1. ReentrantLock 和 Condition的使用

    ReentrantLock  ReentrantLock可以等同于synchronized使用. ReentrantLock 类实现了Lock ,它拥有与 synchronized 相同的并发性和内存 ...

  2. Redis4.0模块子系统实现简述

    一.模块加载方法 1.在配置文件或者启动参数里面通过<loadmodule /path/to/mymodule.so args>指令加载 2.Redis启动后,通过<module l ...

  3. Maven解读:强大的依赖体系

    Github地址:https://github.com/zwjlpeng/Maven_Detail Maven最大的好处就是能够很方便的管理项目对第三方Jar包的依赖,只需在Pom文件中添加几行配置文 ...

  4. 1014 C语言文法定义与C程序的推导过程

    <程序> -> <外部声明> | <程序> <外部声明> <外部声明> -> <函数定义> | <声明> ...

  5. ISCC2018(web)

    ISCC2018 web writeup (部分) #web1:比较数字大小 只要比服务器上的数字大就好了 限制了输入长度,更改长度就好 #web2: 普通的代码审计,数组绕过 #web3:本地的诱惑 ...

  6. getResource()的使用总结 ;

    1.通过ClassLoader来加载getResource()时不需要加 "/" 因为source是从main开始的; Thread.currentThread().getCont ...

  7. Windows下 OpenSSL的安装与简单使用

    1. openssl的最新版本 最新版本是 openssl1.1.1 官方地址 https://www.openssl.org/source/ TLS1.3的协议(RFC8446)在2018.8.12 ...

  8. 解决Linux关闭SSH,终端后运行程序终止问题(包括后台)

    问题描述: 每次SSH到服务器上,然后运行了一个自己写的服务端程序,比如 ./myserver.sh ,然后关闭ssh或者终端之后,发现服务不能访问. 简要分析下: 根据   这篇博文  的提示,ss ...

  9. python杂谈:Python中\r的用法示例

    \r 默认表示将输出的内容返回到第一个指针,这样的话,后面的内容会覆盖前面的内容 import sys import time def view_bar(num,total): rate = floa ...

  10. 虚拟机centos 安装 redis 环境 linux 使用 java 远程连接 redis

    redis官网地址:http://www.redis.io/ 最新版本:2.8.3 在Linux下安装Redis非常简单,具体步骤如下(官网有说明): 1.下载源码,解压缩后编译源码. $ wget ...