San(COCI2017.2)题解
题意
一个人为了楼顶的金币要去跳楼,但是不能往更矮的楼上跳。
求在一个长为N的序列中总点权值和大于等于K的不下降序列数。
N<=40,K<=4e10
官方题解
折半搜索的经典例子!N在20范围内搜索能过,40范围内需要折半,由于只能向右跳,所以可以先离散化高度后将数据分为左右两部分,分别DFS出两边的合法状态(每个状态就是合法的大楼高度不下降子序列,其中包含两个属性(子序列中val价值总和,左半边是最后1个楼的高度h,而右半边是第一个楼的高度h)),然后再排序考虑合并。左半部按价值总和从大到小排序,右半部从小到大排序,统计右半部的各种高度前缀和。
双指针从左往右扫,统计合法的方案数。
方法二:只对右半部分按总金币从小到大排序,保持valL+valR≥K && hL≤hR,二分对右半部分查找并匹配左半部分。


本人题解
一看这个K,肯定要开long long ,由于N很小,空间不涉及金币数是绝对没问题的,用暴力搜索是O(2^N)必定会超时。
如果单单是求以 i 开头的金币最多的子序列,我们可以用DP求,如果单单是求以 i 开头的子序列数,我们也可以用DP求,但是题目把它们结合了,而且限制了金币数的下限,虽然我们可以预处理DP判断以 i 开1头的最多金币数是否达标……
没错,只要我们可以O(1)判断以 i 开头的最多金币数是否达标,就可以是很不错的剪枝。
此外,若 i 本身的金币数就达标了,那answer岂不是直接加上以 i 开头的子序列数?
这两个剪枝一加上,我们的搜索就能变快许多倍。而且都可以用DP预处理。
考虑时间复杂度,answer包含的情况我们肯定算过,而不在answer中的方案,我们肯定在序列中第一个无效点就return了,所以最坏情况是O(answer),可以过。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#define max(x,y) ((x) > (y) ? (x) : (y))
#define min(x,y) ((x) < (y) ? (x) : (y))
#define abs(x) ((x) < 0 ? -(x) : (x))
#define LL long long
#define lowbit(x) (-(x) & (x))
using namespace std;
LL read() {
LL f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s == '-') f = -1;s = getchar();}
while(s >= '0' && s <= '9') {x = x * 10 + s - '0';s = getchar();}
return x * f;
}
LL n,m,i,j,o,k,cnt;
LL h[45],g[45];
LL dp1[45],dp2[45];//最大金币数,子序列数
LL dfs(int x,LL mon) {
LL as = 0;
if(dp1[x] < mon) return 0;
if(g[x] >= mon) return dp2[x];
for(int i = x + 1;i <= n;i ++) {
if(h[i] >= h[x]) {
as += dfs(i,mon - g[x]);
}
}
return as;
}
int main() {
n = read();m = read();
for(int i = 1;i <= n;i ++) {
h[i] = read();
g[i] = read();
}
for(int i = n;i >= 0;i --) {//DP预处理
dp1[i] = g[i];
dp2[i] = 1;
for(int j = n;j > i;j --) {
if(h[j] >= h[i]) {
dp1[i] = max(dp1[i],dp1[j] + g[i]);
dp2[i] += dp2[j];
}
}
}
printf("%lld\n",dfs(0,m));
return 0;
}
San(COCI2017.2)题解的更多相关文章
- 网络流24(san)题题解汇总
开坑(烂尾预定 1.餐巾计划问题 题解 2.最小路径覆盖问题 题解 3.试题库问题 题解 4.[CTSC1999]家园 题解 5.骑士共存问题 题解 6.最长不下降子序列问题 题解 7.深海机器人问题 ...
- Usmjeri(COCI2017.2)题解
题意 给一棵N个节点的树,编号从1到N,再给定m对点(u,v),你要将树上的每条无向边变为有向边,使得给定的点对都满足u能到达v或v能到达u.问有多少种不同的方案,答案对(1e9+7)求余. 1 ≤ ...
- 题解 P4093 【[HEOI2016/TJOI2016]序列】
这道题原来很水的? noteskey 一开始以为是顺序的 m 个修改,然后选出一段最长子序列使得每次修改后都满足不降 这 TM 根本不可做啊! 于是就去看题解了,然后看到转移要满足的条件的我发出了黑人 ...
- PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)
PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++: 欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/ ...
- coci2018 题解
plahte 给定一些矩形和一些有颜色的点,求每个矩形上有多少种颜色的点,保证矩形只有包含和不相交两种关系,规模 \(10^5\). 把每个矩形看成一个点,用扫描线建出森林,同时也顺便处理点. 然后做 ...
- 【JZOJ6229】【20190621】san
题目 \(n\)个点\(m\)条边的有向图,每个点有点权 你可以选择拓扑序的一个区间的 最大化点权和 $n \le 50 , m \le \frac{n*(n-1)}{2} , 0 \le |a_i ...
- 2016 Multi-University Training Contest 4 部分题解
1001,官方题解是直接dp,首先dp[i]表示到i位置的种类数,它首先应该等于dp[i-1],(假设m是B串的长度)同时,如果(i-m+1)这个位置开始到i这个位置的这一串是和B串相同的,那么dp[ ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
随机推荐
- 剖析虚幻渲染体系(15)- XR专题
目录 15.1 本篇概述 15.1.1 本篇内容 15.1.2 XR概念 15.1.2.1 VR 15.1.2.2 AR 15.1.2.3 MR 15.1.2.4 XR 15.1.3 XR综述 15. ...
- model.apply(fn)或net.apply(fn)
详情可参考:https://pytorch.org/docs/1.11/generated/torch.nn.Module.html?highlight=torch%20nn%20module%20a ...
- 阿里云FTP服务配置
阿里云的CENTOS 7.4 并没有开启防火墙服务 所以好多人配置了FTP后会出现各种不能访问的问题 关键原因在于端口没有开放.设置端口阿里云ECS的管理控制台中"安全组" &qu ...
- rpm 系 linux 系统中 repo 文件中的 $release 到底等于多少?
rpm 系 linux 系统中 repo 文件中的 $release 到底等于多少? 结论 对于 8 来说,通过以下命令 #/usr/libexec/platform-python -c 'impor ...
- 2.NoSQL之Redis配置与优化
一.关系型数据库与非关系数据库 关系型数据库: 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录. sQL语句(标准数据查询语言)就是一种基于关系型数据库的语言, ...
- JS:相等判断
1.= 赋值运算符 错误写法:a+b = c; 2.== :=== ==判断值是否相等 例: var a = 2; var b = 3; var c = a+b; var d = "2&q ...
- Javaweb-在idea中配置Tomcat
解决警告问题 为什么会有这个问题:我们访问一个网站,需要制定一个文件夹名字 最后点OK,Tomcat就亮起来了 运行成功弹出界面:
- ansible-playbook批量修改密码
1. 将服务器ip写到ansible hosts文件中 2. 实现免密登录服务器 将ansible服务器公钥拷贝到目标服务器用户目录下的.ssh/authorized_keys 手动连接一次或者自己写 ...
- SQL Server数据库 备份A库,然后删除A库,再还原A库,此时数据库一直显示“正在还原”的解决方法
SQL Server数据库 备份A库,然后删除A库,再还原A库,此时数据库一直显示"正在还原"的解决方法: A库一直显示"正在还原". 在这种状态下,由于未提交 ...
- 【cartogarpher_ros】二: 官方Demo的介绍与演示
上一节我们介绍了在linux中快速安装集成ros环境的cartographer. 本节我们会来跑一些官方demo,用于测试cartographer是否正确安装,顺便看看cartographer的建图与 ...