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 ...
随机推荐
- Windows系统开启显示文件名后缀
更新记录 2022年4月16日:本文迁移自Panda666原博客,原发布时间:2021年8月26日. 通常Windows系统根据文件名称的后缀来确定文件的类型.经常让朋友出现软件方面的问题,让其修改一 ...
- JVM学习笔记-从底层了解程序运行(一)
1:JVM基础知识 什么是JVM 1. java虚拟机,跨语言的平台,实现java跨平台 2. 可以实现多种语言跨平台,只要该语言可以编译成.class文件 3. 解释执行.class文件 java是 ...
- java标识符 identifier
1,标识符 --> 类名 方法名 变量名 常量名 接口名 为程序员自己命名的内容 main也是标识符但是不能修改 2, 命名规则 只能以 数字 字母(中文) 下划线 美元符号 ...
- 这不会又是一个Go的BUG吧?
hello,大家好呀,我是小楼. 最近我又双叒叕写了个BUG,一个线上服务死锁了,不过幸亏是个新服务,没有什么大影响. 出问题的是Go的读写锁,如果你是写Java的,不必划走,更要看看本文,本文的重点 ...
- 二:动手实操SpringBoot-使用Spring Initializr创建项目
使用 Spring Initializr 初始化 Spring Boot 项目 Spring Initializr 从本质上说就是一个Web应用程序,它能为你构建Spring Boot项目结构. 虽然 ...
- skywalking链路监控
1. 下载安装包官网地址:http://skywalking.apache.org/downloads/ 2. tar xzf apache-skywalking-apm-6.5.0.tar.gz - ...
- UiPath剪贴板操作的介绍和使用
一.剪切板操作的介绍 模拟用户使用剪切板操作的一种行为: 例如使用设置剪切板(SettoClipboard),从剪切板获取(GetfromClipboard)的操作 二.剪切板相关操作在UiPath中 ...
- 简单性能测试:springboot-2.x vs actix-web-4.x benchmark
性能测试:springboot-2.x vs actix-web-4.x benchmark 转载请注明出处 https://www.cnblogs.com/funnyzpc/p/15956465.h ...
- 【摸鱼神器】UI库秒变低代码工具——表单篇(一)设计
前面说了列表的低代码化的方法,本篇介绍一下表单的低代码化. 内容摘要 需求分析. 定义 interface. 定义表单控件的 props. 定义 json 文件. 基于 el-form 封装,实现依赖 ...
- FDFS上传文件报错 tracker_query_storage fail, error no: 2, error info: No such file or directo
原因: 1.tracker服务没有启动 2.Storage服务没有启动 解决方案: 输入命令查看这两个服务是否启动,如果没有则表明没有启动.启动即可. netstat -tulnp tracker服务 ...