江西竟然还有省选,而且还是可怜题,实在是有点可怕

这道题还是比较清真的,大概是最简单的可怜题?

首先看到最大值最小,就很容易想到了二分答案

对于一个二分出来的答案\(mid\),去把原数列扫一遍就可以得到每一个位置至少要被覆盖几次

现在的问题变成了从\(m\)个区间里选择最少的区间,使得每一个位置都至少被覆盖给定的次数

现在就变成一个贪心问题了

先把所有区间按照左端点排好序,之后开一根扫描线扫过去,扫的过程中开一个堆,用来存储所有被扫描线扫到过左端点的区间

假如我们扫描线扫到一个位置\(i\),且\(i\)之前的位置都已经被覆盖了,那么显然这个时候我们需要从堆里找到之前的那些能覆盖到\(i\)的区间来覆盖掉\(i\),那么自然是优先选择那些右端点更靠右的区间,它们能覆盖到更多的点

同时覆盖的过程中需要一个区间加,单点查的数据结构,自然选择树状数组了

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<cmath>
#include<algorithm>
#define LL long long
#define lowbit(x) ((x)&(-x))
#define re register
#define maxn 100005
#define mp std::make_pair
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
int a[maxn],c[maxn];
struct Seg
{
int l,r;
}b[maxn];
int n,m,K,D,T;
int pre[maxn],d[maxn];
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
inline int cmp(Seg A,Seg B)
{
return A.l<B.l;
}
inline void add(int x,int val)
{
for(re int i=x;i<=n;i+=lowbit(i)) c[i]+=val;
}
inline int ask(int x)
{
int now=0;
for(re int i=x;i;i-=lowbit(i)) now+=c[i];
return now;
}
typedef std::pair<int,int> pii;
std::priority_queue<pii> q;
inline int check(int x)
{
memset(d,0,sizeof(d));
for(re int i=1;i<=n;i++)
{
if(a[i]<x) d[i]=ceil(double(x-a[i])/double(D));
if(d[i]>pre[i]) return 0;
}
memset(c,0,sizeof(c));
while(!q.empty()) q.pop();
int now=1,tot=0;
for(re int i=1;i<=n;i++)
{
while(b[now].l==i) q.push(mp(b[now].r,b[now].l)),now++;
if(!d[i]) continue;
int cnt=ask(i);
if(cnt>=d[i]) continue;
while(!q.empty())
{
pii mid=q.top();
q.pop();
if(mid.first>=i) add(mid.second,1),add(mid.first+1,-1),cnt++,tot++;
if(cnt==d[i]) break;
}
if(cnt<d[i]) return 0;
}
return tot<=K;
}
int main()
{
T=read();
while(T--)
{
n=read(),m=read(),K=read(),D=read();
memset(pre,0,sizeof(pre)),memset(b,0,sizeof(b));
for(re int i=1;i<=n;i++) a[i]=read();
for(re int i=1;i<=m;i++) b[i].l=read(),b[i].r=read(),pre[b[i].l]++,pre[b[i].r+1]--;
for(re int i=1;i<=n;i++) pre[i]+=pre[i-1];
std::sort(b+1,b+m+1,cmp);
int L=999999999,R;
for(re int i=1;i<=n;i++)
L=min(L,a[i]);
R=L+D*K;
int ans=0;
while(L<=R)
{
int mid=L+R>>1;
if(check(mid)) ans=mid,L=mid+1;
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. BZOJ5321 & 洛谷4064 & LOJ2274:[JXOI2017]加法——题解

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

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

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

  7. luogu P4064 [JXOI2017]加法

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

  8. JXOI2017 加法

    题目描述: 可怜有一个长度为 \(n\) 的正整数序列 \(A\),但是她觉得 \(A\) 中的数字太小了,这让她很不开心. 于是她选择了 \(m\) 个区间 \([l_i, r_i]\) 和两个正整 ...

  9. jxoi2017

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

随机推荐

  1. Java中用双缓冲技术消除闪烁

    在Java编写具有连贯变化的窗口程序时,通常的办法是在子类中覆盖父类的paint(Graphics)方法,在方法中使用GUI函数实现窗口重绘的过程.连贯变换的窗口会不断地调用update(Graphi ...

  2. [Linux]C语言Linux系统编程创建进程

    1.进程ID 每一个进程都由一个唯一的标识符表示,即进程ID,简称pid.系统保证在某时刻每个pid都是唯一的. 1.1分配进程ID 缺省情况下,内核将进程ID的最大值限制为32768,可以在此处设置 ...

  3. Java学习网址

    JAVA学习记录均参考自爱慕课网址: 爱慕课:http://www.imooc.com/course/list?c=java

  4. tensorflow(一):图片处理

    一.图片处理 1.图片存取 tf.gfile import tensorflow as tf import matplotlib.pyplot as plt image_bytes = tf.gfil ...

  5. thinkphp点击导航变色

    1.从该处进入导航页面,点击分贝进入点击的页面. 2.点击1处进入对应的导航栏,导航栏变色. 3.在1图图片点击跳转是给地址添加参数status. 4.在后台IndexController.class ...

  6. python学习之老男孩python全栈第九期_day020知识点总结——序列化模块、模块的导入和使用

    一. 序列化模块 # 序列化 --> 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化# 反序列化 --> 从字符串转换成数据类型的过程叫做反序列化# 序列 -- 字符串 # 什 ...

  7. 51NOD1965:奇怪的式子

    传送门 拆开变成 \[\prod_{i=1}^{n}\sigma_0(i)^{\mu(i)}\prod_{i=1}^{n}\sigma_0(i)^{i}\] 考虑 \(\prod_{i=1}^{n}\ ...

  8. ZJOI2012 网络——LCT相关题目

    有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构成的环. 在这个图上,你 ...

  9. JavaScript的进阶之路(六)理解函数

    函数:定义一次,多次调用:用于对象的属性则称为对象的方法:在JavaScript中,函数即对象:嵌套的函数形成闭包: 定义函数和简单调用函数: //函数定义 function f1(){ //没有参数 ...

  10. HTTP(S)网络框架的设计

    0.麻烦 操作系统提供的网络接口都会令人不爽,要么太接近底层而使用不便,要么层次过高又不提供底层点的接口供设置参数.但是我们不能期望系统API做得很高级,因为没有绝对合适的网络库,必须定制化从而达到适 ...