[P4064][JXOI2017]加法(贪心+树状数组+堆)
题目描述
可怜有一个长度为 n 的正整数序列 A,但是她觉得 A 中的数字太小了,这让她很不开心。
于是她选择了 m 个区间 [li, ri] 和两个正整数 a, k。她打算从这 m 个区间里选出恰好 k 个区间,并对每个区间执行一次区间加 a 的操作。(每个区间最多只能选择一次。)
对区间 [l, r] 进行一次加 a 操作可以定义为对于所有 i ∈ [l, r],将 Ai 变成 Ai + k。现在可怜想要知道怎么选择区间才能让操作后的序列的最小值尽可能的大,即最大化min Ai
输入输出格式
输入格式:
第一行输入一个整数表示数据组数。
对于每组数据第一行输入四个整数 n, m, k, a。
第二行输入 n 个整数描述序列 A。
接下来 m 行每行两个整数 li, ri 描述每一个区间。数据保证所有区间两两不同。
输出格式:
对于每组数据输出一个整数表示操作后序列最小值的最大值。
输入输出样例
说明
选择给区间 [1, 1] 和 [1, 3] 加 1。
对于100%的数据,保证1≤n,m≤200,1\leq n,m \leq 200, 1≤n,m≤200, 1≤T≤2000,1≤k≤m,1≤a≤100,1≤Ai≤1081\leq T\leq 2000, 1 ≤ k ≤ m, 1 ≤ a ≤ 100, 1 ≤ A_i ≤ 10^81≤T≤2000,1≤k≤m,1≤a≤100,1≤Ai≤108
不要相信数据范围,应该是$1\leq n,m \leq 10^5$。
二分答案,贪心扫一遍,对于小于二分值的位置,用堆找到包含它且向右延伸最长的区间加上它,区间加用差分树状数组实现。
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
using namespace std; const int N=;
priority_queue<int>Q;
int T,n,m,k,A,q[N],a[N],c[N],stk[N];
struct P{ int l,r; }p[N];
bool cmp(P a,P b){ return a.l<b.l; }
void add(int x,int k){ for (; x<=n+; x+=x&-x) c[x]+=k; }
int que(int x){ int res=; for (; x; x-=x&-x) res+=c[x]; return res; } bool chk(int lim){
while (!Q.empty()) Q.pop();
memset(c,,sizeof(c)); int top=,j=,cnt=;
rep(i,,n) if (a[i]<lim) stk[++top]=i;
rep(i,,top){
while (j<=m && p[j].l<=stk[i]) Q.push(p[j].r),j++;
while (a[stk[i]]+que(stk[i])<lim){
cnt++; if (cnt>k || Q.empty()) return ;
int x=Q.top(); Q.pop(); add(stk[i],A); add(x+,-A);
}
}
return ;
} int main(){
freopen("P4064.in","r",stdin);
freopen("P4064.out","w",stdout);
for (scanf("%d",&T); T--; ){
scanf("%d%d%d%d",&n,&m,&k,&A);
rep(i,,n) scanf("%d",&a[i]);
rep(i,,m) scanf("%d%d",&p[i].l,&p[i].r);
sort(p+,p+m+,cmp);
int l=,r=,mid,ans;
while (l<=r){
mid=(l+r)>>;
if (chk(mid)) ans=mid,l=mid+; else r=mid-;
}
printf("%d\n",ans);
}
return ;
}
[P4064][JXOI2017]加法(贪心+树状数组+堆)的更多相关文章
- D 洛谷 P3602 Koishi Loves Segments [贪心 树状数组+堆]
题目描述 Koishi喜欢线段. 她的条线段都能表示成数轴上的某个闭区间.Koishi喜欢在把所有线段都放在数轴上,然后数出某些点被多少线段覆盖了. Flandre看她和线段玩得很起开心,就抛给她一个 ...
- 【bzoj4240】有趣的家庭菜园 贪心+树状数组
题目描述 对家庭菜园有兴趣的JOI君每年在自家的田地中种植一种叫做IOI草的植物.JOI君的田地沿东西方向被划分为N个区域,由西到东标号为1~N.IOI草一共有N株,每个区域种植着一株.在第i个区域种 ...
- codeforces 1249 D2 Too Many Segments (hard version) 贪心+树状数组
题意 给定n个线段,线段可以相交,第\(i\)个线段覆盖的区间为\([l_i,r_i]\),问最少删除多少个线段让覆盖每个点的线段数量小于等于k. 分析 从左往右扫每个点\(x\),若覆盖点\(x\) ...
- 贪心+树状数组维护一下 Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) D
http://codeforces.com/contest/724/problem/D 题目大意:给你一个串,从串中挑选字符,挑选是有条件的,按照这个条件所挑选出来的字符集合sort一定是最后选择当中 ...
- [BZOJ4240]有趣的家庭菜园(贪心+树状数组)
最后数列一定是单峰的,问题就是最小化最后的位置序列的逆序对数. 从大到小加数,每次贪心看放左边和右边哪个产生的逆序对数更少,树状数组即可. 由于大数放哪对小数不产生影响,所以正确性显然. 注意相同数之 ...
- [luoguP2672] 推销员(贪心 + 树状数组 + 优先队列)
传送门 贪心...蒟蒻证明不会... 每一次找最大的即可,找出一次最大的,数列会分为左右两边,左边用stl优先队列维护,右边用树状数组维护.. (线段树超时了....) 代码 #include < ...
- [JZO6401]:Time(贪心+树状数组)
题目描述 小$A$现在有一个长度为$n$的序列$\{x_i\}$,但是小$A$认为这个序列不够优美. 小$A$认为一个序列是优美的,当且仅当存在$k\in [1,n]$,满足:$$x_1\leqsla ...
- UVALive 6911---Double Swords(贪心+树状数组(或集合))
题目链接 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- 【HOJ2430】【贪心+树状数组】 Counting the algorithms
As most of the ACMers, wy's next target is algorithms, too. wy is clever, so he can learn most of th ...
随机推荐
- 【BZOJ】2190 [SDOI2008]仪仗队
[算法]欧拉函数 欧拉线性筛 [题解]将图从左至右,从下至上,分别标号0~n-1. 除了坐标0,一个点会被观察到当且仅当其坐标(i,j)的i与j互质,否则会被(i/d,j/d)挡住. 所以累加2~n- ...
- 【51NOD-0】1106 质数检测
[算法]数学 #include<cstdio> #include<cmath> bool ok(int x) { int m=(int)sqrt(x+0.5); ;i<= ...
- [bzoj3993][SDOI2015]星际战争-二分+最大流
Brief Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai. ...
- poj 2104 可持久化线段树
我们先离散化,然后根据权值建立线段树,假设我们现在有一颗权值线段树,表示在区间1-n中每个数出现了几次,那么我们可以二分的求出来这个区间的k大值,类似sbt的select操作,那么因为点的权值插入是无 ...
- ThinkSnS v4后台任意文件下载漏洞
漏洞文件: /apps/admin/Lib/Action/UpgradeAction.class.php 主要问题还是出现在了180行直接将远程获取到的图片直接保存. 文中可见并没有做任何的对$dow ...
- 日常开发技巧:在远程机器上直接使用adb
背景 嵌入式开发中,开发工作是在远程服务器上进行的.当需要adb推送一个文件到开发板时,则需要重新在本地机器中找到该文件,再执行命令.这样的操作比较麻烦. 下面介绍我的解决方式. sshfs挂载 首先 ...
- python实战===百度文字识别sdk
http://ai.baidu.com/docs#/OCR-Python-SDK/top
- 64_a1
AGReader-1.2-16.fc26.x86_64.rpm 13-Feb-2017 23:31 50654 ATpy-0.9.7-11.fc26.noarch.rpm 13-Feb-2017 22 ...
- interrupted()和isInterrupted()比较+终止线程的正确方法+暂停线程
interrupted():测试当前线程[运行此方法的当前线程]是否已经是中断状态,执行后具有将状态标志清除为false的功能. isInterrupted():测试线程对象是否已经是中断状态,但不清 ...
- jQuery -《锋利的jQuery》————读后小结
jQuery是一个优秀的javascript库. 我用的是vs2012自带的 jquery-1.8.2.js这个库,在Scripts这个文件夹下面 首先,我们使用jQuery要在head标签内引入j ...