Description

有n个怪物排成一排,他们的生命值各不相同,asuka有一个叫做“千方残光剑”的技能,可以先秒杀掉y个怪物,然后对任意个怪物造成总量小于等于x点的伤害,但是如果不打死怪物就不会有经验,而asuka又有强迫症,他想保证自己最后杀掉的怪物是相邻的(是一整段的),那么释放一次技能最多能杀死多少个怪物呢?

Input

第一行输入一个t,t<=5代表数据组数。

对于每一组,第一行输入一个n,代表怪物个数。

第二行有n个数字,代表每个怪物的生命值,它们各不相同且ai<=n。

第三行一个整数x意义如题意。

第四行一个整数y意义如题意。

n<=100000。

Output

对于每一组输出一个整数x代表能够选取的怪物的最大数量。

Sample Input

1

5

1 2 3 4 5

7

1

Sample Output

4

Source

“科林明伦杯”计算机学院2018年程序设计竞赛


解题分析

选取最长的连续区间,使去掉最大的yyy个数字后的区间和不大于x" role="presentation" style="position: relative;">xxx。

尺取法(双指针lll, r" role="presentation" style="position: relative;">rrr)选择连续区间,不断右移rrr以更新区间;求去掉前y" role="presentation" style="position: relative;">yyy大数字后的区间和,可建一棵权值线段树(甚至不用离散化),维护区间数字个数numnumnum与区间和sumsumsum,可在log(n)log(n)log(n)的时间找到第yyy大数的位置,此时左侧数字和即为所求。

若当前区间[l,r]" role="presentation" style="position: relative;">[l,r][l,r][l, r]去掉前yyy大数字后的区间和大于x" role="presentation" style="position: relative;">xxx,可使lll右移,缩短区间至满足要求后,更新最大区间长度。

总时间复杂度O(nlog(n))" role="presentation" style="position: relative;">O(nlog(n))O(nlog(n))O(nlog(n))。


AC代码

#include<cstdio>
#include<iostream>
#include<cstring>
#define LL long long
using namespace std;
const int MAXN = 100010;LL x;
int n, y, a[MAXN];template<typename T> inline void Read(T &x) {char ch = getchar(); x = 0;for (; ch<'0'; ch = getchar());for (; ch >= '0'; ch = getchar()) x = x * 10 + ch - '0';
}struct STree{int l, r, num; LL sum;}st[MAXN << 2];
#define lson p << 1
#define rson p << 1 | 1
#define l(x) st[x].l
#define r(x) st[x].r
#define sum(x) st[x].sum
#define num(x) st[x].numvoid build(int p, int l, int r)
{l(p) = l, r(p) = r;if(l == r){sum(p) = num(p) = 0;return;}int mid = (l + r) >> 1;build(lson, l, mid);build(rson, mid + 1, r);sum(p) = sum(lson) + sum(rson);num(p) = num(lson) + num(rson);
}void change(int p, int x, int d)
{if(l(p) == r(p)){sum(p) = d ? x : 0;num(p) = d;return;}int mid = (l(p) + r(p)) >> 1;if(x <= mid) change(lson, x, d);else change(rson, x, d);sum(p) = sum(lson) + sum(rson);num(p) = num(lson) + num(rson);
}LL ask(int p, int k)
{if(k == num(p)) return 0;LL ans = 0;if(num(rson) > k) ans += sum(lson) + ask(rson, k);else if(num(rson) < k) ans += ask(lson, k - num(rson));else return sum(lson);return ans;
}int main()
{int T; Read(T);while(T --){Read(n);for(int i = 1; i <= n; i ++) Read(a[i]);Read(x); Read(y);if(y >= n){cout << n << endl;continue;}build(1, 0, n);for(int i = 1; i <= y; i ++) change(1, a[i], 1);int l = 1, ans = y;for(int r = y + 1; r <= n; r ++){change(1, a[r], 1);while(x < ask(1, y)) change(1, a[l ++], 0);ans = max(ans, r - l + 1);}cout << ans << endl;}return 0;
}

HRBUST 2388 - 千方残光剑(尺取法 + 权值线段树)相关推荐

  1. CF660C Hard Process(尺取法)

    整理的算法模板合集: ACM模板 尺取法 题目中要我们求最多改变k次后连续的1的最长长度.那么转换一下,不就是求至多包含k个0的子串的最长长度吗? 直接套用尺取法的思想,维护两端点,一旦0的个数超过k ...

  2. 【常用技巧精选】尺取法

    整理的算法模板合集: ACM模板 目录 1.反向扫描 1 找指定和的整数对 A.UVA1121 Subsequence B.POJ 3320 Jessica's Reading Problem C.l ...

  3. ACM—各种模拟 总结(字符串,尺取法,数学问题)习题汇总

    目录 一.字符串模拟 二. 高精度计算 1. 回文数(高精度,进制转换) 三.数学问题模拟 四.尺取法(双指针法) 1.都说小镇的切糕贵 (尺取法,字符串) umi和弓道 五.奇怪的模拟 x的位数=l ...

  4. 尺取法 POJ 3601 Subsequence

    题目传送门 1 /* 2 题意:求连续子序列的和不小于s的长度的最小值 3 尺取法:对数组保存一组下标(起点,终点),使用两端点得到答案 4 1. 记录前i项的总和,求[i, p)长度的最小值,用二分 ...

  5. poj2739(尺取法+质数筛)

    题意:给你一个数,问这个数能否等于一系列连续的质数的和: 解题思路:质数筛打出质数表:然后就是尺取法解决: 代码: #include<iostream> #include<algor ...

  6. 尺取法 || emmmm

    给定两个上升的数组,一个数组任取一个数,求两个数差的min 尺取法emm 也不知道对不对 #include <stdio.h> #include <stdlib.h> #def ...

  7. POJ 3320 尺取法,Hash,map标记

    1.POJ 3320 2.链接:http://poj.org/problem?id=3320 3.总结:尺取法,Hash,map标记 看书复习,p页书,一页有一个知识点,连续看求最少多少页看完所有知识 ...

  8. poj_2739 尺取法

    题目大意 给定一个数字N,N可能由1个或多个连续的素数求和得到,比如41 = 2+3+5+7+11+13, 41 = 11+13+17, 41 = 41.求出对于N,所有可能的组合形式. 题目分析 先 ...

  9. poj2566Bound Found尺取法进阶(java)

    题目链接: 这个尺取法的思想挺好的,如果第一次做尺取法题,不妨看下尺取法入门题. 题目大意: 多组测试数据(0,0)截止. 每组数据输入 n,k(n数字个数,k询问次数) 下一行n个数表示序列. 接下 ...

最新文章

  1. VC使用CRT调试功能来检测内存泄漏
  2. python大神-python大神教你在最短时间内学会爬取大规模数据
  3. destoon实现调用热门关键字的方法
  4. ap java内容_AP 计算机知识点总结
  5. [js] 在DOM上同时绑定两个点击事件(一个用捕获,一个用冒泡),事件总共会执行几次,先执行哪个事件?
  6. Java读取指定目录下的所有文件名
  7. 利用非数组的方法输出杨辉三角
  8. 解读中国式O2O的未来发展三大趋势
  9. 多线程经典模型-生产者消费
  10. 小芭比linux怎么装win7_超迷你的Linux系统--Puppy Linux(小芭比)
  11. Python | 使用turtle库画笑脸滑稽表情
  12. 服务器搬迁清单需要启动任务以及恢复办法
  13. 定制Hexo-NexT的个性化博客
  14. 百度编辑器ueditor-在线图片管理,想修改下默认的排序管理
  15. 学画画要花多少钱_孩子学画画大约需要多少钱呢?
  16. windows.frames
  17. C++ MFC 导出ListControl数据到Excel
  18. 有哪些一般人不知道的数据获取方式
  19. 使用CDN实现应用的缓存和加速
  20. Syn Flood 攻击

热门文章

  1. 区块链知识之 VRF: 可验证随机函数
  2. javaEE防盗版-class文件加密思路
  3. 关于 .Net 逆向的那些工具:反编译篇
  4. 【Ajax】如何通过axios发起Ajax请求
  5. charles证书过期,如何处理
  6. 创业十年,静静地反思zz
  7. 新冠疫情后智慧城市面临的挑战和发展机遇
  8. 深度刨析VDS链销模式12大优势
  9. Android移动开发-调用步行检测和步行计数传感器开发简易计步器的实现
  10. MATLAB 矩阵的特征值与特征向量