题目描述:

可怜有一个长度为 \(n\) 的正整数序列 \(A\),但是她觉得 \(A\) 中的数字太小了,这让她很不开心。

于是她选择了 \(m\) 个区间 \([l_i, r_i]\) 和两个正整数 \(a\), \(k\)。她打算从这 \(m\) 个区间里选出恰好$ k$ 个区间,并对每个区间执行一次区间加\(a\) 的操作。(每个区间最多只能选择一次。)

对区间 $[l, r] \(进行一次加\) a \(操作可以定义为对于所有
\)i \in [l, r]$ ,将 \(A_i\) 变成 \(A_i + k\)。现在可怜想要知道怎么选择区间才能让操作后的序列的最小值尽可能的大,即最大化\(min{A_i}\)

数据范围:

\(n,m \leq 200 ,T \leq 2000,k \leq m,a \leq 100,A_i \leq 10^8\)

题解:

差点以为做了个假题...

疯狂T:二分写炸

直接二分最小值判断即可,维护最小值用优先队列。


等等...这题不是T1?

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 10;
int n,m,k,v;
priority_queue<int>q;
struct node {
int l;
int r;
}dat[MAXN];
int a[MAXN];
int c[MAXN];
int T,l,r;
int cnt;
int ans;
bool cmp(node a,node b) {
return a.l == b.l ? a.r < b.r : a.l < b.l;
}
bool ok(int mid) {
memset(c,0,MAXN);
cnt = 0;
while(!q.empty()) q.pop();
int it = 1;
for(int i = 1;i <= n; ++i) {
while(it <= m and dat[it].l <= i) {
q.push(dat[it].r);
it ++;
}
c[i] += c[i - 1];
while(!q.empty() and c[i] + a[i] < mid and cnt < k) {
int x = q.top();q.pop();
if(x >= i) {
c[i] += v;
c[x + 1] -= v;
++cnt;
}
}
if(c[i] + a[i] < mid) return 0;
}
return 1;
}
int read () {
int q=0,f=1;char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;ch=getchar();
}
while(isdigit(ch)){
q=q*10+ch-'0';ch=getchar();
}
return q*f;
}
int main (){
T = read();
while(T--) {
n = read(),m = read(),k = read(),v = read();
l = INT_MAX;
for(int i = 1;i <= n; ++i) {
a[i] = read();
l = min(l,a[i]);
}
r = 0x3f3f3f3f;
for(int i = 1;i <= m; ++i) {
dat[i].l = read();
dat[i].r = read();
}
sort(dat + 1,dat + m + 1,cmp);
while(l <= r) {
int mid = (l + r) >> 1;
if(ok(mid)) {
l = mid + 1;
ans = mid;
}
else r = mid - 1;
}
printf("%d\n",ans);
}
return 0;
}

