[bzoj5321] [Jxoi2017]加法
Description
可怜有一个长度为 n 的正整数序列 A,但是她觉得 A 中的数字太小了,这让她很不开心。
于是她选择了 m 个区间 [li, ri] 和两个正整数 a, k。她打算从这 m 个区间里选出恰好 k 个区间,并对每个区间执行一次区间加 a 的操作。(每个区间最多只能选择一次。)
对区间 [l, r] 进行一次加 a 操作可以定义为对于所有 i ∈ [l, r],将 Ai 变成 Ai + k。现在可怜想要知道怎么选择区间才能让操作后的序列的最小值尽可能的大,即最大化min Ai
Input
第一行输入一个整数表示数据组数。
对于每组数据第一行输入四个整数 n, m, k, a。
第二行输入 n 个整数描述序列 A。
接下来 m 行每行两个整数 li, ri 描述每一个区间。数据保证所有区间两两不同.
Output
对于每组数据输出一个整数表示操作后序列最小值的最大值。
Sample Input
1
3 3 2 1
1 3 2
1 1
1 3
3 3
Sample Output
3
HINT
对于100%的数据,保证\(1≤n,m≤200, 1\leq T\leq 2000, 1 ≤ k ≤ m, 1 ≤ a ≤ 100,A_i\le 10^8\)
Solution
二分乱搞。
最小值最大显然二分。
考虑\(check\)怎么写,把区间按\(l\)关键字排序之后按\(r\)关键字用堆维护,然后乱搞。树状数组维护区间加法。
复杂度大概是\(O(Tn\log^2n)\)。
话说数据范围好奇怪啊
数组开\(2\times 10^5\),不然莫名\(RE\)(怀疑数据范围)
写起来很简单的啦
#include<bits/stdc++.h>
using namespace std;
void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
void print(int x) {
if(x<0) x=-x,putchar('-');
if(!x) return ;print(x/10);putchar(x%10+'0');
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
const int maxn = 2e5+1;
int s[maxn],n,m,k,a;
struct data{
int l,r;
int operator < (const data &rhs) const {return l<rhs.l;}
}in[maxn];
struct Binary_Indexed_Tree {
int tr[maxn];
void modify(int x,int v) {for(int i=x;i<=n;i+=i&-i) tr[i]+=v;}
int query(int x,int ans=0) {for(int i=x;i;i-=i&-i) ans+=tr[i];return ans;}
void clear() {memset(tr,0,sizeof tr);}
}BIT;
priority_queue<int > q;
int check(int lim) {
BIT.clear();int times=k;
for(int i=1;i<=n;i++) BIT.modify(i,s[i]),BIT.modify(i+1,-s[i]);
while(!q.empty()) q.pop();
int p=1;
for(int i=1;i<=n;i++) {
while(p<=m&&in[p].l==i) q.push(in[p].r),p++;
int x=BIT.query(i);
if(x>=lim) continue;
while(x<lim) {
x+=a;if(q.empty()||q.top()<i) return false;
int r=q.top();q.pop();
BIT.modify(i,a),BIT.modify(r+1,-a);times--;
if(times<0) return false;
}
}
return true;
}
void solve() {
int l=0,r=0;
read(n),read(m),read(k),read(a);
for(int i=1;i<=n;i++) read(s[i]),r=max(r,s[i]);
for(int i=1;i<=m;i++) read(in[i].l),read(in[i].r);
sort(in+1,in+m+1);int ans=0;
r+=k*a;
while(l<=r) {
int mid=((l+r)>>1);
if(check(mid)) ans=max(ans,mid),l=mid+1;
else r=mid-1;
}write(ans);
}
int main() {
int t;read(t);
while(t--) solve();
return 0;
}
[bzoj5321] [Jxoi2017]加法的更多相关文章
- BZOJ5321 JXOI2017加法(二分答案+贪心+堆+树状数组)
二分答案后得到每个位置需要被加的次数.考虑贪心.从左到右考虑每个位置,将以该位置为左端点的区间按右端点从大到小加进堆.看该位置还需要被加多少次,如果不需要加了就不管,否则取堆顶区间将其选择,BIT实现 ...
- 【BZOJ5321】[JXOI2017]加法(贪心)
[BZOJ5321][JXOI2017]加法(贪心) 题面 BZOJ 洛谷 题解 显然二分答案,算一下每个点至少要覆盖的次数.从左往右考虑如果这个点覆盖次数不够,就会选择覆盖这个点的.右端点最大的线段 ...
- BZOJ5321 & 洛谷4064 & LOJ2274:[JXOI2017]加法——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5321 https://www.luogu.org/problemnew/show/P4064 ht ...
- 洛谷P4064 [JXOI2017]加法(贪心 差分)
题意 题目链接 Sol 这题就是一个很显然的贪心... 首先二分一个答案,然后check是否可行.check的时候我们需要对每个位置\(i\),维护出所有左端点在\(i\)左侧,右端点在\(i\)右侧 ...
- 【[JXOI2017]加法】
江西竟然还有省选,而且还是可怜题,实在是有点可怕 这道题还是比较清真的,大概是最简单的可怜题? 首先看到最大值最小,就很容易想到了二分答案 对于一个二分出来的答案\(mid\),去把原数列扫一遍就可以 ...
- [P4064][JXOI2017]加法(贪心+树状数组+堆)
题目描述 可怜有一个长度为 n 的正整数序列 A,但是她觉得 A 中的数字太小了,这让她很不开心. 于是她选择了 m 个区间 [li, ri] 和两个正整数 a, k.她打算从这 m 个区间里选出恰好 ...
- luogu P4064 [JXOI2017]加法
题目描述 可怜有一个长度为 n 的正整数序列 A,但是她觉得 A 中的数字太小了,这让她很不开心. 于是她选择了 m 个区间 [li, ri] 和两个正整数 a, k.她打算从这 m 个区间里选出恰好 ...
- JXOI2017 加法
题目描述: 可怜有一个长度为 \(n\) 的正整数序列 \(A\),但是她觉得 \(A\) 中的数字太小了,这让她很不开心. 于是她选择了 \(m\) 个区间 \([l_i, r_i]\) 和两个正整 ...
- jxoi2017
题解: 并不知道题目顺序就按照难度排序了 [JXOI2017]加法 这是一道很简单的贪心 最小值最大二分答案 然后我们可以从左向右考虑每一个位置 如果他还需要+A 我们就从能覆盖它的区间中挑一个最右的 ...
随机推荐
- 汇编:将指定的内存中连续N个字节填写成指定的内容
1.loop指令实现 ;=============================== ;循环程序设计 ;将制定内存中连续count个字节填写成指定内容(te) ;loop指令实现 DATAS SEG ...
- android 自定义图片圆形进度条
感觉话一个圆形进度条挺简单的 ,但是却偏偏给了几张图片让你话,说实话我没接触过,感觉好难,还好百度有大把的资源,一番努力下终于画出来了. 代码如下. package com.etong.cpms.wi ...
- MySql指令的执行顺序
1:From 2:On 3:Join 4:Where 5:Group by 5.1:函数 6:Having 7:Select 8:Distinct 9:Order by
- js中split()和join()的用法
Split()方法:把一个字符串分割成字符串数组 如上所示:把字符串a按空格分隔,得3个字符串数组. 在如: var a=”hao are you” a.split(“”); 得到[h,a,o, ...
- ctf题目writeup(3)
题目地址: https://www.ichunqiu.com/battalion 1. 这个是个mp3,给的校验是为了下载下来的. 下来之后丢进audicity中 放大后根据那个音块的宽度来确定是 . ...
- 【Hadoop】配置环境-伪分布式
目录 1.Linux设置静态IP地址 2.修改主机名和映射文件 3.SSH免密码配置 4.Linux系统JDK的安装和配置 5.Hadoop伪分布式配置和测试 1.Linux设置静态IP地址 1.在L ...
- linux io 学习笔记(02)---条件变量,管道,信号
条件变量的工作原理:对当前不访问共享资源的任务,直接执行睡眠处理,如果此时需要某个任务访问资源,直接将该任务唤醒.条件变量类似异步通信,操作的核心:睡眠.唤醒. 1.pthread_cond_t 定 ...
- 局域网访问不到linux下的tomcat
问题描述: CentOS安装完成Tomcat后,访问本地:http://localhost:8080/正确.但局域网内无法访问,而且服务器可ping通 经查原因为防火墙开启: [root@localh ...
- 从PRISM开始学WPF(一)WPF-更新至Prism7.1
原文:从PRISM开始学WPF(一)WPF-更新至Prism7.1 我最近打算学习WPF ,在寻找MVVM框架的时候发现了PRISM,在此之前还从一些博客上了解了其他的MVVM框架,比如浅谈WPF中的 ...
- AWS安装CDH5.3-CentOS6.4
1.下载CM启动文件 [root@ip-172-31-23-107 ec2-user]# wget http://archive.cloudera.com/cm5/installer/latest/c ...