题目

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

#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. PoW是什么?

    PoW是什么? 工作量证明(proof of work,PoW)是一种用于确认和验证区块链交易和新区块有效性的共识算法.区块链中常见的工作量证明算法包括比特币的SHA-256.以太坊的Ethash.莱 ...

  2. css美化

    编辑网页文本 span标签:能让某几个字凸显出来结构:span{color:red:}    <span>123<span> 字体样式:一般设置两个字体.如果浏览器第一个字体不 ...

  3. 头疼!卷积神经网络是什么?CNN结构、训练与优化一文全解

    本文全面探讨了卷积神经网络CNN,深入分析了背景和重要性.定义与层次介绍.训练与优化,详细分析了其卷积层.激活函数.池化层.归一化层,最后列出其训练与优化的多项关键技术:训练集准备与增强.损失函数.优 ...

  4. ipmitool配置机器的BMC

    一.设置IP地址 1.确定操作对象 #ipmitool mc info 输出中"Device Revision"是命令的操作对象 2.设置BMC IP # ipmitool -I ...

  5. 简化车辆登记流程:利用腾讯云OCR实现自动化信息识别

      项目中有一块,需要用到上传车牌车牌号到系统里,用了下腾讯云的ocr车牌号识别做了个小功能.通过腾讯云的orc识别,将车牌号录入到后台. 一,首先我们需要登录到腾讯云,然后搜索一下orc或者车牌号 ...

  6. 分库表数据倾斜的处理让我联想到了AKF模型

    1 背景 最近在做需求的时候需要在一张表中增加一个字段. 这张表情况如下: 1.拆分了多个库多张表 2.库表拆分按表中商户编码字段hash之后取模进行拆分 由于库表拆分按照商户编码,有些大商家的单子数 ...

  7. SQL语句简单入门

    SQL语句速查 创建部门表 deptno dname location 1 技术部 23楼 create table dept --dept部门 ( deptno int primary key, - ...

  8. Falcon-7B大型语言模型在心理健康对话数据集上使用QLoRA进行微调

      文本是参考文献[1]的中文翻译,主要讲解了Falcon-7B大型语言模型在心理健康对话数据集上使用QLoRA进行微调的过程.项目GitHub链接为https://github.com/iamaru ...

  9. 慢SQL原因分析之索引失效

    现象 最近收到一个慢sql工单,慢sql大概是这样:"select xxx from tabel where type = 1". 咦,type字段明明有索引啊,为啥是慢sql呢? ...

  10. SYN泛洪攻击详解

    SYN攻击利用的是TCP的三次握手机制,攻击端利用伪造的IP地址向被攻击端发出请求,而被攻击端发出的响应 报文将永远发送不到目的地,那么被攻击端在等待关闭这个连接的过程中消耗了资源,如果有成千上万的这 ...