JXOI2017 加法的更多相关文章

  1. 【BZOJ5321】[JXOI2017]加法(贪心)

    [BZOJ5321][JXOI2017]加法(贪心) 题面 BZOJ 洛谷 题解 显然二分答案,算一下每个点至少要覆盖的次数.从左往右考虑如果这个点覆盖次数不够,就会选择覆盖这个点的.右端点最大的线段 ...

  2. [bzoj5321] [Jxoi2017]加法

    Description 可怜有一个长度为 n 的正整数序列 A,但是她觉得 A 中的数字太小了,这让她很不开心. 于是她选择了 m 个区间 [li, ri] 和两个正整数 a, k.她打算从这 m 个 ...

  3. 洛谷P4064 [JXOI2017]加法(贪心 差分)

    题意 题目链接 Sol 这题就是一个很显然的贪心... 首先二分一个答案,然后check是否可行.check的时候我们需要对每个位置\(i\),维护出所有左端点在\(i\)左侧,右端点在\(i\)右侧 ...

  4. BZOJ5321 JXOI2017加法(二分答案+贪心+堆+树状数组)

    二分答案后得到每个位置需要被加的次数.考虑贪心.从左到右考虑每个位置,将以该位置为左端点的区间按右端点从大到小加进堆.看该位置还需要被加多少次,如果不需要加了就不管,否则取堆顶区间将其选择,BIT实现 ...

  5. 【[JXOI2017]加法】

    江西竟然还有省选,而且还是可怜题,实在是有点可怕 这道题还是比较清真的,大概是最简单的可怜题? 首先看到最大值最小,就很容易想到了二分答案 对于一个二分出来的答案\(mid\),去把原数列扫一遍就可以 ...

  6. BZOJ5321 & 洛谷4064 & LOJ2274:[JXOI2017]加法——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5321 https://www.luogu.org/problemnew/show/P4064 ht ...

  7. [P4064][JXOI2017]加法(贪心+树状数组+堆)

    题目描述 可怜有一个长度为 n 的正整数序列 A,但是她觉得 A 中的数字太小了,这让她很不开心. 于是她选择了 m 个区间 [li, ri] 和两个正整数 a, k.她打算从这 m 个区间里选出恰好 ...

  8. luogu P4064 [JXOI2017]加法

    题目描述 可怜有一个长度为 n 的正整数序列 A,但是她觉得 A 中的数字太小了,这让她很不开心. 于是她选择了 m 个区间 [li, ri] 和两个正整数 a, k.她打算从这 m 个区间里选出恰好 ...

  9. jxoi2017

    题解: 并不知道题目顺序就按照难度排序了 [JXOI2017]加法 这是一道很简单的贪心 最小值最大二分答案 然后我们可以从左向右考虑每一个位置 如果他还需要+A 我们就从能覆盖它的区间中挑一个最右的 ...

随机推荐

  1. linux基础知识-常用命令

    ifconfig :查看当前ip hostname:查看主机名 vim /etc/hosts:修改地址映射 service iptables status : 查看防火墙状态 chkconfig ip ...

  2. mysql中int的长度与值的问题

    我们在数据库中设置一个int类型,设置好长度,然后会发现并没有受到长度的限制,这是因为,int值的范围和这个长度根本没有关系. int的存储大小是4个字节(B), 计算机存储单位的换算: 1B=8b ...

  3. delphi弹出选择对话框选择目录SelectDirectory 函数

    SelectDirectory 函数通过显示一个对话框来让用户选择一个目录.注意:在使用前要在Uses 语句中添加包含FileCtrl 的说明.函数原型如下:function SelectDirect ...

  4. java中常用的转义字符(转)

    Java编程中往往需要一些特殊操作,例如空格,换行.或者一些你使用特殊符号的意愿与程序中特殊符号意思冲突的时候,我们不能直接写就需要把这些符号转义,表达你的本意,并与程序中特殊符号做区分,这些都需要转 ...

  5. (转)图文详解MyEclipse中新建Maven webapp项目的步骤

    转:https://blog.csdn.net/ClementAD/article/details/46592557 MyEclipse中创建新的Maven项目(webapp目录结构)过程如下:   ...

  6. String Algorithm Summary - 1

    目录 Suffix Array Summay 单个字符串问题 两个字符串问题 多个字符串问题 AC-Automaton Summary 求长度为n(2e9)不包含给定字符串的合法串个数 包含至少一个词 ...

  7. IIS日志如何记录X-Forwarded-For

    起因 最近因为某个站点的流量异常,需要统计一下服务器的来源IP,本来开一下IIS日志就能搞定的事儿,但不幸的是生产服务器使用F5做了负载均衡,IIS日志无法记录到真实IP,真实的IP在"x- ...

  8. 【C++第一个Demo】---控制台RPG游戏1【游戏简介】

       经过1个月的制作和多次修改,终于有了基本雏形(此篇仅用于纪念历时3个多月C/C++学习所付出努力,也给和我一样苦恼于不能快速理解面向对象的同学们一点灵感) 在制作这个Demo过程中也受到了很多大 ...

  9. C++异常处理try、catch 没有finally

    程序的错误大致可以分为三种,分别是语法错误.逻辑错误和运行时错误: 1) 语法错误在编译和链接阶段就能发现,只有 100% 符合语法规则的代码才能生成可执行程序.语法错误是最容易发现.最容易定位.最容 ...

  10. camunda任务的一些简单操作

    public class ZccTaskService { TaskService taskService; @Before public void init(){ ProcessEngineConf ...