题目

分析:首先发现将大的数放在小的数前面结果更优,于是想到通过比较元素大小的方式将两个数组合并,大的放前面小的放后面,但很容易就能想到比这样合并更优的方案。一开始我是想先按这种方式进行合并,然后将最后未合并完的剩余数组元素向前推进插值,维护一个双端队列保存推进元素块的信息,借此更新答案,但写到一半想到了反例,又想了想感觉没有解决的办法,原因在于这种方式过于局部,很难顾及全局。如果要合并的两个数组原本就是单调不增序列那按照一开始的想法直接比较两数组元素大小进行合并就好了,这样最终答案是正确的。此时就可以开始乱想,如果想到平均值就好办了,通过类似单调栈的方式将原本数组划分为多个区块,满足区块的平均值单调不增,然后就可以按照一开始的想法合并数组了。然后我们大致证明一下可以感觉到这样最优的,即不存在交换两个元素使结果优于以这种方式合并数组的答案。

#include<cstdio>
#include<algorithm>
#define fi first
#define se second
using namespace std;
typedef long long ll;
const int N = 1e5 + 50; int T, n, m;
int a[N], b[N], c[N << 1], id[N << 1];
pair<ll, int> da[N], db[N]; int main(){
scanf("%d", &T);
for(int ca = 1; ca <= T; ++ca){
ll ans = 0;
int len_a = 0, len_b = 0, x = 1, y = 1, tot = 0, dx = 0, dy = 0;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i){
scanf("%d", &a[i]); da[++len_a] = {a[i], 1};
while(len_a > 1 && da[len_a].fi * da[len_a - 1].se > da[len_a - 1].fi * da[len_a].se){
--len_a;
da[len_a] = {da[len_a].fi + da[len_a + 1].fi, da[len_a].se + da[len_a + 1].se};
}
}
for(int i = 1; i <= m; ++i){
scanf("%d", &b[i]); db[++len_b] = {b[i], 1};
while(len_b > 1 && db[len_b].fi * db[len_b - 1].se > db[len_b - 1].fi * db[len_b].se){
--len_b;
db[len_b] = {db[len_b].fi + db[len_b + 1].fi, db[len_b].se + db[len_b + 1].se};
}
}
while(x <= len_a && y <= len_b){
if(da[x].fi * db[y].se < db[y].fi * da[x].se){
for(int i = 1; i <= db[y].se; ++i){
++tot;
ans += 1LL * b[dy + i] * tot;
}
dy += db[y++].se;
}
else{
for(int i = 1; i <= da[x].se; ++i){
++tot;
ans += 1LL * a[dx + i] * tot;
}
dx += da[x++].se;
}
}
while(x <= len_a){
for(int i = 1; i <= da[x].se; ++i){
++tot;
ans += 1LL * a[dx + i] * tot;
}
dx += da[x++].se;
}
while(y <= len_b){
for(int i = 1; i <= db[y].se; ++i){
++tot;
ans += 1LL * b[dy + i] * tot;
}
dy += db[y++].se;
}
printf("Case %d: %lld\n", ca, ans);
}
return 0;
}

