bzoj 3721 Final Bazarek
2024-08-26 20:11:13
题目大意:
n个数 选k个使和为奇数且最大
思路:
可以先将这n个数排序
然后先去最大的k个数 若和为奇数则直接输出
为偶数可以用没选的最大的奇数替换选了的最小的偶数或用没选的最大的偶数替换选了的最小的奇数
预处理出4个数组即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#define ll long long
#define inf 2139062143
#define MAXN 1001000
using namespace std;
inline ll read()
{
ll x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) x=x*+ch-'',ch=getchar();
return x*f;
}
ll n,a[MAXN],T,sum[MAXN],mn[MAXN][],mx[MAXN][];
int main()
{
n=read();ll x,res;
for(ll i=;i<=n;i++) a[i]=read();
sort(a+,a+n+);
for(ll i=;i<=n;i++) sum[i]=sum[i-]+a[i];
for(ll i=;i<=n;i++) mx[i][a[i]&]=a[i],mx[i][(a[i]&)^]=mx[i-][(a[i]&)^];
mn[n+][]=mn[n+][]=inf;
for(ll i=n;i>=;i--) mn[i][a[i]&]=a[i],mn[i][(a[i]&)^]=mn[i+][(a[i]&)^];
T=read();
while(T--)
{
x=read();
res=sum[n]-sum[n-x];
if(res&) {printf("%lld\n",res);continue ;}
res=-;
if(mn[n-x+][]!=inf&&mx[n-x][]) res=sum[n]-sum[n-x]-mn[n-x+][]+mx[n-x][];
if(mn[n-x+][]!=inf&&mx[n-x][]) res=max(res,sum[n]-sum[n-x]-mn[n-x+][]+mx[n-x][]);
printf("%lld\n",res);
}
}
最新文章
- ES6新特性:Javascript中内置的延迟对象Promise
- ASP.NET 小白从零开始建站简易教程 (一)域名、虚拟主机、FTP上传文件
- SAP Business One SAP B1功能概述
- C代码中如何调用C++ C++中如何调用C
- nginx下禁止访问robots.txt的设置方法
- 谈&ldquo;技术含量&rdquo;的问题
- expdp impdp中 exclude/include 的使用
- ubuntu多网卡绑定
- Jquery 遍历表单 AJAX提交
- Flash Activex NPAPI PPAPI 各种网页插件完整安装包下载地址
- HDOJ/HDU 1251 统计难题(字典树啥的~Map水过)
- The server quit without updating PID file (mysql.pid)一次意外mysql停止运行备忘录
- nginx上传模块nginx_upload_module使用
- JQuery5.04获取
- nginx版本如何选择?
- 将对象xml序列化和反序列化
- asp.net的Request.ServerVariables参数说明
- shell脚本简介
- Luogu5021 [NOIP2018]赛道修建
- hive安装详解