首先求出区间前$k$大数中奇数的个数和偶数的个数。

如果都是偶数,那么答案就是前$k$大数的和。

否则,要么去掉最小的偶数,加上最大的奇数,要么去掉最小的奇数,加上最大的偶数。

主席树维护即可。

时间复杂度$O((n+m)\log n)$。

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=300010,M=6000000;
int n,m,i,x,y,k,a[N],b[N],tot,T[N],l[M],r[M],vc[M][2],c[2];long long v[M],sum,ans;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline int lower(int x){
int l=1,r=n,mid,t;
while(l<=r)if(b[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
return t;
}
int ins(int x,int a,int b,int c,int d){
int y=++tot;
vc[y][0]=vc[x][0],vc[y][1]=vc[x][1];
vc[y][d&1]++,v[y]=v[x]+d;
if(a==b)return y;
int mid=(a+b)>>1;
if(c<=mid)l[y]=ins(l[x],a,mid,c,d),r[y]=r[x];else l[y]=l[x],r[y]=ins(r[x],mid+1,b,c,d);
return y;
}
inline void ask(int x,int y,int k){
int a=1,b=n,mid,t;
c[0]=c[1]=sum=0;
while(a<b){
mid=(a+b)>>1,t=vc[r[x]][0]+vc[r[x]][1]-vc[r[y]][0]-vc[r[y]][1];
if(k<=t)a=mid+1,x=r[x],y=r[y];
else{
k-=t;
c[0]+=vc[r[x]][0]-vc[r[y]][0];
c[1]+=vc[r[x]][1]-vc[r[y]][1];
sum+=v[r[x]]-v[r[y]];
b=mid,x=l[x],y=l[y];
}
}
c[::b[a]&1]+=k,sum+=1LL*::b[a]*k;
}
inline int kth(int x,int y,int k,int p){
int a=1,b=n,mid,t;
while(a<b){
mid=(a+b)>>1,t=vc[r[x]][p]-vc[r[y]][p];
if(k<=t)a=mid+1,x=r[x],y=r[y];else k-=t,b=mid,x=l[x],y=l[y];
}
return ::b[a];
}
int main(){
for(read(n),i=1;i<=n;i++)read(a[i]),b[i]=a[i];
for(sort(b+1,b+n+1),i=1;i<=n;i++)T[i]=ins(T[i-1],1,n,lower(a[i]),a[i]);
read(m);
while(m--){
read(x),read(y),read(k);
if(k>y-x+1){puts("-1");continue;}
ask(T[y],T[x-1],k);
if(c[0]%2==0){printf("%lld\n",sum);continue;}
for(ans=-1,i=0;i<2;i++)
if(c[i]&&c[i^1]<vc[T[y]][i^1]-vc[T[x-1]][i^1])
ans=max(ans,sum-kth(T[y],T[x-1],c[i],i)+kth(T[y],T[x-1],c[i^1]+1,i^1));
printf("%lld\n",ans);
}
return 0;
}

  

BZOJ4209 : 西瓜王的更多相关文章

  1. BZOJ:4209: 西瓜王

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4209 (虽然仅仅是看在名字的份上,我们还是得说这题是一道) 绝世好题!西瓜王!西瓜王!西瓜 ...

  2. bzoj AC倒序

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

  3. NYIST 1006 偷西瓜

    偷西瓜 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 对于农村的孩子来说最大的乐趣,莫过于和小伙伴们一块下地偷西瓜了,虽然孩子们条件不是很好,但是往往他们很聪明,他 ...

  4. BZOJ 4008 【HNOI2015】 亚瑟王

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

  5. Bzoj4008 [HNOI2015]亚瑟王

    Time Limit: 20 Sec  Memory Limit: 512 MBSec  Special Judge Submit: 1009  Solved: 605[Submit][Status] ...

  6. C语言与java 20155317 王新玮第二次

    20155317 王新玮第二次写作感想   你有什么技能比大多数人(超过90%以上)更好? 刚刚看到这个题目,我的首先想到的是会一些中医,懂得中医的理论框架知识,懂得大部分的中医脉象,能够解决日常生活 ...

  7. (转)为什么需要正则表达式 by 王珢

    为什么需要正则表达式 by 王垠 学习Unix最开头,大家都学过正则表达式(regexp).可是有没有人考虑过我们为什么需要正则表达式? 正则表达式本来的初衷是用来从无结构的字符串中提取信息,殊不知这 ...

  8. (转)什么是“黑客” by 王珢

    什么是“黑客” by 王垠很多程序员自豪的把自己叫做“黑客”(hacker),把编程叫做 hack.可是殊不知,其实在最高级的程序员眼里,“黑客”其实是一个贬义词.他们更愿意被叫做“程序员”(prog ...

  9. (转)对博士学位说永别 by 王珢

    对博士学位说永别 by 王垠 经过深思熟虑之后,我决定再次“抛弃”我的博士学位.这是我第三次决定离开博士学位,也应该是最后一次了.这应该不是什么惊人的消息,因为我虽然读博士10年了,可是我的目标从来就 ...

随机推荐

  1. securecrt 用心跳保持连接

    选项->会话->终端->发送协议NO-OP(P)

  2. WCF分布式开发必备知识(3):Web Service 使用

    参考地址:http://www.cnblogs.com/zhili/p/WebService.html 一.WebService概述 SOAP.WSDL.UDDISOAP(Simple Object ...

  3. 【PHP&&FileIO】

    在程序员的眼中,文件不应当仅仅是一部电影.一首歌曲.一个pdf文件,它应该被视为一个文件夹,而我们所熟知的文件,应当是它的特例. 在web开发中,文件的上传和下载是文件变成的一个实际应用. 延续cru ...

  4. html5 基本布局+新标签+新选择器 + 线性渐变

    html5 基本布局+新标签 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  5. C#DataGridView合计处理

    网上查了一些关于合计的代码 ,但发现大都都不尽人意,就自己再根据资料改了一下. #region 合计 //调用方法示例 //HeJi heji = null; //heji = new HeJi(la ...

  6. jquery判断当前设备是手机还是电脑并跳转

    <script type="text/javascript"> var commonURL = 'http://xxxx.com/'; function mobile_ ...

  7. PMP 第九章 项目人力资源管理

    1制定人力资源计划 2组建项目团队 3建设项目团队 4管理项目团队 1.规划人力资源管理的作用是什么?组织图和职位描述的表现形式有哪些?RAM和RACI的关系是什么?人力资源管理计划的内容有哪些? 人 ...

  8. WCF服务寄宿应用程序

    1.先创建一个WCF服务库 2.创建一个Console控制台,服务将寄宿在该应用程序上,该程序一旦关闭,服务将停止. 控制台代码: using System; using System.Collect ...

  9. 《数据结构与算法分析》学习笔记(三)——链表ADT

    今天简单学习了下链表,待后续,会附上一些简单经典的题目的解析作为学习的巩固 首先要了解链表,链表其实就是由一个个结点构成的,然后每一个结点含有一个数据域和一个指针域,数据域用来存放数据,而指针域则用来 ...

  10. cocos2dx游戏开发——微信打飞机学习笔记(二)——游戏框架

    一.游戏的基本框架: WelcomeScene    ——>    GameScene   ——>   GameOverScene ||                           ...