题目:51nod:

题目Codeforces:

题目注意到两个战舰不能挨在一起就可以了。

// 每一段
struct node{int left;  // 段的左端点int right;  // 段的右端点int length;  // 段长度int ship;  // 段最大容纳战舰数
}arr[200005];

每一段可容纳战舰数:

ship*a + (ship - 1) <= length;   -->   ship = (length+1) / (a+1);(舍去小数部分)

构造出这么一个数据结构就简单了。

现在还有一个问题:找到说miss的点所在段还需要时间,就算是二分查找也需要O(log(n)),加上遍历的O(n),时间复杂度O(n*log(n))。

         可不可能会超时呢?我认为有可能,所以保险起见,我用了一个数组index[i]表示第i个点所在的段,用空间换时间,比较值。

一次就AC了,思路就这么多,上代码把:

#include <bits\stdc++.h>
using namespace std;
typedef long long ll;// 每一段
struct node{int left;  // 段的左端点int right;  // 段的右端点int length;  // 段长度int ship;  // 段最大容纳战舰数
}arr[200005];
int len = 0;   // 段的数量int index[200005]; // 每一个点所处的段int n,k,a,m;
int miss;  // 每一次说miss的位置。int sumShip = 0;  // 现阶段可容纳最多战舰数// 获取某段可容纳最大战舰数量
int maxShip(node node1){return (node1.length+1)/(a+1);
}//初始化
void init(){arr[0].left = 1;arr[0].right = n;arr[0].length = arr[0].right - arr[0].left + 1;arr[0].ship = maxShip(arr[0]);sumShip = arr[0].ship;len = 1;
}//更新段
void updataNode(int miss){int con = index[miss];  // miss位置所在段node* x = &arr[con];    //取出这个段int shipNum = x->ship;arr[len].left = miss+1;arr[len].right = x->right;arr[len].length = arr[len].right - arr[len].left + 1;arr[len].ship = maxShip(arr[len]);replace(index+arr[len].left,index+arr[len].right+1 , con ,len);  // 将其中一部分所在段改变
x->right = miss-1;x->length = x->right - x->left + 1;x->ship = maxShip(*x);sumShip -= shipNum - arr[len].ship - x->ship;  // 总容纳战舰数减少的数量等于分段后减少的战舰数量
len++;
}int main() {cin >> n >> k >> a >> m;init();  // 初始化for(int i = 1;i <= m; ++i){cin >> miss;updataNode(miss);  // 更新段if(sumShip < k){cout << i << endl;return 0;}}cout << -1 << endl;return 0;
}
//written by zhangjiuding.

代码中涉及到的replace是头文件algorithm中的,

replace(a+3,a+10,p,q);

表示的是将a[i](i = [3,9])中的p全部换成q。

51 nod 1521 一维战舰 时间复杂度O(n),同 Codeforces 567D. One-Dimensional Battle Ships 有详细注释相关推荐

  1. 51 nod 1521 一维战舰 时间复杂度O(n),同 Codeforces 567D. One-Dimensional Battle Ships 有详细注释...

    题目:51nod: 题目Codeforces: 题目注意到两个战舰不能挨在一起就可以了. // 每一段 struct node{int left; // 段的左端点int right; // 段的右端 ...

  2. 51 nod 1427 文明 (并查集 + 树的直径)

    1427 文明 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 安德鲁在玩一个叫"文明"的游戏.大妈正在 ...

  3. 一维战舰(51Nod-1521)

    题目 爱丽丝和鲍博喜欢玩一维战舰的游戏.他们在一行有n个方格的纸上玩这个游戏(也就是1×n的表格). 在游戏开始的时候,爱丽丝放k个战舰在这个表格中,并不把具体位置告诉鲍博.每一只战舰的形状是 1×a ...

  4. 51 nod 1405 树的距离之和

    1405 树的距离之和 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给定一棵无根树,假设它有n个节点,节点编号从1到n, 求任意两点之间的距离(最短路径)之和. ...

  5. 51 nod 1439 互质对(Moblus容斥)

    1439 互质对 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有n个数字,a[1],a[2],-,a[n].有一个集合,刚开 ...

  6. [STL乱搞]51 Nod——1573 美丽的集合

    [STL乱搞]51 Nod--1573 美丽的集合 题目梗概 在多重集之中,同一个元素可以出现多次. 我们现在有n个多重集合,第i个集合最开始都有一个元素ai(1≤i≤n). 定义多重集合的价值为子集 ...

  7. 51 nod 1006 最长公共子序列Lcs

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1006 参考博客 :http://blog.csdn.net/yysdsy ...

  8. 51 nod 1495 中国好区间 奇葩卡时间题 700ms 卡O(n*log(n)), 思路:O(n)尺取法

    题目: 这个题目竟然叫中国好区间,要不要脸.欸,不得不说还蛮顺口的,哈哈哈. 首先我们有一个数组a.可以递推得来,O(n)时间复杂度. 定义left(有效区间的左端点),bigger(有效区间中大于等 ...

  9. 51 nod 1624 取余最长路 思路:前缀和 + STL(set)二分查找

    题目: 写这题花了我一上午时间. 下面是本人(zhangjiuding)的思考过程: 首先想到的是三行,每一行一定要走到. 大概是这样一张图 每一行长度最少为1.即第一行(i -1) >= 1, ...

最新文章

  1. HDU - 2767 Proving Equivalences tanjar强连通-DAG性质
  2. vue json 导出 excel
  3. boost::fibers::unbuffered_channel用法的测试程序
  4. 程序员面试100题之十四:强大的和谐
  5. 用xfire开发webservice实例
  6. loj2245 [NOI2014]魔法森林 LCT
  7. 可盈可乐未能连接到服务器,CoinCola可盈可乐 场外OTC平台使用方法
  8. 熊猫烧香病毒背后的***社会
  9. JetBrains系列WebStorm等中文输入法无法跟随光标的问题的解决办法
  10. opencv编译找不到nvcuvid.h文件
  11. 阿里P7跳槽后曝光薪资截图:新公司月入税后五万多,很满足!
  12. python爬虫常用模块介绍_python爬虫常用的模块分析
  13. 福禄克FLUKE OptiFiber Pro HDR OTDR光时域反射(OTDR)测试仪OFP2-100-S
  14. ns手柄pc驱动_颜值、功能、手感同步在线 北通宙斯机械游戏手柄体验
  15. Abis接口的概念和引发的商业策略
  16. 《徐卓-心理咨询师校园报告 》--心得
  17. 理解pem pfx文件
  18. Android人脸识别和证件识别
  19. 99.999999%人看不出来的水印,专治各种盗图
  20. 视杯和视盘分割及分类方法对青光眼诊断的探讨

热门文章

  1. 每日程序C语言2-判断某日期是这一年的第几天
  2. 为什么parsefloat加出来还是字符串_为什么酒店的包子做的这么好吃?里面加了什么说出来你可能不信...
  3. final在java中的含义_在java中一个类被声明为final类型,表示的意思是()
  4. linux下的ssh和rynsc
  5. 从 0 到 1 实现 React 系列 —— 4.setState优化和ref的实现
  6. PHP索引数组+unset使用不当导致的问题
  7. linux centos7 安装redis
  8. PHP中file_exists()函数不支持中文文件名解决办法
  9. 操作系统实验报告9:进程间通信—管道和 socket 通信
  10. 【数据结构与算法】之深入解析图的拓扑排序