【贪心+堆+树状数组】JXOI2017[加法]题解
来源:互联网 发布:ei数据库免费检索入口 编辑:程序博客网 时间:2024/06/17 09:03
题目概述
有一个序列
解题报告
由于是求最小值的最大值,所以我们想到二分答案
那么接下来我们要做的就是验证是否能用
示例程序
2017.8.15Update:由于代码有些小技巧,加了点注释。
#include<cstdio>#include<algorithm>using namespace std;#define Fir first#define Sec secondconst int maxn=200000,maxm=200000;int te,n,m,K,A,a[maxn+5];pair<int,int> S[maxm+5];inline bool Eoln(char ch) {return ch==10||ch==13||ch==EOF;}inline char readc(){ static char buf[100000],*l=buf,*r=buf; if (l==r) r=(l=buf)+fread(buf,1,100000,stdin); if (l==r) return EOF; else return *l++;}inline int readi(int &x){ int tot=0,f=1;char ch=readc(),lst='+'; while ('9'<ch||ch<'0') {if (ch==EOF) return EOF;lst=ch;ch=readc();} if (lst=='-') f=-f; while ('0'<=ch&&ch<='9') tot=(tot<<3)+(tot<<1)+ch-48,ch=readc(); return x=tot*f,Eoln(ch);}int c[maxn+5];void Update(int x,int tem) {for (int p=x;p<=n;p+=p&-p) c[p]+=tem;}int Sum(int x) {int sum=0;for (int p=x;p;p-=p&-p) sum+=c[p];return sum;}int si,Heap[maxn+5];bool check(int MIN){ si=0;for (int i=1;i<=n;i++) c[i]=0; for (int i=1,j=1,k=K;i<=n;i++) { if (MIN-a[i]<=0) continue;int ti=(MIN-a[i]-1)/A+1-Sum(n-i+1);if (ti<=0) continue; //树状数组求后缀和:把位置取反,转化为前缀和 while (j<=m&&S[j].Fir<=i) Heap[++si]=S[j].Sec,push_heap(Heap+1,Heap+1+si),j++; //push_heap和手写的效果是一样的,听说在开O2的情况下跑得比手写快 //push_heap(begin,end)表示将begin到end调整为大根堆(要保证begin到end-1是大根堆) while (si&&k&&ti&&Heap[1]>=i) { Update(n-Heap[1]+1,1);pop_heap(Heap+1,Heap+1+si); si--;k--;ti--; } //pop_heap同理 if (ti) return false; } return true;}int main(){ freopen("add.in","r",stdin); freopen("add.out","w",stdout); for (readi(te);te;te--) { readi(n);readi(m);readi(K);readi(A); int L=1,R=0; for (int i=1;i<=n;i++) readi(a[i]),R=max(R,a[i]); for (int i=1,x,y;i<=m;i++) { readi(x);readi(y);if (x>y) swap(x,y); S[i]=make_pair(x,y); } sort(S+1,S+1+m);R+=A*K; while (L<=R) { int mid=L+(R-L>>1); if (check(mid)) L=mid+1; else R=mid-1; } printf("%d\n",L-1); } return 0;}
阅读全文
0 0
- 【贪心+堆+树状数组】JXOI2017[加法]题解
- 【DP+树状数组 or 贪心】Codeforces527D[Clique Problem]题解
- 【ZJOI2017】树状数组 题解
- 【树状数组】cal 题解
- 贪心用树状数组优化
- poj1201(贪心+树状数组)
- 【贪心+堆】BZOJ1029(JSOI2007)[建筑抢修]题解
- 【贪心+堆】Codeforces725D[Contest Balloons]题解
- 【树状数组套树状数组】BZOJ1452(JSOI2009)[Count]题解
- 【POJ】【P3321】【Apple Tree】【题解】【树状数组】
- 【POJ】【P2352】【Stars】【题解】【树状数组】
- HDU 1166 敌兵布阵 树状数组题解
- 【BZOJ】【P3155】【Preprefix sum】【题解】【树状数组】
- 【BZOJ】【P3813】【奇数国】【题解】【树状数组】
- 【HDU5775】【树状数组】Bubble Sort 题解
- (CF792 ABCD题解) 模拟,树状数组
- BZOJ 3155: Preprefix sum 树状数组题解
- 【BZOJ2789】【树状数组】[Poi2012]Letters 题解
- Linux分页机制
- Java反射机制详解
- 在Java中使用正则表达式
- 2017年8月14日训练日记
- hdu 2087 剪花布条【KMP】
- 【贪心+堆+树状数组】JXOI2017[加法]题解
- Udacity深度学习(google)笔记(1)——notmnist
- Java工具包
- Longest Ordered Subsequence
- NLP with Deep Learning Lecture 2 笔记
- 远程来电流程分析---之二
- 笨办法学 Python · 续 练习 39:SQL 创建
- Spring-Service-事务中线程异常执行事务回滚的方式
- VC实现的全局键盘钩子