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

题面

BZOJ

洛谷

题解

显然二分答案,算一下每个点至少要覆盖的次数。从左往右考虑如果这个点覆盖次数不够,就会选择覆盖这个点的、右端点最大的线段,拿个堆维护一下就好了。

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
#define MAX 200200
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,m,k,A,a[MAX],b[MAX],c[MAX];
vector<int> lk[MAX];
bool cmp(int a,int b){return a>b;}
bool check(int mid)
{
for(int i=1;i<=n;++i)b[i]=max(0,(mid-a[i]+A-1)/A);
for(int i=1;i<=n+1;++i)c[i]=0;
priority_queue<int> Q;int ans=0;
for(int i=1,t=0;i<=n;++i)
{
t+=c[i];
for(int j=0,l=lk[i].size();j<l;++j)Q.push(lk[i][j]);
while(!Q.empty()&&t<b[i])
{
if(Q.top()<i)return false;
t+=1,c[Q.top()+1]-=1,Q.pop(),++ans;
}
if(t<b[i]||ans>k)return false;
}
return true;
}
int main()
{
int T=read();
while(T--)
{
n=read();m=read();k=read();A=read();
for(int i=1;i<=n;++i)a[i]=read();
for(int i=1;i<=n;++i)lk[i].clear();
for(int i=1,l;i<=m;++i)l=read(),lk[l].push_back(read());
int l=0,r=1e9,ret=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid))l=mid+1,ret=mid;
else r=mid-1;
}
printf("%d\n",ret);
}
return 0;
}

【BZOJ5321】[JXOI2017]加法(贪心)的更多相关文章

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

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

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

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

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

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

  4. [bzoj5321] [Jxoi2017]加法

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

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

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

  6. 【[JXOI2017]加法】

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

  7. luogu P4064 [JXOI2017]加法

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

  8. JXOI2017 加法

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

  9. AHOI2018训练日程(3.10~4.12)

    (总计:共90题) 3.10~3.16:17题 3.17~3.23:6题 3.24~3.30:17题 3.31~4.6:21题 4.7~4.12:29题 ZJOI&&FJOI(6题) ...

随机推荐

  1. iOS 快速集成ijkplayer视频直播与录播框架

    最近由于需求的变动,项目内把最初最简单的原生直播框架变成了B站开源的ijkplayer框架,下面把具体的过程总结一下整个过程都比较简单,重要的是理解的过程,集成完毕之后,视频的用户体验比苹果原生好了很 ...

  2. 给input标签添加默认提示文字

    <input name="username" placeholder="请输入用户名" /> placeholder = "提示文字&qu ...

  3. 爱上linux 简单实现移动办公处理环境.

    1. 这周一直在鼓捣linux上面的环境测试. 简单的将 我们的产品部署到了linux上面 详情见前面的 blog 2. 有时候下班了 或者是 在WC (科技园wc排队 说多了都是泪) 或者是眼睛不舒 ...

  4. <转>Python中的新式/经典类的查找方式

    在学习到深度和广度的时候,懵了很久.后来看到这篇文章,恍然大悟.写的很好.特意转过来. 经典类: 只要有父类, 就会沿着一直找, 即使已经找过了~ 新式类: 在类继承的多个类拥有共同父类的情况下, 会 ...

  5. supervisor /var/run/supervisor/supervisor.sock not found 或者/tmp/supervisor.sock not found

    刚按装完supervisor,这时候用supervisorctr -c supervisor.conf 会报错: /var/run/supervisor/supervisor.sock not fou ...

  6. ABP实践学习

    一.

  7. const函数

    1. const修饰成员函数:表示不可以修改成员变量 class test{ public: test(){ i_ = ; } int Get() const{ //i_ = 0; //error:不 ...

  8. Zero to Build: Create new Xamarin apps in minutes with AppMap

    Creating a new Xamarin.Forms app can be an intimidating task, especially if you add in content pages ...

  9. Span<T>

    Introduction Span<T> is a new type we are adding to the platform to represent contiguous regio ...

  10. 给dom对象添加事件