原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4209

(虽然仅仅是看在名字的份上,我们还是得说这题是一道)

绝世好题!西瓜王!西瓜王!西瓜王![wàng]

说点正经的,一开始以为合成圣堂的时候必须相邻的,然后变成了区间内取k个数不能相邻的数的最大总价值,诶我的瓜妈妈呀,不会做啊……

看一下CA爷blog:贪心,然后替换……

诶,我看错题了?

最后就是主席树维护一下区间前k大的总价值,再查一下这最大的k个里面有多少个奇数多少偶数,如果奇数数量是奇数的话(好拗口)那就再查一下在前k大的数中最小的奇数和偶数,不在前k大中最大奇数和偶数,然后替换一下就吼了啊。。。

卡常卡不过啊T_T

#include<cstdio>
#include<algorithm>
#define MN 300001
#define ll long long
using namespace std; char ibuf[],*iptr=ibuf-,C;
inline int _(){
int x=,c=*++iptr;
while(c<)c=*++iptr;
while(c>)x=x*+c-,c=*++iptr;
return x;
}
char obuf[],*optr=obuf;
inline void _(ll x){
static int stk[],stp=;
if (x<) *(optr++)='-',x=-x;
if(!x)stk[stp++]=;
while(x)stk[stp++]=x%,x/=;
while(stp)*(optr++)=stk[--stp]+;
*(optr++)=;
}
struct tree{int l,r,s[],S;ll al;}t[MN*];
int n,m,a[MN],num=,l,r,k,s[],S[MN][],ro[MN],mi,ma;
ll mmh,c;
inline ll min(ll a,ll b){return a<b?a:b;}
inline ll max(ll a,ll b){return a>b?a:b;}
void in(int &P,int x,int v){
int l=mi,r=ma,mid,*p;p=&P;
for (;;){
*p=++num;t[*p]=t[x];t[*p].s[v&]++;t[*p].S++;t[*p].al+=v;
if (l==r) break;
int mid=l+r>>;
if (v<=mid) p=&t[*p].l,x=t[x].l,r=mid;else p=&t[*p].r,x=t[x].r,l=mid+;
}
}
void ask(int p,int x,int l,int r,int k){
while (l<r){
if (k>=t[t[p].r].S-t[t[x].r].S) s[]+=t[t[p].r].s[]-t[t[x].r].s[],s[]+=t[t[p].r].s[]-t[t[x].r].s[],
mmh+=t[t[p].r].al-t[t[x].r].al,k-=t[t[p].r].S-t[t[x].r].S,p=t[p].l,x=t[x].l,r=l+r>>;else p=t[p].r,x=t[x].r,l=(l+r>>)+;
if (k==) return;
}
if (k) mmh+=1LL*k*l,s[l&]+=k;
}
ll askmax(int p,int x,int k,bool bo){
if (t[p].s[bo]-t[x].s[bo]<=k) return -1e18;
int l=mi,r=ma;
while (l<r)
if (t[t[p].r].s[bo]-t[t[x].r].s[bo]>k) p=t[p].r,x=t[x].r,l=(l+r>>)+;else k-=t[t[p].r].s[bo]-t[t[x].r].s[bo],p=t[p].l,x=t[x].l,r=l+r>>;
return l;
}
ll askmin(int p,int x,int k,bool bo){
if (t[p].s[bo]-t[x].s[bo]<k) return 1e18;
int l=mi,r=ma;
while (l<r)
if (t[t[p].r].s[bo]-t[t[x].r].s[bo]>=k) p=t[p].r,x=t[x].r,l=(l+r>>)+;else k-=t[t[p].r].s[bo]-t[t[x].r].s[bo],p=t[p].l,x=t[x].l,r=l+r>>;
return l;
}
int main(){
ibuf[fread(ibuf,,,stdin)]=;
register int i;
n=_();t[].l=t[].r=t[].s[]=t[].s[]=t[].al=t[].S=;
for (i=;i<=n;i++) a[i]=_(),S[i][]=S[i-][],S[i][]=S[i-][],S[i][a[i]&]++,mi=min(mi,a[i]),ma=max(ma,a[i]);
for (i=;i<=n;i++) in(ro[i],ro[i-],a[i]);
m=_();
while (m--){
l=_();r=_();k=_();
if ((S[r][]-S[l-][]>>)+(S[r][]-S[l-][]>>)<(k>>)){_(-);continue;}
mmh=s[]=s[]=;ask(ro[r],ro[l-],mi,ma,k);
if (s[]&) mmh-=min(askmin(ro[r],ro[l-],s[],)-askmax(ro[r],ro[l-],s[],),askmin(ro[r],ro[l-],s[],)-askmax(ro[r],ro[l-],s[],));
_(mmh);
}
fwrite(obuf,,optr-obuf,stdout);
return ;
}

