题目链接:点击查看

题目大意:给出一个长度为 n 的数列,再给出 m 次询问,每次询问给出一个阈值 x ,问最少将数列分割成多少段,可以使得每一段的总和都不超过 x,无解的话输出 Impossible

题目分析:首先单独讨论一下无解的情况,因为数列总是可以被分成 n 段,也就是每个元素独立一段,这样的话如果阈值小于最大值的话显然是无解的

如果不考虑时间复杂度的话,不难想到一个 n * m 的做法,就是对于每个询问,都扫一遍数列,然后贪心求解

考虑优化,首先 m 个询问肯定是无法优化的,对于扫一遍数列的时间复杂度 O( n ),考虑优化,因为数列中的每个元素都是正整数,所以维护的前缀和一定是递增的,所以对于每段区间可以进行二分去划分,比如初始时未经过划分的总区间为 [ 1 , n ] ,设阈值为 x ,我们可以二分出一个最大的 pos,使得 sum[ pos ] - sum[ 0 ] <= x,这样可以直接将区间 [ 1 , pos ] 划分为第一段,然后再去给区间 [ pos + 1 , n ] 进行划分,这样做的时间复杂度最坏还是会退化为 O( n ) 的,但考虑利用数组记忆化一下,因为题目中约束了每个询问的阈值一定是小于等于 1e6 的,好像也是在暗示我们要记忆化一样,然后时间复杂度就不太会计算了,暂且当做 O( 能过 ) 吧

代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e6+100;int n,m,mmax,sum[N],ans[N];int solve(int x)
{if(ans[x])return ans[x];int last=1;ans[x]=0;while(last<=n){ans[x]++;int l=last,r=n,ans=-1;while(l<=r){int mid=l+r>>1;if(sum[mid]-sum[last-1]<=x){l=mid+1;ans=mid;}elser=mid-1;}last=ans+1;}return ans[x];
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);scanf("%d",&n);for(int i=1;i<=n;i++){int num;scanf("%d",&num);mmax=max(mmax,num);sum[i]=sum[i-1]+num;}scanf("%d",&m);while(m--){int x;scanf("%d",&x);if(x<mmax)puts("Impossible");elseprintf("%d\n",solve(x));}return 0;
}

中石油训练赛 - High Load Database(二分+记忆化)相关推荐

  1. 中石油训练赛 - 小说(最短路+二分)

    题目链接:点击查看 题目大意:给出一个无环无向图,以及k,定义答案是点1到点n的任意一条路径上,所经过的所有边的权值中的第k大值,求答案的最小值.(题目是中文题面,没看懂大意可以直接去看原题目..) ...

  2. 中石油训练赛 - Get Strong(dfs双向搜索+二分)

    题目大意:给出 n 个武器,每个武器可以升级最多 k[ i ] 次,每次升级需要花费 c[ i ][ j ] 个单位的金币,性能可以提升 w[ i ][ j ] 个单位,现在给出 m 个金币,问如何分 ...

  3. 中石油训练赛 - Fermat‘s Optimization Problem(Java高精度运算+二分)

    题目大意:给出误差函数 ,现在给出 z 和 n,要求求出 x 和 y ,使得函数 F 的取值最小 题目分析:首先数据范围是幂次级别的,1e5 的 10 次方,也就是 1e50 次方,需要用到大数,我用 ...

  4. 中石油训练赛 - Historical Maths(二分)

    题目大意:给出三个十进制下的数字 A ,B ,C ,问是否存在一个 k ,满足在 k 进制下有 A * B = C 题目分析:需要观察出进制与 A * B 和 C 的大小之间具有单调性,如果进制较小的 ...

  5. 中石油训练赛 - Trading Cards(最大权闭合子图)

    题目大意:给出 n 个卡片,可以自由买卖,且价格都是相同的,再给出 m 个集合,如果已经得到了其中一个集合中的卡片,那么可以获得该集合的收益,问如何操作可以使得收益最大化 题目分析:最大权闭合子图的模 ...

  6. 中石油训练赛 - Watch Later(状压dp)

    题目链接:点击查看 题目大意: 给出一个长度为 n 的字符串,字符串中共有 k 种不同的字符,现在问删除掉所有字符的最小操作数,对于每种字符需要确定一个先后顺序,每次需要删除掉当前所有的这种字符才能去 ...

  7. 中石油训练赛 - Swapping Places(字典序最小的拓扑排序)

    题目链接:点击查看 题目大意:给出 s 个字符串表示种类,再给出 m 个朋友关系,表示两个种类的动物是朋友,现在给出一个长度为 n 的种类排列,规定相邻两个是朋友的种类的动物可以交换位置,问如何操作, ...

  8. 中石油训练赛 - Gone Fishing(固定大小的圆可以覆盖最多的点)

    题目大意:在二维平面中给出 n 个点,再给出一个固定大小的圆,问如何放置这个圆可以使其覆盖最多的点 题目分析:首先不难想到一种 n^3 的做法,就是两层循环去枚举两个点,因为两个不同的点就可以确定下来 ...

  9. 中石油训练赛 - Russian Dolls on the Christmas Tree(树上启发式合并/主席树)

    题目链接:点击查看 题目大意:给出一棵 n 个节点的树,以点 1 为根,现在对于每个节点作为根的子树求解:子树中有多少个编号不相交的连续子段,如:1 2 4 5 7,共有三个连续的段,分别为 [ 1 ...

最新文章

  1. 面试了一个 46 岁的程序员,我思绪万千!
  2. Tone Mapping
  3. 动态规划——Poj 1159 Palindrome
  4. 在本地安装git的HTML帮助文档
  5. 支付宝二面:Mybatis 接口 Mapper 内的方法为啥不能重载吗?我直接懵逼了。。。
  6. Java-Web Servlet开发
  7. Python实例--文本词频统计
  8. hive增量表和全量表_hive 拉链表 实现全量数据 增量更新
  9. 如果在高速免费前上高速怎么计算机,上高速之前是收费的,下高速的时候免费了,这种情况如何处理?...
  10. python: insert()函数用法
  11. 抗住百万人直播、被联合国推荐,起底飞书技术演进之路!
  12. 一次搭建Spark集群(standalone、yarn、高可用)
  13. Android布局文件xml
  14. jenkins用户凭证插件的安装
  15. 刷好老毛子系统进不了老毛子系统后台的解决办法
  16. 计算机的冷门知识课件,PPT竟然还能这么玩!7组超实用冷门PPT小技巧
  17. MapReduce计算PMI
  18. 配电管理地理信息系统解决方案
  19. Nvidia GPU 最新计算能力表(CUDA Compute Capability)
  20. js判断鼠标单击或者双击事件

热门文章

  1. java 增量编译_java增量/全量编译接口应用
  2. Nginx服务的信号控制之USR2
  3. wait/notify的基本使用
  4. SpringSession实现用户会话
  5. 下单消息的发送和接收案例
  6. 选择结构_扩展if-else语句
  7. 日志规范之为什么要使用SLF4J
  8. 数据库-优化-数据库结构的优化-数据类型
  9. 常见问题_数组索引越界异常
  10. kail linux稳定版本,Kali Linux 2020.3 稳定版已发布 更新后新功能概览