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的两棵线 ...
随机推荐
- ReentrantLock 和 Condition的使用
ReentrantLock ReentrantLock可以等同于synchronized使用. ReentrantLock 类实现了Lock ,它拥有与 synchronized 相同的并发性和内存 ...
- Redis4.0模块子系统实现简述
一.模块加载方法 1.在配置文件或者启动参数里面通过<loadmodule /path/to/mymodule.so args>指令加载 2.Redis启动后,通过<module l ...
- Maven解读:强大的依赖体系
Github地址:https://github.com/zwjlpeng/Maven_Detail Maven最大的好处就是能够很方便的管理项目对第三方Jar包的依赖,只需在Pom文件中添加几行配置文 ...
- 1014 C语言文法定义与C程序的推导过程
<程序> -> <外部声明> | <程序> <外部声明> <外部声明> -> <函数定义> | <声明> ...
- ISCC2018(web)
ISCC2018 web writeup (部分) #web1:比较数字大小 只要比服务器上的数字大就好了 限制了输入长度,更改长度就好 #web2: 普通的代码审计,数组绕过 #web3:本地的诱惑 ...
- getResource()的使用总结 ;
1.通过ClassLoader来加载getResource()时不需要加 "/" 因为source是从main开始的; Thread.currentThread().getCont ...
- Windows下 OpenSSL的安装与简单使用
1. openssl的最新版本 最新版本是 openssl1.1.1 官方地址 https://www.openssl.org/source/ TLS1.3的协议(RFC8446)在2018.8.12 ...
- 解决Linux关闭SSH,终端后运行程序终止问题(包括后台)
问题描述: 每次SSH到服务器上,然后运行了一个自己写的服务端程序,比如 ./myserver.sh ,然后关闭ssh或者终端之后,发现服务不能访问. 简要分析下: 根据 这篇博文 的提示,ss ...
- python杂谈:Python中\r的用法示例
\r 默认表示将输出的内容返回到第一个指针,这样的话,后面的内容会覆盖前面的内容 import sys import time def view_bar(num,total): rate = floa ...
- 虚拟机centos 安装 redis 环境 linux 使用 java 远程连接 redis
redis官网地址:http://www.redis.io/ 最新版本:2.8.3 在Linux下安装Redis非常简单,具体步骤如下(官网有说明): 1.下载源码,解压缩后编译源码. $ wget ...