3721: PA2014 Final Bazarek

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 645  Solved: 261
[Submit][Status][Discuss]

Description

有n件商品,选出其中的k个,要求它们的总价为奇数,求最大可能的总价。

Input

第一行一个整数n(1<=n<=1000000),表示商品数量。
接下来一行有n个整数,表示每件商品的价格,范围在[1,10^9]。
接下来一行有一个整数m(1<=m<=1000000),表示询问数量。
接下来m行,每行一个整数k[i](1<=k[i]<=n)。

Output

对于每个询问,输出一行表示保证奇数的情况下最大的总价。若无法满足要求,输出-1。

Sample Input

4
4 2 1 3
3
2
3
4

Sample Output

7
9
-1

HINT

 

Source

[Submit][Status][Discuss]

先对所有数字按照从大到小的顺序排序,然后维护前缀和,以及最小前缀(奇数/偶数),最大后缀(奇数/偶数)。

当询问K个的时候,如果sum[k]凑巧是个奇数,那么答案就是sum[k],否则就考虑用一个未添加的奇数换一个已添加的偶数,或是用一个未添加的偶数换一个已添加的奇数,二者取其大。

  1. #include <bits/stdc++.h>
  2.  
  3. template <class T>
  4. inline void read(T &x) {
  5. char c = getchar(); x = ;
  6. while (c < '')
  7. c = getchar();
  8. while (c >= '') {
  9. x = x* + c - '';
  10. c = getchar();
  11. }
  12. }
  13.  
  14. template <class T>
  15. inline T Max(const T &a, const T &b) {
  16. return a > b ? a : b;
  17. }
  18.  
  19. template <class T>
  20. inline T Min(const T &a, const T &b) {
  21. return a < b ? a : b;
  22. }
  23.  
  24. inline int cmp(const void *a, const void *b) {
  25. return - *(int *)a + *(int *)b;
  26. }
  27.  
  28. typedef long long longint;
  29.  
  30. const int inf = 2e9 + ;
  31.  
  32. const int siz = ;
  33.  
  34. int n, m;
  35. int num[siz];
  36. int min[siz][];
  37. int max[siz][];
  38. longint sum[siz];
  39.  
  40. inline void prework(void) {
  41. qsort(num + , n, sizeof(int), cmp);
  42.  
  43. memset(sum, , sizeof(sum));
  44.  
  45. for (int i = ; i < siz; ++i)
  46. min[i][] = min[i][] = inf,
  47. max[i][] = max[i][] = -inf;
  48.  
  49. for (int i = ; i <= n; ++i)
  50. sum[i] = sum[i - ] + num[i];
  51.  
  52. for (int i = ; i <= n; ++i) {
  53. int a = num[i] & , b = a ^ ;
  54. min[i][a] = num[i];
  55. min[i][b] = min[i - ][b];
  56. }
  57.  
  58. for (int i = n; i >= ; --i) {
  59. int a = num[i] & , b = a ^ ;
  60. max[i][a] = num[i];
  61. max[i][b] = max[i + ][b];
  62. }
  63. }
  64.  
  65. inline bool judge(int k) {
  66. return
  67. (min[k][] == inf || max[k + ][] == -inf)
  68. && (min[k][] == inf || max[k + ][] == -inf);
  69. }
  70.  
  71. inline void query(int k) {
  72. if (sum[k] & )
  73. printf("%lld\n", sum[k]);
  74. else if (judge(k))puts("-1");
  75. else printf("%lld\n",
  76. sum[k] + Max(
  77. - min[k][] + max[k + ][],
  78. - min[k][] + max[k + ][])
  79. );
  80. }
  81.  
  82. signed main(void) {
  83. read(n);
  84.  
  85. for (int i = ; i <= n; ++i)
  86. read(num[i]);
  87.  
  88. prework();
  89.  
  90. read(m);
  91.  
  92. for (int i = , k; i <= m; ++i)
  93. read(k), query(k);
  94. }

@Author: YouSiki

BZOJ 3721: PA2014 Final Bazarek的更多相关文章

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

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

  2. bzoj 3721: PA2014 Final Bazarek 贪心

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

  3. 【BZOJ3721】PA2014 Final Bazarek 贪心

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

  4. bzoj 3722: PA2014 Final Budowa

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

  5. bzoj3721 [PA2014 Final] Bazarek

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

  6. 【贪心】bzoj3721 PA2014 Final Bazarek

    考虑不限制奇偶的情况,那就是直接排序取前k个的和. 加上奇偶限制:若排序后的前k个的和是偶数,则“显然地”:将其中的最小的奇数替换成未被选择的数中最大的偶数 或者 将其中的最小的偶数替换成未被选择的数 ...

  7. BZOJ 3727 PA2014 Final Zadanie 树形DP

    题目大意:给定一棵树,令一个点到全部点的距离与点权的乘积之和为b[i].求每一个点的权值a[i] 首先假设给定a[i]我们能够非常轻松的求出b[i] 可是反过来怎么搞?高斯消元?30W? 考虑已知a[ ...

  8. BZOJ[3728]PA2014 Final Zarowki

    有n个房间和n盏灯,你需要在每个房间里放入一盏灯.每盏灯都有一定功率,每间房间都需要不少于一定功率的灯泡才可以完全照亮. 你可以去附近的商店换新灯泡,商店里所有正整数功率的灯泡都有售.但由于背包空间有 ...

  9. 【BZOJ-3721】Final Bazarek 贪心

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

随机推荐

  1. BZOJ 2724: [Violet 6]蒲公英

    2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1633  Solved: 563[Submit][Status ...

  2. C# Math类简介

    Math.abs() 计算绝对值. Math.acos() 计算反余弦值. Math.asin() 计算反正弦值. Math.atan() 计算反正切值. Math.atan2() 计算从x 坐标轴到 ...

  3. springmvc请求参数异常处理

    接着上一篇<springmvc 通过异常增强返回给客户端统一格式>讲通过spring ControllerAdvice对各种异常进行拦截处理,统一格式返回给客户端. 接下来我们更精细的讲, ...

  4. 让python在hadoop上跑起来

    duang~好久没有更新博客啦,原因很简单,实习啦-好吧,我过来这边上班表示觉得自己简直弱爆了.第一周,配置环境:第二周,将数据可视化,包括学习了excel2013的一些高大上的技能,例如数据透视表和 ...

  5. 重建中国.NET生态系统

    Neuzilla官方微信公众号:搜 架构师联盟 或 neuzilla 我是.NET铁杆粉丝,所以如果你要在评论里跟我撕逼.NET怎么怎么烂,Java.C++.PHP.JavaScript怎么怎么好,我 ...

  6. sprintf_s的教训

    sprintf_s 是个比sprintf更安全的函数,今天在使用的过程中犯了个错误,代码的大致意思如下 void Test_sprintf_s() { ]; memset(buff, , sizeof ...

  7. spring+mybaties+springMvc+slf4j所需jar包

  8. C# Rotating Oval

    This program is used to show how to generate an oval. The moon's orbit around the sun is an oval two ...

  9. git工作流程

    git工作流程 一般工作流程如下: 克隆 Git 资源作为工作目录. 在克隆的资源上添加或修改文件. 如果其他人修改了,你可以更新资源. 在提交前查看修改. 提交修改. 在修改完成后,如果发现错误,可 ...

  10. tttttabs

    <div id="fil-page" class="fil-page"> <div class="fil-container&quo ...