BZOJ:4209: 西瓜王的更多相关文章

  1. bzoj 4008 亚瑟王 - 动态规划 - 概率与期望

    Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...

  2. BZOJ 4008 亚瑟王

    Description 小K不慎被LL邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个看脸的游 ...

  3. bzoj[HNOI2015]亚瑟王 - 递推与动规 - 概率与期望

    [bzoj4008][HNOI2015]亚瑟王 2015年4月22日3,2991 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之 ...

  4. BZOJ4209 : 西瓜王

    首先求出区间前$k$大数中奇数的个数和偶数的个数. 如果都是偶数,那么答案就是前$k$大数的和. 否则,要么去掉最小的偶数,加上最大的奇数,要么去掉最小的奇数,加上最大的偶数. 主席树维护即可. 时间 ...

  5. bzoj 4008 亚瑟王 期望概率dp

    对于这种看起来就比较傻逼麻烦的题,最关键的就是想怎么巧妙的设置状态数组,使转移尽可能的简洁. 一开始我想的是f[i][j]表示到第j轮第i张牌还没有被选的概率,后来发现转移起来特别坑爹,还会有重的或漏 ...

  6. BZOJ [HNOI2015]亚瑟王 ——期望DP

    发现每张卡牌最后起到作用只和是否打出去了有关. 而且每张牌打出去的概率和之前的牌打出去的情况有关. 所以我们按照牌的顺序进行DP. 然后记录$i$张牌中打出$j$张的概率,然后顺便统计答案. 直接对系 ...

  7. BZOJ 4008 亚瑟王(概率DP 奥妙重重)

    题意 中文题面,就不解释了 分析 显然这道题直接求期望太麻烦,想想转化问题(这转化太神了). 定义f(i,j)f(i,j)f(i,j)表示第iii张卡总共被经过jjj次的概率,有转移方程式 f(i,j ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. BZOJ 4008 【HNOI2015】 亚瑟王

    题目链接:亚瑟王 这道题好神啊TAT--果然我的dp还是太弱了-- 一开始想了半天的直接dp求期望,结果最后WA的不知所云-- 最后去翻了题解,然后发现先算概率,再求期望--新姿势\(get\). 我 ...

随机推荐

  1. Mac 终端—不同文件不同颜色显示,提示文字

    原文地址 修改Mac终端(Terminal)里不同类型文件的显示颜色 修改Mac终端(Terminal)的提示文字 Mac终端显示/隐藏文件命令 1. 修改Mac终端(Terminal)里不同类型文件 ...

  2. 530. Minimum Absolute Difference in BST

    Given a binary search tree with non-negative values, find the minimum absolute difference between va ...

  3. ES6 字符串的扩展

    字符的Unicode表示法 JavaScript允许采用\uXXXX形式表示一公分字符,其中XXXX表示字符的码点. "\u0061" //"a" 但是,这种表 ...

  4. uptime 命令详解

    作用: 打印系统总共运行了多长时间和系统的平均负载. uptime 命令可以显示的信息依次为:  现在时间, 系统已经运行时间, 目前登录用户个数, 系统1,5,15 分钟内的平均负载 实例:  up ...

  5. c语言中的转义序列

    c中的输出函数printf()可以带以下的转义序列,不同的转义序列会得到不同的结果. 1.\a:警报 2.\b:退格(光标回退一格)3.\f:换页4.\n:换行(光标去到下一行的起始处)5.\r:回车 ...

  6. js、jQuery、layer实现弹出层的打开、关闭

    打开layer layer.open({ type: 2, title: '新增收货地址', shadeClose: true,//点击阴影关闭 shade: 0.8, area: ['900px', ...

  7. Ajax异步提交登录(2)--登录使用

    http://cjp1989.iteye.com/blog/1740964 1.Ajax的原理: Ajax的原理就是:通过javascript的方式,将前台数据通过xmlhttp对象传递到后台,后台在 ...

  8. primer漏配问题解决

    在对之前的ITS数据(454数据)做split时,发现有一些reads没有被匹配上,但是barcode能够完全匹配,虽然之后的primer在中间漏了一个碱基,导致后面的碱基全部误匹配,从而导致这条re ...

  9. View学习(四)-View的绘制(draw)过程

    View的draw过程相比之于measrue过程,也是比较简单的.并且在我们自定义View时,也经常需要重写onDraw方法,来绘制出我们要实现的效果. 如之前的文章所说,绘制的流程也是起始于View ...

  10. Python的locals()函数

    Python的locals()函数会以dict类型返回当前位置的全部局部变量. 示例代码: def func(): arg_a, arg_b = 'a', 'b' def func_a(): pass ...