考虑不限制奇偶的情况,那就是直接排序取前k个的和。

加上奇偶限制:若排序后的前k个的和是偶数,则“显然地”:将其中的最小的奇数替换成未被选择的数中最大的偶数 或者 将其中的最小的偶数替换成未被选择的数中最大的奇数 是最优的。

那么排序之后 就可以预处理出 某个位置左侧最小的奇数、左侧最小的偶数、右侧最大的奇数、右侧最大的偶数,然后就可以O(1)地回答每个询问了。

开long long

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. #define N 1050001
  5. typedef long long ll;
  6. #define INF 2147483647
  7. int n,a[N],lminj[N],lmino[N],rmaxj[N],rmaxo[N],jnow=INF,onow=INF,m,k;
  8. ll sum[N];
  9. bool cmp(const int &a,const int &b){return a>b;}
  10. int main()
  11. {
  12. scanf("%d",&n);
  13. for(int i=;i<=n;i++) scanf("%d",&a[i]);
  14. sort(a+,a+n+,cmp);
  15. for(int i=;i<=n;i++) sum[i]=sum[i-]+(ll)a[i];
  16. for(int i=;i<=n;i++)
  17. {
  18. if(a[i]&) jnow=min(jnow,a[i]);
  19. else onow=min(onow,a[i]);
  20. lminj[i]=jnow; lmino[i]=onow;
  21. } jnow=onow=;
  22. for(int i=n-;i>=;i--)
  23. {
  24. if(a[i+]&) jnow=max(jnow,a[i+]);
  25. else onow=max(onow,a[i+]);
  26. rmaxj[i]=jnow; rmaxo[i]=onow;
  27. }
  28. scanf("%d",&m);
  29. for(int i=;i<=m;i++)
  30. {
  31. scanf("%d",&k);
  32. if(sum[k]&) printf("%lld\n",sum[k]);
  33. else
  34. {
  35. ll ans=-;
  36. if(lminj[k]!=INF&&rmaxo[k]!=) ans=max(ans,sum[k]-(ll)lminj[k]+(ll)rmaxo[k]);
  37. if(lmino[k]!=INF&&rmaxj[k]!=) ans=max(ans,sum[k]-(ll)lmino[k]+(ll)rmaxj[k]);
  38. printf("%lld\n",ans);
  39. }
  40. }
  41. return ;
  42. }

【贪心】bzoj3721 PA2014 Final Bazarek的更多相关文章

  1. bzoj3721 [PA2014 Final] Bazarek

    Description 有n件商品,选出其中的k个,要求它们的总价为奇数,求最大可能的总价. Input 第一行一个整数n(1<=n<=1000000),表示商品数量.接下来一行有n个整数 ...

  2. 【BZOJ3721】PA2014 Final Bazarek 贪心

    [BZOJ3721]PA2014 Final Bazarek Description 有n件商品,选出其中的k个,要求它们的总价为奇数,求最大可能的总价. Input 第一行一个整数n(1<=n ...

  3. 【BZOJ-3721】Final Bazarek 贪心

    3721: PA2014 Final Bazarek Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 610  Solved: 243[Submit][ ...

  4. BZOJ 3721: PA2014 Final Bazarek

    3721: PA2014 Final Bazarek Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 645  Solved: 261[Submit][ ...

  5. bzoj 3721: PA2014 Final Bazarek 贪心

    如果没有限制,直接取前 $k$ 大即可. 有限制,则只有几种可能:奇换偶,偶换奇. 维护奇数偶数的前缀最小值和后缀最大值即可. code: #include <bits/stdc++.h> ...

  6. BZOJ 3721: PA2014 Final Bazarek【乱搞】

    有n件商品,选出其中的k个,要求它们的总价为奇数,求最大可能的总价. Input 第一行一个整数n(1<=n<=1000000),表示商品数量.接下来一行有n个整数,表示每件商品的价格,范 ...

  7. 【BZOJ3727】PA2014 Final Zadanie 树形DP

    [BZOJ3727]PA2014 Final Zadanie Description 吉丽YY了一道神题,题面是这样的:“一棵n个点的树,每条边长度为1,第i个结点居住着a[i]个人.假设在i结点举行 ...

  8. 【BZOJ 3727】 3727: PA2014 Final Zadanie (递推)

    3727: PA2014 Final Zadanie Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 279  Solved: 121 Descript ...

  9. bzoj 3722: PA2014 Final Budowa

    3722: PA2014 Final Budowa Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 303  Solved: 108[Submit][St ...

随机推荐

  1. [hdu 4417]树状数组+离散化+离线处理

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 把数字离散化,一个查询拆成两个查询,每次查询一个前缀的和.主要问题是这个数组是静态的,如果带修改 ...

  2. 解决设置了background-size: cover; 但是图片在ios下显示不完整的问题

    设置 background-size: % 99.9%:

  3. Python基础(6)_函数

    一 为何要有函数? 不加区分地将所有功能的代码垒到一起,问题是: 代码可读性差 代码冗余 代码可扩展差 如何解决? 函数即工具,事先准备工具的过程是定义函数,拿来就用指的就是函数调用 结论:函数使用必 ...

  4. bzoj 2005 NOI 2010 能量采集

    我们发现对于一个点(x,y),与(0,0)连线上的点数是gcd(x,y)-1 那么这个点的答案就是2*gcd(x,y)-1,那么最后的答案就是所有点 的gcd值*2-n*m,那么问题转化成了求每个点的 ...

  5. LeetCode Regular Expression Matching 网上一个不错的实现(非递归)

    '.' Matches any single character.'*' Matches zero or more of the preceding element. The matching sho ...

  6. Linux内核中的GPIO系统之(3):pin controller driver代码分析--devm_kzalloc使用【转】

    转自:http://www.wowotech.net/linux_kenrel/pin-controller-driver.html 一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道 ...

  7. 利用git把本地项目传到github+将github中已有项目从本地上传更新

    利用git把本地项目传到github中 1.打开git bash命令行,进入到要上传的项目中,比如Spring项目,在此目录下执行git init 的命令,会发下在当前目录中多了一个.git的文件夹( ...

  8. Map占用内存大小评估

    public class test { private static java.util.HashMap<String, String> needQueryResProductList = ...

  9. 【C++】继承时构造函数和析构函数

    1. 顺序 先调用基类的构造函数,再调用派生类构造函数.析构顺序相反. 2. 构造函数 派生类 不用初始化列表调用基类构造函数->调用基类的默认构造函数 派生类 使用初始化列表调用基类带参构造函 ...

  10. 《Java编程思想》笔记 第九章 接口

    1.抽象类和抽象方法 抽象方法,仅有方法声明没有方法体 abstract class AbstractClass{ abstract void f(); //没有 {} } 只要有一个或者多个抽象方法 ...