2018CCPC桂林 A(贪心,思维)的更多相关文章

  1. Mike and distribution CodeForces - 798D (贪心+思维)

    题目链接 TAG: 这是我近期做过最棒的一道贪心思维题,不容易想到,想到就出乎意料. 题意:给定两个含有N个正整数的数组a和b,让你输出一个数字k ,要求k不大于n/2+1,并且输出k个整数,范围为1 ...

  2. Codeforces Round #546 (Div. 2) D 贪心 + 思维

    https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则, ...

  3. 贪心/思维题 Codeforces Round #310 (Div. 2) C. Case of Matryoshkas

    题目传送门 /* 题意:套娃娃,可以套一个单独的娃娃,或者把最后面的娃娃取出,最后使得0-1-2-...-(n-1),问最少要几步 贪心/思维题:娃娃的状态:取出+套上(2),套上(1), 已套上(0 ...

  4. 贪心/思维题 UVA 11292 The Dragon of Loowater

    题目传送门 /* 题意:n个头,m个士兵,问能否砍掉n个头 贪心/思维题:两个数组升序排序,用最弱的士兵砍掉当前的头 */ #include <cstdio> #include <c ...

  5. T - Posterized(贪心思维)

    Description Professor Ibrahim has prepared the final homework for his algorithm’s class. He asked hi ...

  6. 2018CCPC桂林站JStone Game

    题目描述 Alice and Bob are always playing game! The game today is about taking out stone from the stone ...

  7. 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 C.二元-K个二元组最小值和最大-优先队列+贪心(思维)

    链接:https://ac.nowcoder.com/acm/contest/558/C来源:牛客网 小猫在研究二元组. 小猫在研究最大值. 给定N个二元组(a1,b1),(a2,b2),…,(aN, ...

  8. 牛客练习赛38 E 出题人的数组 2018ccpc桂林A题 贪心

    https://ac.nowcoder.com/acm/contest/358/E 题意: 出题人有两个数组,A,B,请你把两个数组归并起来使得cost=∑i∗ci 最小,归并要求原数组的数的顺序在新 ...

  9. C. Coffee Break 贪心 思维 有点难 有意思

    C. Coffee Break 这个贪心之前好像写过,还是感觉挺难的,有点不会写. 这个题目大意是:给你一个数列n个元素,然后给你一天的时间,给你一个间隔时间d, 问你最少要用多少天可以把这个数列的所 ...

  10. hdu 4803 贪心/思维题

    http://acm.hdu.edu.cn/showproblem.php?pid=4803 话说C++还卡精度么?  G++  AC  C++ WA 我自己的贪心策略错了 -- 就是尽量下键,然后上 ...

随机推荐

  1. SpringBoot3集成ElasticSearch

    目录 一.简介 二.环境搭建 1.下载安装包 2.服务启动 三.工程搭建 1.工程结构 2.依赖管理 3.配置文件 四.基础用法 1.实体类 2.初始化索引 3.仓储接口 4.查询语法 五.参考源码 ...

  2. 请大家一定不要像我们公司这样打印log日志

    前言 最近接手了公司另一个项目,熟悉业务和代码苦不堪言. 我接手一个新项目,有个习惯,就是看结构,看数据库,搜代码. 其中搜代码是我个人这些年不知不觉形成的癖好,我下面给大家展示下这个小癖好. 正文 ...

  3. 后浪搞的在线版 Windows 12「GitHub 热点速览」

    本周比较火的莫过于 3 位初中生开源的 Windows 12 网页版,虽然项目完成度不如在线版的 Windows 11,但是不妨一看.除了后生可畏的 win12 之外,开源不到一周的 open-int ...

  4. 使用C#发送邮件支持 Implicit SSL

    安装Package: Install-Package AIM 使用下面的代码发送: class Mail { private static string mailAddress = "{yo ...

  5. Field 'xxxxxx' doesn't have a default value 错误的解决办法

    在写web项目的时候,出现 Field 'xxxxx' doesn't have a default value 这个错误,直接找到你的数据库,然后打开设计表,看下面自增递增是否勾选上了,如果没有勾上 ...

  6. 为什么大家都在用 WebP?

    WebP 是谷歌在 2010 年提出的一种新型的图片格式,放到现在来讲,已经不算是"新"技术了,毕竟已经有了更新的 JPEG XL 和 AVIF .但是在日常工作中,大家时常会碰到 ...

  7. 【NET 7.0、OpenGL ES】使用Silk.NET渲染MMD,并实时进行物理模拟。

    有关mmd播放器,网上也有许多非常漂亮的实现,如 pmxeditor.saba.blender_mmd_tools等等.. 首先我想先介绍下我参考实现的仓库: sselecirPyM/Coocoo3D ...

  8. 【网络爬虫笔记】爬虫Robots协议语法详解

    Robots协议是指一个被称为Robots Exclusion Protocol的协议.该协议的主要功能是向网络蜘蛛.机器人等搜索引擎爬虫提供一个标准的访问控制机制,告诉它们哪些页面可以被抓取,哪些页 ...

  9. Django框架——forms组件、cookie与session

    文章目录 1 forms 组件 1 校验字段功能 2 渲染标签功能 渲染方式1 渲染方式2 渲染方式3 3 渲染错误信息功能 视图 模板 4 组件的参数配置 5 局部钩子 6 全局钩子 2 cooki ...

  10. Informix 4gl错误代码信息和更正

    (一)Informix信息和更正 出版日期:6 1996 年 年 1 11 月 0 成功. 操作成功.当 SQL 语句成功地执行时,数据库服务器把这个 SQLCODE 值返回给应用程序. 100 没有 ...