【JZOJ 5409】【NOIP2017提高A组集训10.21】Fantasy
2017-10-22 08:13
477 查看
Description
Y sera 陷入了沉睡,幻境中它梦到一个长度为N 的序列{Ai}。对于这个序列的每一个子串,定义其幻境值为这个子串的和,现在Y sera 希望选择K 个不同的子串并使得这K 个子串的幻境值之和最大。
然而由于梦境中的种种限制,这些子串的长度必须在L 到R 之间。
你需要告诉她,最大的幻境值之和。
Solution1
先做一遍前缀和,对于每个位置i,它所对应的合法右端点的区间是[i+L-1,r+R-1],
我们先把每个位置对应的最优值和位置(now)处理出来,存到堆里面,
每次拿出一个最优值,计入答案,
那么,这个位置i所对应的位置now就不能把选了,
也就是说,这个位置现在能选的区间为[i+L-1,now-1]和[now+1,i+R-1],
那么就分别把这两个区间的最优值加到答案中即可,
Solution2
二分选的答案中的最小值,对于每个位置,计算它在当前mid下的贡献,也就是位置在[i+L-1,i+R-1]这个区间的,且sumj>=mid+sumj的,
这个用主席树即可,
Code
#include <cstdio> #include <algorithm> #include <cmath> #include <queue> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fod(i,a,b) for(int i=a;i>=b;i--) #define min(q,w) ((q)>(w)?(w):(q)) using namespace std; typedef long long LL; const int N=100500; int read(int &n) { char ch=' ';int q=0,w=1; for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar()); if(ch=='-')w=-1,ch=getchar(); for(;ch>='0' && ch<='9';ch=getchar())q=q*10+ch-48;n=q*w;return n; } int m,n,L,R; LL ans; LL a ; int lg ,er[19]; struct qwqw { int i,v; }rmq [19]; qwqw max(qwqw q,qwqw w){return q.v>w.v?q:w;} int max(int q,int w){return q<w?w:q;} struct qqww { int i,l,r,now,v; friend bool operator <(qqww q,qqww w) { return q.v<w.v; } }; priority_queue<qqww>d; qwqw RMQ(int l,int r){return max(rmq[l][lg[r-l+1]],rmq[r+1-er[lg[r-l+1]+1]][lg[r-l+1]]);} void JOIN(int i,int l,int r) { if(l>r)return; qwqw t=RMQ(l,r); qqww t1; t1.l=l;t1.r=r; t1.i=i; t1.v=t.v-a[i-1]; t1.now=t.i; d.push(t1); } int main() { freopen("fantasy.in","r",stdin); freopen("fantasy.out","w",stdout); int q,w; read(n),read(m),read(L),read(R); fo(i,1,n)a[i]=read(q),lg[i]=log2(i); er[1]=1;fo(i,2,18)er[i]=er[i-1]<<1; fo(i,1,n)rmq[i][0].v=(a[i]+=a[i-1]),rmq[i][0].i=i; fo(j,1,18)fo(i,1,n-er[j])rmq[i][j]=max(rmq[i][j-1],rmq[i+er[j]][j-1]); fo(i,1,n-L+1)JOIN(i,i+L-1,min(n,i+R-1)); fo(i,1,m) { if(d.empty())break; qqww t=d.top(); d.pop(); ans=ans+(LL)t.v; JOIN(t.i,t.l,t.now-1); JOIN(t.i,t.now+1,t.r); } printf("%lld\n",ans); return 0; }
相关文章推荐
- JZOJ 5409 【NOIP2017提高A组集训10.21】Fantasy
- JZOJ5409. 【NOIP2017提高A组集训10.21】Fantasy
- [JZOJ5439]【NOIP2017提高A组集训10.21】Fantasy
- JZOJ 5407. 【NOIP2017提高A组集训10.21】Deep
- JZOJ 5408 【NOIP2017提高A组集训10.21】Dark
- JZOJ 5407. 【NOIP2017提高A组集训10.21】Deep
- JZOJ 5408. 【NOIP2017提高A组集训10.21】Dark
- 【JZOJ5408】【NOIP2017提高A组集训10.21】Dark
- JZOJ5407. 【NOIP2017提高A组集训10.21】Deep
- JZOJ 5409【NOIP2017提高A组集训10.21】Fantasy(主席树版)
- 【JZOJ5411】【NOIP2017提高A组集训10.22】友谊
- JZOJ 5426. 【NOIP2017提高A组集训10.25】摘Galo
- JZOJ 5428. 【NOIP2017提高A组集训10.27】查询
- JZOJ5439. 【NOIP2017提高A组集训10.31】Calculate
- JZOJ 5414. 【NOIP2017提高A组集训10.22】幸运值
- JZOJ5415. 【NOIP2017提高A组集训10.22】公交运输
- 【JZOJ 5413】【NOIP2017提高A组集训10.22】清兰
- 【JZOJ5432】【NOIP2017提高A组集训10.28】三元组
- JZOJ 5410. 【NOIP2017提高A组集训10.22】小型耀斑
- JZOJ5415. 【NOIP2017提高A组集训10.22】公交运输 DP